IO多路复用(新)

1.前景回顾

        无论是阻塞IO还是非阻塞IO,用户应用在一阶段都需要调用recvfrom来获取数据,差别在于无数据时的处理方案:

  • 如果调用recvfrom时,恰好内核没有数据,那么阻塞IO会使用户进程阻塞,非阻塞IO使CPU进行空转,都不能充分发挥CPU的作用。

  • 如果调用recvfrom时,恰好内核有数据,则将内核数据读取到用户区处理即可。

        而且在多个读取请求单线程处理的情况下,只能依次处理一个个请求,一旦正在处理的请求的数据没有准备好,那么全体阻塞,性能很差。

        可以利用多线程来改进,但也要考虑上下文切换的时间成本。能不能利用一个线程同时监听这多个读请求,一旦哪个请求所需要的数据在内核中准备就绪了,我们就去读取数据。

        那么用户进程如何知道内核中的数据是否准备好了呢?

2.FD(文件描述符)

        文件描述符:简称FD,是一个从0开始递增的无符号整数,用来关联Linux中的一个文件,也包括Socket。IO多路复用是利用一个线程来同时监听多个FD,并在某个FD可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源。

3.IO多路复用概述

监听FD的方式又有多种实现,监听都是在内核实现的,常见的有:select、poll和epoll模式。

它们之间的差异在于:

  • select和poll只会通知用户进程有几个FD就绪,但不确定具体是哪个FD,还是需要用户进程逐个遍历FD来确认。

  • epoll则会在通知用户进程FD就绪的同时,把已经就绪的FD写入用户空间。

4.IO多路复用——select

        select是Linux中最早的I/O多路复用实现方案,采用数组实现:

4.1select方案的缺点:

  • 用户进程无法得知是哪个fd就绪,需要遍历整个fd_set。

  • fd_set监听的fd数量不超过1024。

  • 需要来回将整个fd_set在用户和内核之间互相拷贝。

5.IO多路复用——poll

        poll模式对select模式做了简单的改进,但性能提升不明显,也是只会通知用户进程有几个fd准备就绪了。区别就是poll模式在内核中采用链表存储,理论上无上限,但是监听的FD越多,每次遍历耗时也会越长,性能反倒会下降。

6.IO多路复用——epoll

        epoll模式中内核采用的是call back事件回调,利用红黑树保存要监听的FD,而且每个FD只需要初始时添加一次到红黑树,等到红黑树中的FD就绪了,会自动触发事件,把对应的FD加入到一个就绪列表(list_head)中,当用户进程要检查内核就绪列表时(调用epoll_wait),如果列表不为空则返回已就绪的FD的数量,并把链表中的值拷贝到用户空间的events数组中,用户空间根据数组中的值就能直接定位可以读取的FD,然后去读取数据即可。

7.IO多路复用——事件通知机制

        对于用户进程来说,我们调用epoll_wait函数查看就绪列表就能得到fd的通知。其事件通知的模式有两种:LT和ET。一个例子:

 

LT:当就绪队列中有可读的FD时,调一次通知一次,这样会重复通知多次,直至数据全部读取完成。(默认)

ET:当就绪队列中有可读的FD时,只会通知一次,然后直接删除,不管用户是否一次能够读完。

        根据上面的分析,我们发现那肯定是LT好,但是LT会存在惊群问题,比如我们有多个进程同时在关心这一个socket的读取数据,其实实际读取操作一两个进程就能完成,但是你每次一调用epoll_wait函数,都会惊动所有进程去读,所以就没有必要。

8.IO多路复用——Web服务流程

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/253338.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python通过 psd-tools 解析 PSD 文件

更多资料获取 📚 个人网站:ipengtao.com PSD(Photoshop Document)是Adobe Photoshop软件中使用的图像文件格式,包含图层、通道、蒙版等信息。在Python中,我们可以使用 psd-tools 库来解析和处理PSD文件。本…

180天Java从入门到就业-Day04-01Java程序流程控制介绍、Java分支结构if语句

