Системный вызов select
поддерживается почти во всех Unix-системах и предоставляет средства для пользовательских приложений, чтобы отслеживать группу дескрипторов и получать информацию о том, какое подмножество этой группы готово для чтения / записи. Его конкретный интерфейс немного неуклюж, и реализация в большинстве ядер в лучшем случае посредственная.
epoll
предоставляется только в Linux для той же цели, но это огромное улучшение по сравнению с select
с точки зрения эффективности и интерфейса программирования. Другие Unix'ы тоже имеют свои специализированные вызовы.
Тем не менее, управляемые событиями системные вызовы ввода-вывода не требуют ни блокирующих, ни неблокирующих дескрипторов. Блокировка - это поведение, которое влияет на системные вызовы, такие как read
, write
, accept
и connect
. select
и epoll_wait
имеют таймауты блокировки, но это не относится к дескрипторам.
Конечно, использование этих управляемых событиями системных вызовов с блокирующими дескрипторами немного странно, потому что вы ожидаете, что сможете сразу же прочитать данные без блокировки после того, как вы получите уведомление о том, что они доступны. Всегда полагать, что блокирующий дескриптор не будет блокироваться после того, как вы получили уведомление о его готовности, немного рискованно, потому что возможны условия гонки.
Неблокирующая, управляемая событиями IO может сделать серверные приложения значительно более эффективными, потому что потоки не нужны для каждого дескриптора (соединения). Сравните производительность веб-сервера Apache с Nginx или Lighttpd, и вы увидите преимущество.