Как мне использовать kevent и выбрать?

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

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

  2. Предположим, что 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 и новее.

Другие вопросы по тегам