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