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

Есть ли какой-либо эквивалент портов IO COMpletion в Mac OS X для реализации асинхронного ввода-вывода в файлах....

Спасибо....


person anonymos    schedule 09.06.2011    source источник


Ответы (3)


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

person Pablo Castellazzi    schedule 09.06.2011
comment
libevent использует функцию Windows select(). Эта функция в основном игрушка. Он работает только с сокетами, а не с файловыми дескрипторами вообще, и не может использовать более 64 сокетов. При обслуживании всего 64 клиентов вы также можете использовать потоки и блокировку ввода-вывода. - person Sturla Molden; 26.03.2014

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

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

Можно реализовать IOCP с помощью 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 должен быть реструктурирован для использования своих IOCP и, скорее всего, будет менее производительным.

person Sturla Molden    schedule 16.02.2014

Использовать очередь

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

person JosephH    schedule 09.06.2011
comment
спасибо .. Любые указатели на пример кода о том, как использовать его для получения уведомления о завершении асинхронного ввода-вывода.... - person anonymos; 09.06.2011
comment
kqueue сигнализирует, когда дескриптор файла готов, подобно опросу и выбору (и epoll в Linux). IOCP сигнализируют о завершении операции ввода-вывода в очереди. Таким образом, сигнал находится на противоположном конце ввода/вывода. В MacOSX, FreeBSD и iOS эквивалентом Windows IOCP являются функции ввода-вывода в GCD. Но под капотом они используют kqueue и глобальный пул потоков. - person Sturla Molden; 03.01.2015