关于epoll,select,poll的理解

select: 轮询+fd_set

1.采用fd_set存储fd(fd_set通过数组位图实现)

2.每次调用select,都需要把fd集合从用户态拷贝到内核态,fd越多开销越大

3.每次调用select,都需要在内核遍历传递进来的fd,开销大(轮询)

4.select支持的fd数量太少,1024

5.调用select,返回的是含有整个句柄的数组,需要遍历整个数组才知道哪些句柄发生了事件(轮询)

6.select的触发是LT模式,效率不高


poll:轮询+链表

1.采用链表存储fd,没有了fd数量限制,但是上述其他缺点依然存在


epoll:红黑树+双链表+回调机制

1.红黑树挂载事件,事件发生时通过回调机制将事件添加到双链表中

2.检查是否有事件发生时,不需要轮询,只需要检查双链表即可

3.保证每个fd只会被拷贝一次(事件被加入到epoll中时,fd就会被拷贝进入内核,而不是在epoll_wait时拷贝)

4.fd数量上限为最大可以打开的文件数目

该双链表我们一般叫做就绪事件链表


//先码着,后面准备自己实现一下这三种机制



猜你喜欢

转载自www.cnblogs.com/yinbiao/p/10945624.html