Linux系统网络编程——第二十节 多路复用之epoll 模型

简介: 如果只是系统内部, 服务器和服务器之间进行通信, 只有少数的几个连接, 这种情况下用epoll就并不合适.。

epoll相关系统调用

1、epoll_create:

int epoll_create(int size);


(自从linux2.6.8之后, size参数是被忽略的,用完之后, 必须调用close()关闭


其返回值是一个文件描述符。


调用这个函数的时候,底层(内核层)会帮我们构建出一个epoll模型。epoll模型是什么?先不用管,就先理解它是一个模型就好了,它是有一个整体的、抽象的概念。


2、epoll_ctl()

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);


作用:向epoll模型中添加(删除、修改等) 对应的文件描述符 以及 对应的事件


1、epfd:epoll模型编号;


2、op选项:


EPOLL_CTL_ADD :注册新的fd到epfd中;


EPOLL_CTL_MOD :修改已经注册的fd的监听事件;


EPOLL_CTL_DEL :从epfd中删除一个fd;



该函数表示向epfd这么一个epoll模型当中,添加、删除、修改(op选项决定)对应文件描述符 (fd) 的相应事件 (event) (这里是用户告诉内核)


(结构体event下面会再说到)


3、epoll_wait

int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);


第一个参数表示我们所创建的epoll模型。


第二、三个参数表示两个输出型参数:表示内核告诉用户:哪些文件描述符对应的哪些事件已经就绪了,我给你放在了epoll_event列表当中,并且告诉你有多大。


第四个参数和poll用法一样


用了epoll,那么整个文件描述符都是由系统来管理了(直观的感受是不需要自己再去定义数组了)


对于那个event结构体,如下图:

image.png


epoll宏的集合:


EPOLLIN : 表示对应的文件描述符可以读 (包括对端SOCKET正常关闭);


EPOLLOUT : 表示对应的文件描述符可以写;


EPOLLPRI : 表示对应的文件描述符有紧急的数据可读 (这里应该表示有带外数据到来);


EPOLLERR : 表示对应的文件描述符发生错误;


EPOLLHUP : 表示对应的文件描述符被挂断;


EPOLLET : 将EPOLL设为边缘触发(Edge Triggered)模式, 这是相对于水平触发(Level Triggered)来说的.


EPOLLONESHOT:只监听一次事件, 当监听完这次事件之后, 如果还需要继续监听这个socket的话, 需要


再次把这个socket加入到EPOLL队列里


epoll模型原理

1、创建epoll模型即在内核当中为我们创建了一颗红黑树。


在红黑树上的结点:放置两个元素(fd和event)。所以调用epoll_ctl的时候你要帮助我关心哪些fd上面的哪些event(K,V模型)。如果要修改或者增加、删除,就是对红黑树的结点进行操作。


2、建立回调函数。


在OS上,使用驱动层的某些功能,完成某些回调功能。


3、创建就绪队列。


当底层有事件已经就绪的时候,那么就调用OS的某些回调功能的机制,然后在系统层面上生成一个新的结点(元素也是fd\event)(可能没有fd),然后放在就绪队列当中


Epoll_ctl就是帮助我们删除、增加、修改等。(本质帮我们创建或者消除结点,然后生成相应的回调函数)


Epoll_wait就直接从就绪队列里面拿就可以了。(本质上为拷贝)


思考几个问题:


1、OS怎么知道数据是发送过来给自己的?


本质上是通过中断机制。(可自行上网搜一搜)


2、OS怎么知道一个事件已经就绪了?


缓冲区有一个低水位线这样一个概念,当数据不断交付给上层的时候,数据越来越多,多到一定程度的时候就证明事件就绪了


3、不管是poll还是select,都是通过轮询的方式,效率较低。


而epoll所用的是属于回调机制,即事件就绪的文件来去主动向上通知交付。


(关于epoll的用法,还涉及到ET模型和LT模型,这里就不做过多赘述了,感情去的小伙伴可以上网搜索一下)


epoll的使用场景

epoll的高性能, 是有一定的特定场景的. 如果场景选择的不适宜, epoll的性能可能适得其反.


对于多连接, 且多连接中只有一部分连接比较活跃时, 比较适合使用epoll.


例如, 典型的一个需要处理上万个客户端的服务器, 例如各种互联网APP的入口服务器, 这样的服务器就很适合epoll.


如果只是系统内部, 服务器和服务器之间进行通信, 只有少数的几个连接, 这种情况下用epoll就并不合适. 具体要根


据需求和场景特点来决定使用哪种IO模型


好啦,本节的内容就到这里啦~~



目录
相关文章
|
23天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于BP神经网络的苦瓜生长含水量预测模型matlab仿真
本项目展示了基于BP神经网络的苦瓜生长含水量预测模型,通过温度(T)、风速(v)、模型厚度(h)等输入特征,预测苦瓜的含水量。采用Matlab2022a开发,核心代码附带中文注释及操作视频。模型利用BP神经网络的非线性映射能力,对试验数据进行训练,实现对未知样本含水量变化规律的预测,为干燥过程的理论研究提供支持。
|
5天前
|
监控 安全 测试技术
网络信息系统的整个生命周期
网络信息系统规划、设计、集成与实现、运行维护及废弃各阶段介绍。从企业需求出发,经过可行性研究和技术评估,详细设计系统架构,完成设备安装调试和系统集成测试,确保稳定运行,最终安全退役。
15 1
网络信息系统的整个生命周期
|
9天前
|
运维 监控 网络协议
|
23天前
|
网络协议 前端开发 Java
网络协议与IO模型
网络协议与IO模型
网络协议与IO模型
|
22天前
|
机器学习/深度学习 网络架构 计算机视觉
目标检测笔记(一):不同模型的网络架构介绍和代码
这篇文章介绍了ShuffleNetV2网络架构及其代码实现,包括模型结构、代码细节和不同版本的模型。ShuffleNetV2是一个高效的卷积神经网络,适用于深度学习中的目标检测任务。
61 1
目标检测笔记(一):不同模型的网络架构介绍和代码
|
3天前
|
网络协议 算法 网络性能优化
计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议
计算机网络常见面试题(一):TCP/IP五层模型、应用层常见的协议、TCP与UDP的区别,TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议、ARP协议
|
5天前
|
机器学习/深度学习 存储 运维
图神经网络在复杂系统中的应用
图神经网络(Graph Neural Networks, GNNs)是一类专门处理图结构数据的深度学习模型,近年来在复杂系统的研究和应用中展现了强大的潜力。复杂系统通常涉及多个相互关联的组件,其行为和特性难以通过传统方法进行建模和分析。
23 3
|
5天前
|
编解码 安全 Linux
网络空间安全之一个WH的超前沿全栈技术深入学习之路(10-2):保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali——Liinux-Debian:就怕你学成黑客啦!)作者——LJS
保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali以及常见的报错及对应解决方案、常用Kali功能简便化以及详解如何具体实现
|
8天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
23 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
13天前
|
Ubuntu Linux 虚拟化
Linux虚拟机网络配置
【10月更文挑战第25天】在 Linux 虚拟机中,网络配置是实现虚拟机与外部网络通信的关键步骤。本文介绍了四种常见的网络配置方式:桥接模式、NAT 模式、仅主机模式和自定义网络模式,每种模式都详细说明了其原理和配置步骤。通过这些配置,用户可以根据实际需求选择合适的网络模式,确保虚拟机能够顺利地进行网络通信。

热门文章

最新文章