码迷,mamicode.com
首页 > 其他好文 > 详细

epoll原理

时间:2019-10-14 12:48:15      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:结果   cal   poll   sel   common   用户   空间   queue   指定   

系统调用说明

epoll_create:在内核中创建epoll结构
epoll_ctl:add
1. 调用监听的文件的poll方法,设置callback
2. 设备就绪时唤醒等待队列上的进程,此时会调用callback
3. 该callback会将监听事件放入epoll的就绪队列中
epoll_wait:判断就绪队列中是否有事件

与select, poll区别

select/poll 会将监听的描述符表copy到内核
然后顺序扫描各个监听对象的poll函数,如果有事件(如可读),poll返回可读掩码。
循环最后如果有事件就返回用户空间进行处理

ET为啥比LT高效?

更少的系统调用次数?

ET饥饿现象如何避免?

饥饿:如某个链接上有大量数据写入,导致其他事件得不到处理。
可以在用户态做一层管理,如果读取了1MB以上的数据,就处理下一个事件。均衡一下

select源码

[fs/select.c do_select](https://www.jianshu.com/p/da6642369ef0)
如果没有就绪事件就去睡眠,直到超时时间到,醒来再遍历一把,然后timeout退出。
要么从timeout中醒来,要么从事件中醒来,醒来之后继续在死循环中

poll会返回当前fd的状态(比如是否可读写),根据这个状态,do_select做不同的动作。
1. 如果fd的状态与应用程序监听的事件匹配,则记录下来,do_select退出循环,并把结果返给上层。
2. 如果不匹配,do_select发现timeout或进程有signal信号打断,也会退出循环,返回空给应用。

epoll部分源码

ep_insert注册的回调函数中,会把epitem放到eventpoll结构的rdlist上
ep_send_event中调用ep_send_events_proc的每个event,这里要调用epitem对应的file的poll函数,获取返回的掩码

void poll_wait(struct file *filp, wait_queue_head_t *queue, poll_table *wait);
他的作用就是把当前进程添加到wait参数指定的等待列表(poll_table)中。该函数中不会阻塞。

另一个函数:__wake_up_common

epoll原理

标签:结果   cal   poll   sel   common   用户   空间   queue   指定   

原文地址:https://www.cnblogs.com/holidays/p/epoll1.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!