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