五种网络IO模型

目录

前言

文件描述符

为什么要多种io模型

同步IO

1.阻塞IO

2.非阻塞IO

3.多路复用IO(事件驱动IO)

select:

poll:

epoll:

4.信号驱动IO

异步IO

区别


前言

文件描述符

首先我们了解一下文件描述符是什么:在linux下一切皆文件,进程是通过文件描述符(file descriptors)来访问文件的,。默认有三个文件描述符:0(标准输入),1(标准输出),2(标准错误)。再打开一个新的文件的话,它的文件描述符就++。

为什么要多种io模型

网络IO,会涉及到两个系统对象,一个是用户空间调用IO的进程或线程,另一个是内核空间的内核系统,比如发生IO操作read时,它会经历两个阶段。

1.等待数据准备就绪2.将数据从内核拷贝到进程或线程中

因为在以上两个阶段上各有不同的情况,所以出现了多种网络 IO 模型。

同步IO

1.阻塞IO

在linux下,所有socket默认都是阻塞的,我要向一个文件描述符做read操作,此时内核里没有数据就绪,那么这个时候用户进程就会阻塞,直到内核数据就绪了,会将数据从内核拷贝到用户内存,然后返回结果,此时用户进程解除阻塞状态。

优点:开发简单,在阻塞期间用户线程挂起,挂起不会占用CPU资源。

缺点:不适合大并发,开销会非常大。

但是如果有多个client阻塞IO就不适用了,所以引用了多线程,但是如果数据规模太大了,会很占用系统资源,而且线程和进程容易进入假死状态。如果用线程池的话,数据规模非常非常大,线程池可能缓解部分压力,但是不能解决所有问题,所以我们要引入其它io模型。

2.非阻塞IO

设置socket为非阻塞,如果内核还未将数据准备好,系统调用仍然会直接返回。我要向一个文件描述符做read操作,如果有数据,则成功读取返回,如果没有数据,也返回,但带上错误码。使用这种方式的话,我们做读取,就必须每隔一段时间去看看,叫非阻塞轮询检测。

但是轮询提高CPU占用率,并且系统也提供了select()多路复用模式,可以一次检测多个连接是否活跃,所以非阻塞IO一般在特定场景使用。

优点:每次发起 IO 调用,在内核等待数据的过程中可以立即返回,用户线程不会阻塞,实时性好

 缺点:多个线程不断轮询内核是否有数据,占用大量 CPU 资源,效率低。

3.多路复用IO(事件驱动IO)

单个进程/线程就可以同时处理多个IO请求,一个进程/线程可以监视多个文件句柄。

而多路复用IO利用了操作系统提供的一些机制,如select、poll、epoll,来同时监视多个I/O事件的状态。

select:

底层是数组,采用轮询,当用户进程调用了 select(每次调用select()方法,都需要把 fd 集合从用户态拷贝到内核态,并进行遍历。),那么整个进程会被阻塞,一旦某个文件句柄就绪,select 就会返回。这个时候用户进程再调用 read 操作,将数据从内核拷贝到用户进程。

poll:

poll用链表方式存fd,没有最大数量fd限制,其余和select一样。

epoll:

只会返回就绪的文件描述符,而不是遍历整个文件描述符集合。

红黑树方式存fd,没有最大数量fd限制,可保存所有待检测的socket,所以只需要拷贝一次,减少了内核和用户空间大量的数据拷贝和内存分配,回调方式不是轮询,不会因为fd增多性能下降。缺点:只能在Linux下工作。

这里补充一个知识点:

Reactor(反应堆),三部分组成,多路复用器(同时阻塞io socket),事件派发,事件处理(回调处理)。

4.信号驱动IO

内核将数据准备好的时候,使用SIGIO信号通知应用程序进行IO操作。

异步IO

用户进程发起操作之后,就可以开始去做其它的事。而另一方面,当内核收到read后首先它会立刻返回,所以不会对用户进程产生任何阻塞。然后内核会等待数据准备完成,然后将数据拷贝到用户内存,然后会给用户进程发送一个信号,告诉它操作完成了。

区别

阻塞IO,非阻塞IO,多路复用IO,信号驱动IO这四种的主要区别在第一阶段,他们在第二阶段是一样的:数据从内核缓冲区复制到调用者缓冲区期间都被阻塞住。异步 IO 都是非阻塞。

同步和异步,看是谁把内核缓冲区数据拷贝到用户缓冲区的,如果不是自己写代码实现的,那就是异步。

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

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

相关文章

【Python报错】已解决AttributeError: ‘method‘ object has no attribute ‘xxx‘

解决Python报错:AttributeError: ‘method’ object has no attribute ‘xxx’ 在Python中,AttributeError通常表明你试图访问的对象没有你请求的属性或方法。如果你遇到了AttributeError: method object has no attribute xxx的错误,这通常意…

批量处理脚本,用于删除指定目录下3天前的备份文件和日志。

echo off echo 删除3天前的备份文件和日志 set SrcDirD:\home set DaysAgo3 echo 准备删除3天前的备份文件和日志 forfiles /p %SrcDir% /d -%DaysAgo% /c "cmd /c del /f /q /a path && rd /s /q path" echo 正在执行删除,请稍等…… set SrcDi…

奇迹MU最强法师介绍

