网络编程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值拷贝就绪设备信息。
- 网络编程4---poll与epoll的区别
- linux网络编程poll与epoll区别
- Linux网络编程--select,poll和epoll的区别
- linux网络编程之socket(十三):epoll 系列函数简介、与select、poll 的区别
- linux网络编程之socket(十三):epoll 系列函数简介、与select、poll 的区别
- UNIX网络编程——epoll 系列函数简介、与select、poll 的区别
- linux网络编程之socket(十三):epoll 系列函数简介、与select、poll 的区别
- Linux网络编程之socket:epoll系列函数简介,与select,poll函数的区别
- linux网络编程之socket(十三):epoll 系列函数简介、与select、poll 的区别
- linux网络编程:epoll 系列函数简介、与select、poll 的区别
- unix网络编程之socket:epoll 系列函数简介、与select、poll 的区别
- linux网络编程之socket(十三):epoll 系列函数简介、与select、poll 的区别
- select、poll与epoll的区别
- select.poll,epoll的区别与应用
- epoll与select\poll区别 .
- epoll与select、poll区别
- epoll与select\poll区别
- epoll与select、poll区别
- ios tabbar 文字位置
- oracle存储过程编写
- 活得更像一个人,我的十六年学习之路——北漂18年(44)
- 友元函数和友元类
- Android 类似向右滑动解锁控件
- 网络编程4---poll与epoll的区别
- ios开发之app内启动用户评价
- oracle游标的使用
- ByteBuffer用法小结
- iOS 开发 -- Swift (八) 闭包
- iOS在图片中添加水印
- Android开发中关于小米2s手机的调试问题
- salesforce学习资源
- arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf、gnueabi区别