Как мне использовать kevent и выбрать?
Файловый дескриптор kevent, возвращаемый kqueue (), можно использовать в качестве входных данных для select () или kevent ().
Каковы преимущества использования этого метода?
Предположим, что kevent ожидает в списке дескрипторов с помощью kevent (), и в этом списке есть некоторые действия. Будет ли установлен файловый дескриптор kevent, читаемый с помощью select () или kevent ()?
1 ответ
Для OSX/BSD - kevent - это решение для масштабируемости bsd/osx, которое соответствует модели окна завершения ввода / вывода windows или модели epoll linux.
Привыкнув к нему, я думаю, что он мне нравится больше, чем другие модели, для простоты и гибкости; хотя API немного грубоват.
Основным преимуществом этого выбора является масштаб. select() требует много хитростей и / или хаков для эффективной настройки и разрушения при использовании с большим количеством файловых дескрипторов, а количество файловых дескрипторов часто ограничено. poll() снимает ограничение на количество дескрипторов файлов, но все еще имеет проблемы с настройкой / разбором; и недоступен изначально в OSX.
Я хочу привести аргумент в пользу улучшения переключения контекста. Это верно для Windows IOCP, особенно если используются новые API-интерфейсы Vista и пулы потоков ОС. Я верю, что это верно для OSX, но мне было бы трудно привести абсолютные примеры.
Для гибкости, приятно, что ручки могут быть легко зарегистрированы и удалены из kqueues. Но это удобство. С kevent действительно приятно то, что он может ассоциироваться с вещами, которые не являются файловыми дескрипторами. Я предпочитаю это решению epoll, где все должно быть дескриптором файла - да, это мантра Unix - но все же некоторые вещи пришлось взломать, чтобы работать с epoll.
Необязательность kevents для файловых дескрипторов позволяет вам специально контролировать чтение, запись, изменение атрибутов, удаление, переименование файлов. Процессы выхода, вилки, сигналы. события на порту Mach (не на BSD). Таймеры и пользовательские события.
Действительно удобно иметь возможность обрабатывать все эти виды событий из одного API, работающего в нескольких потоках, используя обработчики обратного вызова.
Так что это был очень длинный ответ на вопрос (1).
Что касается (2); Я не уверен, что понимаю. Я полагаю, что одна "активация триггера" вызовет kevent и отключит его, если дескриптор файла будет ожидающим в обоих.
Одно предупреждение, которое становится все менее и менее актуальным. Kevent на OSX 10.5.x менее надежен. Некоторые из ожидаемых событий просто не поддерживаются, и есть некоторые ошибки или, возможно, ошибки, так как документация о поведении расплывчата. Например... закрытие сокета / дескриптора во время ожидания его на кевенте может не вызвать кевент в некоторых случаях. Из того, что я видел, kevent - основополагающая технология OSX для Grand Central Dispatch, и она действительно была улучшена в 10.6 и новее.