epoll内核源码刨析【简略版】(2)

一、epoll的用法

先用epoll_create创建一个epoll对象epfd,再通过epoll_ctl将需要监视的socket添加到epfd中,最后调用epoll_wait等待数据

二、epoll相较于select/poll的优点 

1.epoll在内核中使用红黑树来跟踪进程所有待检测的文件描述符

把需要监控的socket通过epoll_ctl()函数加入内核中的红黑树中,而poll/select是通过socket集合(拷贝,遍历),减少了内核和用户空间大量的数据拷贝和内存分配。

 2.epoll使用事件驱动的机制,内核里维护了一个链表来记录就绪事件

当某个socket有事件发生时,通过回调函数内核会将其加入到这个就绪事件列表中,当用户调用epoll_wait()函数时,只会返回有事件发生的文件描述符的个数,不需要想select/poll一样轮询扫描socket集合

3.边缘触发

        epoll支持边缘触发和水平触发的方式,而select/poll只支持水平触发(边缘触发比水平触发的效率高)。

        如果使用边缘触发模式,I/O 事件发生时只会通知一次,而且我们不知道到底能读写多少数据,所以在收到通知后应尽可能地读写数据,以免错失读写的机会。因此,我们会循环从文件描述符读写数据,那么如果文件描述符是阻塞的,没有数据可读写时,进程会阻塞在读写函数那里,程序就没办法继续往下执行。所以,边缘触发模式一般和非阻塞 I/O 搭配使用,程序会一直执行 I/O 操作,直到系统调用(如 read和 write )返回错误,错误类型为 EAGAIN 或 EWOULDBLOCK 。  

三、epoll刨析

epoll_create:

        在内核中分配并初始化与epoll相关的数据结构,包括就绪队列(用于存放有事件发生的文件描述符 )、红黑树(用于管理所有被监控的文件描述符 )等 。同时,在内核中生成一个与之关联的epoll文件对象(struct file ),该对象对应着用户态的epoll文件描述符 。

epoll_ctl:

        使用epoll_ctl将文件描述符添加到epoll实例中时,该文件描述符及其相关的事件信息记录在epoll的内部数据结构中(如红黑树),以便epoll能够对其进行监控。

        在内核中,会将当前进程挂到fd对应的所有设备的等待队列上,并给每个fd一个命令"好了就调回调函数",如果设备有事件了,通过回调函数,会把fd放入rdllist

epoll_wait:

        调用epoll_wait就只是收集rdllist里的fd就可以了

        

后续会出一个较为详细版的源码刨析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值