Select() занят системным вызовом ожидания?

int select(int nfds, fd_set *readfds, fd_set *writefds,
                  fd_set *exceptfds, struct timeval *timeout);

Вопрос:

Независимо от timeout аргумент пройден,

Есть ли select() занимают циклы процессора, пока какой-либо файловый дескриптор не будет готов?

1 ответ

Решение

Так не должно быть; любая приличная ОС (включая Linux, Windows и другие) будет приостанавливать процесс, если сразу не появятся FD. Циклы ЦП между этим событием и следующим доступным FD доступны для использования другими потоками / процессами в системе и / или циклом ожидания системы. Обычно ОС организована как система, управляемая событиями, поэтому нет необходимости повторно проверять изменения в выборе: причина (например, данные, доступные для чтения) приведут к тому, что все активные выборщики будут проинформированы об этом как побочные. эффект.

Однако следует помнить, что select() обычно является функцией-оболочкой C-библиотеки для фактической реализации.

Помните, что вы должны очищать все оставшиеся доступные FD при каждом успешном возврате, потому что в противном случае вы будете вынуждены нести системные вызовы без веских на то оснований и дополнительно рисковать "голоданием".

Что может вызвать поведение "занято-ожидание", так это установить для тайм-аута значение, близкое к нулю, и затем выполнить цикл. Я видел, как это делалось в некоторых случаях, потому что программист думал, что им нужно проверить что-то невидимое как FD

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