it-swarm-ru.tech

Каков наилучший вариант epoll/kqueue/select в Windows?

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

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

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

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

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

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

  1. Свяжите файлы с IO Портом завершения и отправьте асинхронные IO запросы. Когда операция завершается, она помещает сообщение о завершении в очередь, которую ваши рабочие потоки могут ожидать и получать по мере их поступления. Вы также можете поместить определенные пользователем сообщения в очередь. Нет ограничений на количество файлов или сообщений в очереди, которые можно использовать с портом завершения
  2. Отправляйте каждую операцию IO с событием. Событие, связанное с операцией, станет сигнальным (удовлетворяющим ожидание) после его завершения. Используйте WaitForMultipleObjects чтобы дождаться всех событий одновременно. Это имеет тот недостаток, что можно ожидать только одного объекта MAXIMUM_WAIT_OBJECTS сразу (64). Вы также можете одновременно ожидать другие типы событий (завершение процесса/потока, мьютексы, события, семафоры).
  3. Используйте пул потоков . Пул потоков может принимать неограниченное количество объектов и файловых операций для ожидания и выполнения определенной пользователем функции по завершении каждого.
  4. Используйте ReadFileEx и WriteFileEx для постановки в очередь Асинхронные вызовы процедур (APC) для вызывающего потока и SleepEx (или WaitFor{Single|Multiple}ObjectsEx) с Alertable TRUE для получения уведомления о каждой операции после ее завершения. Этот метод похож на порт завершения IO, но работает только для одного потока .

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

37
Chris Smith

libuv

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

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

3
schlamar

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

0
Nouil

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

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

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

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

http://sourceforge.net/projects/cpoll

0
Heron