图解epoll原理
2022-09-20 14:52:45 1 举报
图解epoll原理
作者其他创作
大纲/内容
2
移除A
1000
缺点
内核
缺点涉及两次遍历
发送中断信号给cpu
同步等待队列
文件列表
输入缓冲区
内核接收网络数据过程
进程A
阻塞进程A
4、阻塞和唤醒进程。假设计算机中正在运行进程A和进程B,在某时刻进程A运行到了epoll_wait语句。如下图所示,内核会将进程A放入eventpoll的等待队列中,阻塞进程。
2、维护监视列表。调用create_ctl将eventpoll加入到被监视的socket的等待队列中。当socket收到数据后,中断程序会操作eventpoll对象,而不是直接操作进程
10000
socket
1
socket1等待队列
进程B
1、epoll_create创建eventpoll对象,eventpoll负责维护就绪队列
当socket接收到数据,中断程序一方面修改rdlist,另一方面唤醒eventpoll等待队列中的进程,进程A再次进入运行状态(如下图)。也因为rdlist的存在,进程A可以知道哪些socket发生了变化。
...
如何避免遍历socket列表?需要内核维护一个就绪队列,将引用指向有数据的socket。
Epoll
socket3等待队列
网卡
内存
接收数据过程:(以上是一个socket的过程)1、网卡设备接收到数据;2、收到数据写入到内存;3、发送中断程序给cpu;4、CPU执行中断程序:a)将内存数据写入到socket缓冲区,b)唤醒进程A;
每次只能监控一个socket
3
唤醒示意图
网线
唤醒进程A
....
rdlist
唤醒A
1、每次调用select调用都需要将进程A加入到所有被监控的socket的等待队列中;2、进程A被唤醒,进程A都需要从所有等待队列中移除;3、select监控的是一个位图,使用位图对应的位来表示要监控的socket;4、select不知道哪个socket有数据,只能一个一个遍历;
等待队列
Container
3、接收数据。当socket收到数据后,中断程序会给eventpoll的就绪列表添加socket引用。这时就绪列表中就是有数据的socket了。
select过程:1、select同时监控着socket1,socket2,socket3列表fds;2、调用select函数,如果fds列表里没有socket有数据,则挂起进程;知道有一个socket有数据,则唤醒进程A;3、唤醒进程A之后,其他所有被监控的socket将从等待队列中移除进程A;4、只要进程A被唤醒,说明有一个socket有数据,那么只需要遍历一遍fds就能知道哪个socket有数据;
发送给内存
socket2等待队列
执行中断程序socket数据接收唤醒进程A
输出缓冲区
select
CPU
epoll的原理的流程
1、创建epoll对象epfd;2、调用epoll_ctl将需要监视的socket放入epfd中;3、epoll_wait等待数据
发送数据给网卡
0 条评论
下一页