Порты завершения ввода-вывода для Mac OS X

#asynchronous #io-completion-ports

#асинхронный #порты завершения ввода-вывода

Вопрос:

Существует ли какой-либо эквивалент портов завершения ввода-вывода в Mac OS X для реализации асинхронного ввода-вывода в файлах….

Спасибо….

Ответ №1:

К сожалению, нет.

kqueue — это механизм для высокопроизводительного асинхронного ввода-вывода в OSX и FreeBSD. Как и в Linux epoll, он подает сигналы на противоположном конце ввода-вывода по сравнению с IOCPs (Solaris, AIX, Windows). kqueue и epoll будут сигнализировать, когда можно попытаться выполнить чтение или запись, тогда как IOCPs выполнит обратный вызов, когда чтение или запись завершены. Многие считают механизм сигнализации, используемый epoll и kqueue, сложным для понимания по сравнению с моделью IOCP. Таким образом, хотя kqueue и IOCP являются механизмами для высокопроизводительного асинхронного ввода-вывода, они несопоставимы.

Можно реализовать IOCPs с использованием epoll или kqueue и пула потоков. Вы можете найти пример этого в проекте Wine.

Исправление:

Mac OS X имеет реализацию функций, подобных IOCP, в Grand Central Dispatch.Он использует пул потоков GCD и API-интерфейсы kqueue внутри. Функциями удобства являются dispatch_read и dispatch_write . Подобно IOCP, функции асинхронного ввода-вывода в GCD сигнализируют о завершении задачи ввода-вывода, а не когда дескриптор файла готов, как в необработанном API kqueue.

Имейте в виду, что API GCD не являются «безопасными для разветвления» и не могут использоваться на обеих сторонах POSIX fork без exec . Если вы это сделаете, вызов функции никогда не вернется.

Также имейте в виду, что kqueue в Mac OS X, по слухам, менее производителен, чем kqueue во FreeBSD, так что это может быть лучше для разработки, чем для производства. Однако GCD (libdispatch) имеет открытый исходный код и может использоваться и на других платформах.

Обновление от 3 января 2015:

Во FreeBSD установлен GCD начиная с версии 8.1. В Wine установлен IOCP на базе epoll для Linux. Следовательно, можно использовать дизайн IOCP для написания серверного кода, который должен выполняться на Windows, Linux, Solaris, AIX, FreeBSD, MacOSX (и iOS, но не Android). Это отличается от прямого использования kqueue и epoll, где сервер Windows должен быть реструктурирован для использования своих IOCPs и, скорее всего, будет менее производительным.

Ответ №2:

Поскольку вы запросили специфичную для Windows функцию для OS X, вместо прямого использования kqueue вы можете попробовать libevent. Это тонкая оболочка для различных механизмов AIO, и она работает на обеих платформах.

Комментарии:

1. libevent использует функцию Windows select(). Эта функция, по сути, игрушка. Это работает только для сокетов, а не для файловых дескрипторов в целом, и не может использовать более 64 сокетов. При обслуживании всего 64 клиентов вы также можете использовать потоки и блокирующий ввод-вывод.

Ответ №3:

Используйте Kqueue

http://en.wikipedia.org/wiki/Kqueue

Комментарии:

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

2. kqueue сигнализирует о готовности файлового дескриптора, аналогично опросам и выбору (и epoll в Linux). IOCPs сигнализируют о завершении соответствующей операции ввода-вывода. Таким образом, сигнал находится на противоположном конце ввода-вывода. В MacOSX, FreeBSD и iOS эквивалентом Windows IOCP являются функции ввода-вывода в GCD. Но они используют kqueue и глобальный пул потоков под капотом.