Для 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 и новее.