日期:2014-05-16  浏览次数:20822 次

select()既然是轮询,为什么不占用很多cpu呢?
处理完了一个fd的请求以后,select再次不断轮询整个数组。
但是我发现,没有fd有IO操作的时候,select并不会占用cpu到100%,而是出于阻塞的状态。
问题是,

(1)当某个fd发生IO操作的时候,操作系统既然已经知道了是哪个fd发生动作,为什么select还要从头到尾扫一遍,不像epoll那样哪个fd有动作,触发哪个回调?

(2)这是select函数本身实现的时候的缺陷吗? 还是说,select函数这样实现,有别的考虑/需求,尽管轮询的效率不高,但是有别的场合下,epoll不能做到的事情,select能做到?

(3)Posix标准有没有规定select怎么实现? 操作系统直接告诉select函数哪个fd发生动作不就行了,干嘛还要麻烦select函数自己去扫描一遍?

------解决方案--------------------
select不是轮询。只是有数据时,会依次处理有数据的fd。没有数据的fd不被处理
------解决方案--------------------
select不是轮询吧?
应该是wait,notify类似的机制吧
事实上我不知道select有没有遍历数组,但是遍历数组不是轮询,不是那么耗时的事情。

while XXX:
sleep #甚至没有这个sleep
XXX = xxxxxxx
这样才叫耗时耗cpu的轮询吧?


------解决方案--------------------
select 应该属于选择吧