四种网络IO模型

news/2024/9/24 11:42:44/

       📝个人主页:五敷有你      

 🔥系列专栏:面经

⛺️稳中求进,晒太阳

IO的定义

IO是计算机内存与外部设备之间拷贝数据的过程。CPU访问内存的速度远高于外部设备。因此CPU是先把外部设备的数据读取到内存,在进行处理。

大家是否还记得局部性原理:

  • 时间局部性
  • 空间局部性

一次IO会把一块或一块旁边的数据全部加载到内存种

IO的流程

        用户发起调用操作,通过系统调用函数read()来间接的调用系统内核,从网卡读取数据,先将数据读取到内核缓冲区,在由内核缓冲区拷贝到用户态内存缓冲区。

为什么要有内核态与用户态?

因为早期的计算机设计是没有这个设计思想的,有一些指令是非常危险的,如果错用,将导致整个系统崩溃,有些敏感操作为了避免直接由用户操作。

内核态

        处于内核态的CPU可以任意访问数据。包括外围设备,比如网卡,硬盘等。处于内核态的CPU可以从一个程序切换到另一个程序,并且占用CPU不会发生在抢占情况,一般处于特级0的状态我们称之为内核态。

用户态

        处于用户态的CPU只能访问受限制的资源,不能直接访问内存等硬件设施,必须通过系统调用陷入到内核态中,才能访问这些特权资源。

        

        内核缓冲区处理的是内核空间和磁盘之间的数据传递,目的是减少访问磁盘的次数;而用户缓冲区处理的是用户空间和内核空间的数据传递,目的是减少系统调用的次数

IO要解决的问题

         在这个过程中设计的CPU操作,内存操作、外部物理设备的操作。由于三者数据处理速度的差异:用户读取数据时采用 用户线程阻塞等待?非阻塞轮询并读取数据?这个就是IO模型要解决的问题。

四种主要的IO模型

同步阻塞IO

        用户线程发起read调用后阻塞让出CPU,内核态等待网卡数据到来,把网卡拷贝到内核空间,接着把数据拷贝到用户空间。在把用户线程唤醒。

同步非阻塞IO

        将Socket设置为non-blocking,当前连接就变成了非阻塞IO,使用非阻塞模式的IO读写,叫做同步非阻塞IO。

在同步非阻塞IO中会出现以下几种情况:

  • 在内核缓冲区没有数据的情况下,系统调用会立刻返回,返回一个调用失败的信息。这样的请求不会阻塞。
  • 用户线程需要不断发起IO系统调用,测试内核数据是否准备好。
  • 在内核缓冲区有数据的情况下,是阻塞的。直到内核缓冲区的数据全部复制到进程缓冲区,系统调用完成。

同步非堵塞IO模型如下图:

同步非阻塞IO特点:程序需要不断的进行IO系统调用轮询数据是否准备好,如果没有准备好,就继续轮询

IO多路复用模型

        在IO多路复用模型中,引入了一种新的系统调用select/epoll,查询IO的就绪状态。通过该系统调用可以监视多个文件描述符。一旦某个描述符就绪(一般是内核缓冲区可读可写),内核就能将就绪的状态返回给应用程序。随后,应用程序根据就绪状态进行相应IO。

        在IO多路复用模型中通过select/epoll系统调用,单个应用程序的线程,可以不断轮询成百上千的socket连接,当某个或者某些socket网络连接有IO就绪的状态,就返回对应的可以执行的读写操作

O多路复用模型如下图所示:

IO多路复用模型的特点:IO多路复用模型涉及两种系统调用,一种是就绪查询(select/epoll),一种是IO操作。

多路复用IO也需要轮询。负责就绪状态查询系统调用的线程,需要不断的进行select/epoll轮询,查找出达到IO操作就绪的socket连接

异步IO模型(AIO)

基本流程为:

        用户通过系统调用,向内核注册某个IO操作,内核在整个IO操作(包括数据准备,数据复制)完成后,通知用户程序,执行后续的业务操作。(类似回调函数)

       在异步IO模型中,整个内核的数据处理过程中,包括内核将数据从网络物理设备(网卡)读取到内核缓存区、将内核缓冲区的数据复制到用户缓冲区,用户程序都不需要阻塞

异步IO模型如下图所示:

异步IO模型的特点:在内核等待数据复制数据的两个阶段,用户线程都不是阻塞的。当内核的IO操作(等待数据和复制数据)全部完成后,内核会通知应用程序读数据


http://www.ppmy.cn/news/1451346.html

相关文章

释放Stable Diffusion 无限可能

最近在整理大语言模型的系列内容,Stable Diffusion 是我下一篇博客的主题。关注 Stable Diffusion,是因为它是目前最受欢迎和影响力最大的多模态生成模型之一。Stable Diffusion 于 2022 年 8 月发布,主要用于根据文本的描述产生详细图像&…

ue引擎游戏开发笔记(28)——实现第三人称越肩视角

1.需求分析 实现一个第三人称越肩视角 2.操作实现 1.思路:建立一个弹簧臂和摄像机,调整两者位置达到越肩效果。 2.直接在蓝图操作:添加摄像机和弹簧臂: 3.对弹簧臂勾选使用pawn控制旋转,并适当调整摄像机和弹簧臂位置…

每日OJ题_贪心算法二⑥_力扣409. 最长回文串

目录 力扣409. 最长回文串 解析代码 力扣409. 最长回文串 409. 最长回文串 难度 简单 给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。 在构造过程中,请注意 区分大小写 。比如 "Aa" 不能当做一个…

centos7安装真的Redmine-5.1.2+ruby-3.0.0

下载redmine-5.1.2.tar.gz,上传到/usr/local/目录下 cd /usr/local/ tar -zxf redmine-5.1.2.tar.gz cd redmine-5.1.2 cp config/database.yml.example config/database.yml 配置数据连接 #编辑配置文件 vi config/database.yml #修改后的内容如下 product…

远程仓库管理

远程仓库管理 GitHub、GitLab、Gitee账户注册与配置 无论是GitHub、GitLab还是Gitee,注册和配置账户的过程都相对简单。根据您的需求选择其中一个平台,并按照上述步骤进行操作即可开始使用。 拉取(pull)操作的步骤如下&#xff1…

汉译英早操练-(二十五)

汉译英早操练-(十九)-CSDN博客 汉译英早操练-(二十)-CSDN博客 汉译英早操练-(二十一)-CSDN博客 汉译英早操练-(二十二)-CSDN博客 汉译英早操练-(二十三)-CSDN博客 汉译英早操练…

【模板】二维前缀和

原题链接:登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 二维前缀和板题。 二维前缀和:pre[i][j]a[i][j]pre[i-1][j]pre[i][j-1]-pre[i-1][j-1]; 子矩阵 左上角为(x1,y1) 右下角(x2,y2…

游戏名台词大赏

文章目录 原神(圈内) 崩坏:星穹铁道(圈内) 崩坏3(圈内) 原神 只要不失去你的崇高,整个世界都会为你敞开。 总有地上的生灵,敢于直面雷霆的威光。 谁也没有见过风&#…