select和epoll原理和区别
对于select和poll,其主要原理跟epoll不同
poll和select的共同点就是,对全部指定设备(fd)都做一次poll,当然这往往都是还没有就绪的,那就会通过回调函数把当前进程注册到设备的等待队列,如果所有设备返回的掩码都没有显示任何的事件触发,就去回调函数的函数指针,进入有限时的睡眠状态,再恢复和不断做poll,再作有限时的睡眠,直到其中一个设备有事件触发为止。
总结:首先遍历所有监控的FD,对每个fd进行poll操作,所谓的poll操作包括把当前current进程挂到fd的等待队列上(如果在之后的睡眠时间内,此fd就绪的话,会唤醒睡眠的进程(这是通过回调函数实现的??)),设置mask。如第一次对所有fd进行poll操作之后,没有任何fd就绪的,则进程进去schedule_timeout,即睡眠,如果睡眠时钟到,再次唤醒进程,重新对所有的FD,进行poll操作。
在设备收到一条消息(网络设备)或填写完文件数据(磁盘设备)后,会唤醒设备等待队列上睡眠的进程,这时current便被唤醒了。
__pollwait()函数中填充poll_table_entry结构体时注册的唤醒回调函数pollwake(),
进程被唤醒的条件有2:一是上面说的“一定时间”到了,二是被驱动程序唤醒。驱动程序发现条件就绪时,就把“某个队列”上挂着的进程唤醒,这个队列,就是前面通过poll_wait把本进程挂过去的队列。
总结:select和poll的缺点
1.每次要调用select和poll,意味着每次调用都要将fd列表从用户态拷贝到内核态,当fd数目很多时,这会造成低效。
2.每次做一次这样的系统调用都得轮询所有FD,次数是设备数*(睡眠次数-1),也就是时间复杂度是O(n),还得做几次O(n)呢。可见,对于现在普遍的服务器程序,需要同时并发监听数千个连接,并且连接需要重复使用的情况,poll和select就存在这样的性能瓶颈。
3、调用结束之后,需要遍历所有的FD,才能得到结果,即是select返回的是含有整个句柄的数组,应用程序需要遍历整个数组才能发现哪些句柄发生了事件,而epoll返回的是仅仅是就绪的数组
最新文章
- Entity Framework 教程——创建实体数据模型
- linux下遇见mysql启动报2002错误解决办法
- Spring系列之依赖注入的方式
- hadoop的概念
- linux 相关系列安装
- Tomcat遇到”Error listenerStart”或”Error filterStart”问题且无详细日志时的log配置.
- Java基础--访问权限控制符
- python selenium启动浏览器打开百度搜索
- hdu5044 Tree 树链拆分,点细分,刚,非递归版本
- MSSQL2008 中文乱码问题 (引自ljg888的专栏)
- 开源内容管理系统Joomla正式发布3.5版本 基于PHP 7
- SQL中的Join和Where的区别
- Redis 实现安全队列
- BZOJ1299 巧克力棒
- operator new和operator delete
- Centos 7.x nginx隐藏版本号
- DJango 基础 (2)
- 转载:configure执行流程(1.5.2)《深入理解Nginx》(陶辉)
- Newtonsoft.Json 转换DateTime类型为字符串时,串内部会有一个T。解决方案
- [1.16更新B14特征处理]津南数字制造题目解读及部分思路~~有趣的特征
热门文章
- java--构造器与static
- 线性表的链式存储——C语言实现
- DAY13-前端之JavaScript
- 如何边遍历集合边删除元素--使用Iterator中的remove()方法
- loader的简单使用过程分析
- MMSeg中文分词算法
- The Apache Tomcat installation at this directory is version 8.5.24 Tomcat 8.0 installation is expect
- HDOJ 1121 Complete the Sequence
- Java Swing 创建转圈的进度提示框
- CodeForces 566D Restructuring Company (并查集+链表)