Как реализуется программирование на основе событий? - PullRequest
6 голосов
/ 29 октября 2010

Я смотрел на то, как работают структуры twisted и node.js, и я пытаясь понять, как именно операционная система поддерживает ввод / вывод операции с использованием обратных вызовов.

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

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

Ответы [ 2 ]

5 голосов
/ 29 октября 2010

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

3 голосов
/ 29 октября 2010

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

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

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

...