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模型


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



目录
相关文章
|
4天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
眼疾识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了4种常见的眼疾图像数据集(白内障、糖尿病性视网膜病变、青光眼和正常眼睛) 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,实现用户上传一张眼疾图片识别其名称。
20 4
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
|
24天前
|
存储 缓存 监控
Linux缓存管理:如何安全地清理系统缓存
在Linux系统中,内存管理至关重要。本文详细介绍了如何安全地清理系统缓存,特别是通过使用`/proc/sys/vm/drop_caches`接口。内容包括清理缓存的原因、步骤、注意事项和最佳实践,帮助你在必要时优化系统性能。
168 78
|
23天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
91 13
|
22天前
|
数据采集 监控 安全
公司网络监控软件:Zig 语言底层优化保障系统高性能运行
在数字化时代,Zig 语言凭借出色的底层控制能力和高性能特性,为公司网络监控软件的优化提供了有力支持。从数据采集、连接管理到数据分析,Zig 语言确保系统高效稳定运行,精准处理海量网络数据,保障企业信息安全与业务连续性。
39 4
|
24天前
|
Ubuntu Linux C++
Win10系统上直接使用linux子系统教程(仅需五步!超简单,快速上手)
本文介绍了如何在Windows 10上安装并使用Linux子系统。首先,通过应用商店安装Windows Terminal和Linux系统(如Ubuntu)。接着,在控制面板中启用“适用于Linux的Windows子系统”并重启电脑。最后,在Windows Terminal中选择安装的Linux系统即可开始使用。文中还提供了注意事项和进一步配置的链接。
40 0
|
25天前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
62 17
|
1月前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
|
1月前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
52 10
|
1月前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,并提供一些实用的代码示例。通过阅读本文,您将了解到如何保护自己的网络安全,以及如何提高自己的信息安全意识。
62 10
|
1月前
|
存储 监控 安全
云计算与网络安全:云服务、网络安全、信息安全等技术领域的融合与挑战
本文将探讨云计算与网络安全之间的关系,以及它们在云服务、网络安全和信息安全等技术领域中的融合与挑战。我们将分析云计算的优势和风险,以及如何通过网络安全措施来保护数据和应用程序。我们还将讨论如何确保云服务的可用性和可靠性,以及如何处理网络攻击和数据泄露等问题。最后,我们将提供一些关于如何在云计算环境中实现网络安全的建议和最佳实践。