网络编程4---poll与epoll的区别

本文对比了Linux下的epoll与poll两种I/O多路复用机制的基本原理。poll通过不断轮询所有文件描述符来获取就绪状态,而epoll采用更为高效的回调机制,仅当有文件描述符就绪时才进行处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前在我的文章:网络编程1---select poll epoll中总结了这3个函数的接口,但是对于epoll为什么比poll好,知之甚少。

今天在网上查了一些,进行了一些总结。

这篇文章总结自:

linux内核poll/select/epoll实现剖析

在Linux上开发网络服务器的一些相关细节(1)---poll与epoll


其中第2篇文章在网络上流传甚广,我没有找到原文出处,就转载自看着比较舒服的网易博客。

第1篇文章对于poll原理的描述更详细。

第2篇文章对于epoll原理的描述更好。




1.poll与select基本原理

(1)复制用户数据到内核空间

(2)估计超时时间

(3)遍历每个文件取得文件就绪状态,如果就绪加入就绪队列,如果没有就绪加入等待队列

(4)遍历完成后检查状态:

                  a)如果已经有就绪的文件转到5;

                  b)如果有信号产生,重启poll或select(转到1或3);

                  c)否则挂起进程等待超时或唤醒,超时或被唤醒后再次遍历所有文件取得每个文件的就绪状态

(5)将所有文件就绪状态复制到用户空间

(6)清理申请的资源


注意:

①关键就是(4)中的c)的具体方式,这也是与epoll的很大区别所在。

这里不管是超时,还是被唤醒都应该是内核通过中断来通知该挂起的进程。

被中断唤醒的这个进程只是知道了已经有文件就绪了,但是不知道是那些。

所以它又要进行一次遍历,查找就绪设备,将其加入就绪队列。然后跳到(5)


2.epoll基本原理

epoll由3个系统调用组成:epoll_create,epoll_ctl,epoll_wait

(1)sys_epoll_create,主要做一些准备工作,比如创建数据结构,初始化数据并返回一个文件描述符。

该文件描述符表示新建的虚拟epoll文件

(2)sys_epoll_ctl,,每次调用该函数只处理一个文件描述符这里主要描述op为EPOLL_CTL_ADD时的执行过程。

sys_epoll_ctl首先做一些安全检查,然后进入ep_insert,ep_insert里将ep_poll_callback作为回调函数加入设备的等待队列

下面描述ep_poll_callback的作用,非常关键,它在所等待的设备就绪后被系统回调,执行两个操作:

①将就绪设备加入就绪队列,这一步避免了像poll那样在有设备就绪后再次轮询所有设备

这里可以对比,1中注意的①里面的描述。

②唤醒虚拟的epoll文件

(3)sys_epoll_wait,这里实际执行操作的是ep_poll函数。它将等待一个将进程自身(epollfd)插入的等待队列,直到被唤醒(见(2)中ep_poll_callback的描述)。

被唤醒后就执行ep_events_transfer将结果拷贝到用户空间。


注意:

①poll和epoll拷贝数据到用户空间的操作都是不一样的。

poll拷贝所有设备的就绪状态,也就是说不管是就绪还是未就绪都要拷贝,然后交给用户自行判断处理。

epoll值拷贝就绪设备信息。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值