1.程序流程控制介绍 1.1 流程控制结构介绍 流程控制语句是用来控制程序中各语句执行顺序的语句,可以将语句组合成完成一定功能的逻辑模块。 一个程序会包含三种流程控制结构:顺序结构、分支结构、循环结构 顺序结构在没有使用程序流程控制语句(if-else语句、switch-case语…

人体姿态估计算法

人体姿态估计算法 1 什么是人体姿态估计2 基于经典传统和基于深度学习的方法2.1 基于经典传统的人体姿态估计算法2.2 基于深度学习的人体姿态估计算法OpenPoseAlphaPose (RMPE) 3 算法应用4 Paper 人体姿态估计在现实中的应用场景很丰富,如下 动作捕捉:三…

AI Pika 生成进击的巨人动漫分镜案例

背景介绍 Pika 是一个使用 AI 生成和编辑视频的平台。它致力于通过 AI 技术使视频制作变得简单和无障碍。 Pika 1.0 是 Pika 的一个重大产品升级,包含了一个新的 AI 模型,可以在各种风格下生成和编辑视频,如 3D 动画,动漫,卡通和电影风格。…

一篇文章带你详细了解C++智能指针

一篇文章带你详细了解C智能指针 为什么要有智能指针内存泄漏1.什么是内存泄漏,它的危害是什么2.内存泄漏的分类3.如何避免内存泄漏 智能指针的使用及原理1.RAII2.智能指针的原理3.auto_ptr4.unique_ptr5.shared_ptr6.weak_ptr 为什么要有智能指针 C引入智能指针的主…

QGraphicsView实现简易地图7『异步加载-多瓦片-无底图』

前文链接:QGraphicsView实现简易地图6『异步加载-单瓦片-无底图』 前一篇文章提到的异步单瓦片加载,是指线程每准备好一个瓦片数据后,立刻抛出信号让主线程加载。而本篇异步多瓦片加载是指线程准备好所有瓦片数据后,一起抛出信号让…

【数据结构】——堆排序

前言:我们已经学习了堆以及实现了堆,那么我们就来给堆进行排序。我们怎么来进行排序呢?这一次我们就来解决这个问题。 如果我们堆排序要求排序,我们是建立大堆还是小堆呢,如果我们建的小堆的话,那我们在排序…

JAVAEE初阶相关内容第十九弹--网络原理之TCP_IP【续集2】

写在前 上一篇博客主要介绍的是关于网络层协议-IP协议的重点介绍。需要掌握关于IP协议的协议头格式,关于IPV4分配不够的解决办法。地址管理与路由选择。 点击跳转上一篇博客 本篇博客将继续学习关于计网中协议的内容。 本篇博客主要介绍关于数据链路层的重点协议-以…

K-Radar:适用于各种天气条件的自动驾驶4D雷达物体检测

文章:K-Radar: 4D Radar Object Detection for Autonomous Driving in Various Weather Conditions 作者:Dong-Hee Paek, Seung-Hyun Kong,Kevin Tirta Wijaya 编辑:点云PCL 代码:https://github.com/ka…

基于单片机自动饮料混合机控制系统设计

**单片机设计介绍,基于单片机自动饮料混合机控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机自动饮料混合机控制系统设计是一个涉及多个领域的复杂项目,包括单片机技术、传感器技术…

玩转大数据9:机器学习在大数据分析中的应用

1. 引言 在大数据时代,机器学习在大数据分析中扮演着至关重要的角色。本文介绍机器学习在大数据分析中的重要性和应用场景,并探讨Java中可用的机器学习库和框架。 2. 机器学习的基本概念和算法 机器学习是当今人工智能领域的一个关键分支,…

Linux进程解析(冯诺依曼体系结构,操作系统,进程初步解析)

冯诺依曼体系结构: 我们常见的计算机,如笔记本。我们常见的计算机,服务器,大部分都遵守冯诺依曼体系。 截至目前,我们所认识的计算机,都是有一个个的硬件组件组成: 中央处理器(CPU)&am…