1、黑龙波 释放出深渊中的黑龙之魂,对一定范围内的目标造成中等程度伤害。 奥义: 怒哮——法师释放出深渊龙魂的怨怒之力,在电闪雷鸣中中咆哮的龙魂将对敌人额外造成少量伤害。 魂阵——法师利用法阵控制黑龙之魂进行更大范围的攻击&…

如何使用SeaFile文件共享服务器结合内网穿透将家中电脑变成个人云盘

文章目录 1. 前言2. SeaFile云盘设置2.1 Owncould的安装环境设置2.2 SeaFile下载安装2.3 SeaFile的配置 3. cpolar内网穿透3.1 Cpolar下载安装3.2 Cpolar的注册3.3 Cpolar云端设置3.4 Cpolar本地设置 4.公网访问测试5.结语 1. 前言 本文主要为大家介绍,如何使用两个…

opt 优化

【整理】深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件 【amos注】:通俗易懂,让人易于理解。

【Oracle篇】rman全库异机恢复:从RAC环境到单机测试环境的转移(第四篇,总共八篇)

💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…

【TensorFlow深度学习】深度学习中的损失函数种类与适用场景

深度学习中的损失函数种类与适用场景 深度学习中的损失函数种类与适用场景:精确度量模型误差的艺术一、均方误差(Mean Squared Error, MSE)二、交叉熵损失(Cross-Entropy)三、Hinge损失(Margin Loss&#x…

ROS RViz观测传感器数据

ROS RViz观测传感器数据 The Robot Visualization Tool 可视化工具 机器人传感器采集到的数据都可以图形化的显示在这个软件里,机器人运算处理的中间结果,和即将要执行的目标指示,比如机器人对空间中某个物体进行识别后,我们可以…

【Linux】Linux工具——make/Makefile

1.背景 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需…

Edge 工作区是什么?它都有哪些作用?

什么是工作区 Edge 工作区是什么?它是微软 Edge 浏览器中的一个功能,在帮助用户更好地组织和管理他们的浏览会话。通过工作区,用户可以创建多个独立的浏览环境,每个工作区内包含一组相关的标签页和浏览器设置。这使得用户能够根据…

SQL进阶day9————聚合与分组

目录 1聚合函数 1.1SQL类别高难度试卷得分的截断平均值 1.2统计作答次数 1.3 得分不小于平均分的最低分 2 分组查询 2.1平均活跃天数和月活人数 2.2 月总刷题数和日均刷题数 2.3未完成试卷数大于1的有效用户 1聚合函数 1.1SQL类别高难度试卷得分的截断平均值 我的错误…

开放式耳机十大品牌推荐!怎么选耳机看这六招!

随着耳机厂家的疯狂内卷,以前让学生党望其项背的千元耳机技术,纷纷被厂家下沉至百元耳机,是以2024年始,百元开放式耳机以新物种、价低格而爆火。看到身边朋友争相购买开放式耳机,既当耳饰,又当耳机&#xf…

分享:2024年(第12届)“泰迪杯”数据挖掘挑战赛成绩公示

2024年(第12届)“泰迪杯”数据挖掘挑战赛历时两个月顺利结束。竞赛采用盲审(屏蔽参赛者信息;评审专家只能评阅非本区域作品;三位评阅专家同时评阅同一作品,超限调整后再取平均分),答…

redis做为缓存,mysql的数据如何与redis进行同步呢?

让我们一步步来实现如何让MySQL数据库的数据和Redis缓存保持同步。想象一下,MySQL是一个大仓库,存放着所有重要的货物(数据),而Redis则像是一个快速取货窗口,让你能更快拿到常用的东西。为了让两者保持一致…

FC-135是一款受欢迎的32.768kHz晶振

KHZ中爱普生是以32.768KHZ最为出名的。32.768K晶振是一款数字电路板都要使用到的重要部件,有人比喻为电路板的冰发生器,也就是说心如果停止了跳动,那么电路板也将无法进行稳定的工作了,爱普生晶振FC-135是一款受欢迎的32.768KHz晶…

ALOS PALSAR 产品介绍

简介 L1.0 产品 该产品由原始观测数据(0 级)通过数据编辑(如位重新调整和添加轨道信息)生成。它是重建的、未经处理的信号数据,带有辐射和几何校正系数(附加但未应用)。 L1.1 产品 该产品由…

Java Web学习笔记13——JSON

JavaScript自定义对象 定义格式&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Js-对…

前端面试题日常练-day57 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末 1. 在PHP中&#xff0c;以下哪个符号用于连接两个字符串&#xff1f; a) b) . c) , d) : 2. PHP中的预定义变量$_SESSION用于存储什么类型的数据&#xff1f; a) 用户的输入数据 b) 浏览器发送的…

前后端不分离与前后端分离的Java Web开发对比介绍

在现代Web开发中&#xff0c;前后端架构设计有两种主要模式&#xff1a;前后端不分离和前后端分离。本文将详细介绍这两种模式&#xff0c;展示如何使用Spring Boot开发应用&#xff0c;并提供可运行的示例代码。 前后端不分离的Java Web开发 在前后端不分离的架构中&#xf…

Linux 命令 `uniq`:去重利器

Linux 命令 uniq&#xff1a;去重利器 在 Linux 系统中&#xff0c;处理文本数据是日常任务中不可或缺的一部分。当我们面对大量重复的数据行时&#xff0c;如何高效地去除这些重复项成为了一个值得探讨的话题。这时&#xff0c;uniq 命令就派上了用场。本文将介绍 uniq 命令的…