Подтвердить что ты не робот

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

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

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

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

Ответ 1

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

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

В Win32 операции async используют структуру OVERLAPPED, чтобы содержать состояние о выдающейся операции ввода-вывода.

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

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

Ответ 2

libuv

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

Подробнее см.: http://nikhilm.github.io/uvbook/introduction.html

Ответ 3

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

Существующие препятствия:

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

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

http://sourceforge.net/projects/cpoll

Ответ 4

Функция

select() является POSIX и может использоваться в окнах, включая "winsock.h" или "winsock2.h".