Как реализуется программирование, управляемое событиями?

Я изучал, как работают фреймворки Twisted и Node.js, и я пытаюсь понять, как именно операционная система поддерживает операции ввода-вывода с использованием обратных вызовов.

Я понимаю, что это хорошо, потому что нам нужно меньше потоков, потому что нам не нужно блокировать потоки, ожидающие операций ввода-вывода. Но что-то должно вызвать обратный вызов после завершения ввода-вывода.

Как это реализовано в операционной системе?


person simao    schedule 28.10.2010    source источник


Ответы (2)


Один из подходов заключается в том, чтобы ОС прикрепляла информацию о всех, кто ожидает обратного вызова, к соответствующей структуре данных, например, к эквиваленту в ядре файлового дескриптора, для которого вы ожидаете уведомления о прочтении. Когда что-то происходит с этим файловым дескриптором, ОС сканирует ожидающих, чтобы узнать, нужно ли их уведомлять. Если они должны, то это так. Вы можете прочитать об одной реализации этого в документе Лемона, посвященном механизму kqueue FreeBSD. См., в частности, раздел 6 «Реализация», подразделы 3 и 4 «Действия в источнике события» и «Доставка».

person Jeremy W. Sherman    schedule 28.10.2010

В ОС это решается с помощью «средств/интерфейсов уведомления о событиях ввода-вывода», например epoll, опрос, kqueue или выберите.

Взгляните на deft и особенно на его io/event loop для конкретного примера использования упомянутых выше "систем уведомлений". (java.nio. channels.Selector — это способ java nio предоставить абстракцию для этого.)

отказ от ответственности: я ловкий коммиттер

person Schildmeijer    schedule 28.10.2010