epoll原理


系统调用说明

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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM