当前位置: 技术问答>linux和unix
select()既然是轮询,为什么不占用很多cpu呢?
来源: 互联网 发布时间:2017-02-05
本文导语: 处理完了一个fd的请求以后,select再次不断轮询整个数组。 但是我发现,没有fd有IO操作的时候,select并不会占用cpu到100%,而是出于阻塞的状态。 问题是, (1)当某个fd发生IO操作的时候,操作系统既然已经知道了是哪...
处理完了一个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函数自己去扫描一遍?
但是我发现,没有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的轮询吧?
应该是wait,notify类似的机制吧
事实上我不知道select有没有遍历数组,但是遍历数组不是轮询,不是那么耗时的事情。
while XXX:
sleep #甚至没有这个sleep
XXX = xxxxxxx
这样才叫耗时耗cpu的轮询吧?
|
select 应该属于选择吧
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。