网络编程——17. 优于select的epoll

select函数实现IO复用,但不适合以Web服务器端开发为主流的现代开发环境

17.1 epoll理解及其应用

基于select的IO复用技术速度慢的原因

不合理的两点:
1。调用select函数后常见的针对所有文件描述符的循环语句
2。每次调用select函数时都需要向该函数传递监视对象信息——致命弱点。
网络编程——17. 优于select的epoll_第1张图片

select函数的优点

有两点:
1。服务器端接入者少
2。程序应具有兼容性

实现epoll时必要的函数和结构体

epoll函数优点:
1。无需编写以监视状态变化为目的的针对所有文件描述符的循环语句
2。调用对应于select函数的epoll_wait函数时无需每次传递监视对象信息

需要3个函数:
1- epoll_create:创建保存epoll文件描述符的空间。epoll方式下由操作系统负责保存监视对象文件描述符,因此需要向操作系统请求创建保存文件描述符的空间。
2- epoll_ctl:向空间(位数组)注册并注销文件描述符,为了添加和删除监视对象文件描述符。
3- epoll_wait:等待文件描述符发生变化

epoll方式通过如下结构体epoll_event将发生变化的文件描述符单独集中到一起。
网络编程——17. 优于select的epoll_第2张图片

epoll_create

函数原型
网络编程——17. 优于select的epoll_第3张图片
所创建的文件描述符保存空间称为“epoll例程”,该函数创建的资源与套接字一样,也由操作系统管理。需要终止时,与其他文件描述符相同,也要调用close函数

epoll_ctl

生成epoll例程后,应在其内部注册监视对象文件描述符
网络编程——17. 优于select的epoll_第4张图片

常用的第二个参数:
1。EPOLL_CTL_ADD:将文件描述符注册到epoll例程
2。EPOLL_CTL_DEL:从epoll例程中删除文件描述符,此时第四个参数应为NULL
3。EPOLL_CTL_MOD:更改注册的文件描述符的关注事件发生情况

举例
epoll_ctl(A, EPOLL_CTL_ADD, B, C);
代表epoll例程A中注册文件描述符B,主要目的是监视参数C中的事件。
epoll_ctl(A, EPOLL_CTL_DEL, B, NULL);
从epoll例程A中删除文件描述符B
网络编程——17. 优于select的epoll_第5张图片

epoll_wait

与select函数对应的epoll_wait函数
网络编程——17. 优于select的epoll_第6张图片
网络编程——17. 优于select的epoll_第7张图片



17.2 条件触发和边缘触发

条件触发方式中,只要输入缓冲有数据就会一直通知该事件
而边缘触发方式中,输入缓冲收到数据时仅注册1次该事件,即使输入缓冲中还留有数据,也不会再进行注册

你可能感兴趣的:(网络编程)