Каков наилучший вариант epoll / kqueue / select в Windows? - PullRequest
35 голосов
/ 16 сентября 2008

Что является лучшим средством уведомления о событиях ввода / вывода в Windows?

Под лучшим я имею в виду то, что ...

  1. не имеет ограничений на количество дескрипторов входных файлов
  2. работает со всеми файловыми дескрипторами (дисковые файлы, сокеты, ...)
  3. предоставляет различные режимы уведомлений (срабатывают границы, срабатывают ограничения)

Ответы [ 4 ]

38 голосов
/ 16 сентября 2008

В Windows асинхронные операции выполняются с помощью файловой операции, а не с помощью дескриптора. Существует несколько способов ожидания асинхронного завершения файловых операций.

Например, если вы хотите узнать, когда данные доступны в сетевом сокете, выполните запрос асинхронного чтения для сокета, и после его завершения данные были доступны и были получены.

В Win32 асинхронные операции используют структуру OVERLAPPED для хранения состояния о невыполненной операции ввода-вывода.

  1. Свяжите файлы с Портом завершения ввода-вывода и отправьте асинхронные запросы ввода-вывода. Когда операция завершается, она помещает сообщение о завершении в очередь, которую ваши рабочие потоки могут ожидать и получать по мере их поступления. Вы также можете поместить определенные пользователем сообщения в очередь. Нет ограничений на количество файлов или сообщений в очереди, которые можно использовать с портом завершения
  2. Отправка каждой операции ввода-вывода с событием. Событие, связанное с операцией, станет сигнальным (удовлетворяющим ожидание) после его завершения. Используйте WaitForMultipleObjects, чтобы дождаться всех событий одновременно. Это имеет тот недостаток, что можно ожидать только MAXIMUM_WAIT_OBJECTS объектов одновременно (64). Вы также можете одновременно ожидать другие типы событий (завершение процесса / потока, мьютексы, события, семафоры)
  3. Использовать пул потоков . Пул потоков может принимать неограниченное количество объектов и файловых операций для ожидания и выполнения определяемой пользователем функции по завершении каждого.
  4. Используйте <a href="http://msdn.microsoft.com/en-us/library/aa365468(VS.85).aspx" rel="nofollow noreferrer">ReadFileEx</a> и WriteFileEx для постановки в очередь Асинхронные вызовы процедур (APC) для вызывающего потока и SleepEx (или WaitFor{Single|Multiple}ObjectsEx ) с помощью Alertable TRUE для получения уведомления о каждой операции после ее завершения. Этот метод похож на порт завершения ввода-вывода, но работает только для одного потока.

Ядро Windows NT не делает различий между внутренними операциями с сокетом, дисковым файлом, каналом и т. Д.: Все эти параметры будут работать со всеми типами файлов.

4 голосов
/ 16 апреля 2013

libuv

libuv предлагает четные операции ввода-вывода для Unix и Windows и поддерживает сокеты, файлы и каналы. Это уровень платформы Node.js.

Более подробная информация по адресу: http://nikhilm.github.io/uvbook/introduction.html

0 голосов
/ 02 августа 2012

Функция select () является POSIX и может использоваться в Windows, включая «winsock.h» или «winsock2.h».

0 голосов
/ 16 сентября 2008

Насколько я знаю, пока нет ни одного. Мы с другом работаем над реализацией epoll для Windows с открытым исходным кодом (ссылка ниже), но сталкиваемся с проблемами, выясняющими, как заставить его работать так же, как и в реализации Linux.

Текущие препятствия:

  • В Linux дескрипторы файлов и дескрипторы сокетов являются взаимозаменяемыми, а в Windows - нет. Оба должны быть совместимы с реализацией epoll.
  • В Windows довольно сложно получить события ядра ... именно так работает epoll в Linux. Мы предполагаем, что программа, использующая нашу кроссплатформенную библиотеку epoll, будет работать заметно медленнее в Windows, чем в Linux.

Я постараюсь вернуться и обновить этот пост по мере продвижения проекта.

http://sourceforge.net/projects/cpoll

...