ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

select poll epoll

2022-02-09 10:33:55  阅读:159  来源: 互联网

标签:epoll int FD fd poll select


select、poll、epoll都是IO多路复用的机制,但是他们的机制有很大的区别

1、select 
select机制刚开始的时候,需要把fd_set从用户空间拷贝到内核空间,并且检测的fd数是有限制的,由FD_SETSIZE设置,一般是1024。

检测的时候,根据timeout,遍历fd_set表,把活跃的fd(可读写或者错误),拷贝到用户空间,

再在用户空间依次处理相关的fd。

这个机制是linux内核很早的版本,epoll是根据select,poll基础上优化的,缺点比较多。

缺点:

1)每次调用select的时候需要把fd_set从用户空间拷贝到内存空间,比较耗性能。

2)wait时,需要遍历所有的fd,消耗比较大。

3)select支持的文件数大小了,默认只有1024,如果需要增大,得修改宏FD_SETSIZE值,并编译内核(麻烦,并且fd_set中的文件数多的话,每次遍历的成本就很大)。

2. poll
poll的实现和select非常相似,只是描述fd集合的方式不同,poll使用pollfd结构而不是select的fd_set结构,其他的都差不多。

3. epoll
epoll是select和poll的改进版本,

* 先是使用int epoll_create(int size)在内存中创建一个指定size大小的事件空间,

* 再使用int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);事件注册函数,注册新的fd到epfd的epoll对象空间中,并指明event(可读写啊等等),注意:在注册新事件fd的过程中,也再内核中断处理程序里注册fd对应的回调函数callback,告诉内核,一旦这个fd中断了,就把它放到ready队列里面去。

* 再使用int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);在epool对象对应的ready队列里取就绪的fd,并使用内存映射mmap拷贝到用户空间。

* 再在用户空间依次处理相关的fd。

优点:
1)支持一个进程打开大数目的socket描述符

select 一个进程打开FD是有限制的,由FD_SETSIZE设置,默认值是1024。epoll可以打开的FD数可以很大,一般1GB的内存有10万多的FD数,具体数目可以cat /proc/sys/fs/file-max查看。
2) IO效率不随FD数目增加而线性下降

3) 使用mmap加速内核与用户空间的消息传递

(1)select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而epoll其实也需要调用epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪时,调用回调函数,把就绪fd放入就绪链表中,并唤醒在epoll_wait中进入睡眠的进程。虽然都要睡眠和交替,但是select和poll在“醒着”的时候要遍历整个fd集合,而epoll在“醒着”的时候只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间。这就是回调机制带来的性能提升。

(2)select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把current往设备等待队列中挂一次,而epoll只要一次拷贝,而且把current往等待队列上挂也只挂一次(在epoll_wait的开始,注意这里的等待队列并不是设备等待队列,只是一个epoll内部定义的等待队列)。这也能节省不少的开销。

标签:epoll,int,FD,fd,poll,select
来源: https://www.cnblogs.com/malnut0311/p/15872138.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有