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

来源:互联网 发布:美国商科 知乎 编辑:程序博客网 时间:2024/06/10 12:26

之前在我的文章:网络编程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值拷贝就绪设备信息。


0 0
原创粉丝点击