今天看了下select和epoll。网络
先搞清楚两个概念:阻塞和非阻塞。
阻塞是直到事件发生才会继续执行,
非阻塞是能够设定时间,若是在规定时间内事件发生了,则执行。 若是超出时间了也会继续执行。socket
若是是阻塞模式:
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则不会。事件