int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
问题:
不管通过什么timeout
论据,
是否select()
占用 CPU 周期,直到任何文件描述符准备好?
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
问题:
不管通过什么timeout
论据,
是否select()
占用 CPU 周期,直到任何文件描述符准备好?
不应该;如果没有立即可用的 FD,任何体面的操作系统(包括 Linux、Windows 等)都将暂停该过程。发生这种情况和下一个可用 FD 之间的 CPU 周期可供系统中的其他线程/进程和/或系统空闲循环使用。通常,操作系统被安排为事件驱动系统,因此无需重复检查选择中的更改:原因(例如,数据可供读取)将导致所有活动选择都被告知这一点 -影响。
但是,请注意 select() 通常是实际实现的 C 库包装函数。
请注意,您必须在每次成功返回时清除所有未完成的可用 FD,因为如果不这样做,您将在没有充分理由的情况下产生系统调用开销,并且还有“饥饿”的风险。
可能导致忙等待行为的原因是将超时设置为接近零的值,然后循环。我在某些情况下看到这样做是因为程序员认为他们需要检查一些不可见的 FD