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

时间:2017-07-14 08:18:03

标签: linux io busy-waiting

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

问题:

无论传递timeout个参数,

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

1 个答案:

答案 0 :(得分:2)

不应该;如果没有可立即使用的FD,任何体面的操作系统(包括Linux,Windows等)都将暂停该过程。发生的CPU和下一个FD可用之间的CPU周期可供系统中的其他线程/进程和/或系统空闲循环使用。通常,操作系统被安排为事件驱动系统,因此不需要重复检查选择中的变化:(例如,数据可用于读取)将导致所有活动选择被通知为此 - 效果。

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

请注意,您必须在每次成功返回时清除所有未完成的可用FD,因为如果不是,您将在没有充分理由的情况下承担系统调用开销,并且还会冒“饥饿”的风险。

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