как мне использовать kevent и выбрать? - PullRequest
0 голосов
/ 28 июня 2011

Файловый дескриптор kevent, возвращаемый kqueue (), может использоваться как вход для select () или kevent ().

  1. Каковы преимущества использования этого метода?

  2. Предположим, что kevent ожидает в списке дескрипторов с помощью kevent (), и в этом списке есть некоторые действия. Будет ли установлен файловый дескриптор kevent, доступный для чтения с помощью select () или kevent ()?

1 Ответ

1 голос
/ 05 марта 2012

Для OSX / BSD - kevent - это решение для масштабируемости bsd / osx, которое соответствует модели Windows I / O Completion Port или linux epoll.

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

Основным преимуществом этого выбора является масштаб. select () требует много хитростей и / или хаков для эффективной настройки и разрушения при использовании с большим количеством файловых дескрипторов, а количество файловых дескрипторов часто ограничено. poll () снимает ограничение на количество дескрипторов файлов, но все еще имеет проблемы с настройкой / разбором; и недоступно в OSX.

Я хочу привести аргумент в пользу улучшения переключения контекста. Это верно для Windows IOCP, особенно если используются новые API-интерфейсы Vista и пулы потоков ОС. Я верю, что это верно для OSX, но мне было бы трудно привести абсолютные примеры.

Для гибкости, приятно, что ручки могут быть легко зарегистрированы и удалены из kqueues. Но это удобство. С kevent действительно приятно то, что он может ассоциироваться с вещами, которые не являются файловыми дескрипторами. Я предпочитаю это решению epoll, где все должно быть дескриптором файла - да, это мантра Unix - но все же некоторые вещи пришлось взломать, чтобы работать с epoll.

исключение необходимости в дескрипторах файлов позволяет специально контролировать чтение, запись, изменение атрибутов, удаление, переименование файлов. Процессы выхода, вилки, сигналы. события на порту Mach (не на BSD). Таймеры и пользовательские события.

Действительно удобно иметь возможность обрабатывать все эти виды событий из одного API, работающего в нескольких потоках, с использованием обработчиков обратного вызова.

Так что это был очень длинный ответ на (1).

Что касается (2); Я не уверен, что понимаю. Я полагаю, что одна «активация триггера» вызовет kevent и отключит его, если дескриптор файла будет ожидающим в обоих.

Одно предупреждение, которое становится все менее и менее актуальным. Kevent на OSX 10.5.x менее надежен. Некоторые из ожидаемых событий просто не поддерживаются, и есть некоторые ошибки или, возможно, ошибки, так как документация о поведении расплывчата. Например, закрытие сокета / дескриптора в ожидании его на кевенте может не вызвать кевент в некоторых случаях. Из того, что я видел, kevent - основополагающая технология OSX для Grand Central Dispatch, и она действительно была улучшена в 10.6 и новее.

...