select() 是忙等待系统调用吗?

Is select() a busy wait system call?

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

问题:

不考虑传递的 timeout 参数,

是否 select() 占用 CPU 个周期,直到任何文件描述符准备就绪?

不应该;如果没有立即可用的 FD,任何体面的 OS(包括 Linux、Windows 等)都将暂停进程。 CPU 发生和下一个可用 FD 之间的周期可供系统中的其他 threads/processes 使用,and/or 系统空闲循环。通常,OS被安排为一个事件驱动系统,因此不需要重复检查select中的变化:原因(例如数据可读)将导致所有活动select被告知这是一种副作用。

但是,请注意 select() 通常是实际实现的 C 库包装函数。

请注意,您必须在每次成功 return 时清除所有未完成的可用 FD,因为否则您将无缘无故地承担系统调用开销,并且还有风险 'starvation' .

可能导致忙等待行为的原因是将超时设置为接近零的值然后循环。我在某些情况下看到过这样做,因为程序员认为他们需要检查一些作为 FD

不可见的东西