select和epoll

今天看了下select和epoll。

先搞清楚两个概念:阻塞和非阻塞。
阻塞是直到事件发生才会继续执行,
非阻塞是可以设定时间,如果在规定时间内事件发生了,则执行。 如果超出时间了也会继续执行。

如果是阻塞模式:

while true {                     
    for i in stream[]; {                  
        if i has data                       
            read until unavailable                         
        }                       
}                  

select 轮询机制
调用select()将阻塞,直到指定的文件描述符准备好执行I/O,或者可选参数timeout指定的时间已经过去

while true {                             
    select(streams[])                                        
        for i in streams[] {           
            if i has data                    
                read until unavailable              
        }                    
}            

缺点是:传统的select/poll另一个致命弱点就是当你拥有一个很大的socket集合,不过由于网络延时,任一时间只有部分的socket是"活跃"的,但是select/poll每次调用都会线性扫描全部的集合,导致效率呈现线性下降。
但是epoll不存在这个问题,它只会对"活跃"的socket进行操作—这是因为在内核实现中epoll是根据每个fd上面的callback函数实现的。那么,只有"活跃"的socket才会主动的去调用 callback函数,其他idle状态socket则不会。

你可能感兴趣的:(select和epoll)