【Linux基础】Linux的5种IO模型详解

引入

为了更好的理解5种IO模型的区别,在介绍IO模型之前,我先介绍几个概念

1.进程的切换

(1)定义

为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。即从用户态(较低的3G字节)切换到内核态(最高的1G字节),非常消耗系统资源。

(2)过程

  • 保存处理机上下文,包括程序计数器和其他寄存器。
  • 更新PCB信息。
  • 把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。
  • 选择另一个进程执行,并更新其PCB。
  • 更新内存管理的数据结构。
  • 恢复处理机上下文。

2.进程的阻塞

(1)定义

正在执行的进程,由于期待的某些事件未发生,由运行状态变为阻塞状态。

(2)特点

  • 只有处于运行状态的进程(获得CPU)才能被阻塞
  • 阻塞是主动行为
  • 不占用CPU资源

3.文件描述符

(1) 定义

用于描述指向文件的引用的抽象化概念

(2) 特点

  • 一个非负整数
  • 本质是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表

4.缓存IO

  • IO的数据缓存在文件系统的页缓存中(先拷贝到内核的缓冲区)

  • 在应用程序和内核间多次数据拷贝,带来很大的CPU开销

5.并发与并行

  • 并发:同时进行的任务数

  • 并行:同时工作的物理资源数量(如CPU核数)

5种IO模型

  • IO的本质是socket的读取,数据先拷贝到内核的缓冲区中,然后拷贝到应用程序的地址空间(进程)

1.BIO(blocking IO):同步阻塞 I/O

(1)过程

这里写图片描述

分析:从上图可以看到在整个过程中,当用户进程进行系统调用时,内核就开始了I/O的第一个阶段,准备数据到缓冲区中,当数据都准备完成后,则将数据从内核缓冲区中拷贝到用户进程的内存中,这时用户进程才解除block的状态重新运行。

(2)实例

  • Blocking I/O是在I/O执行的两个阶段都被block了。

  • 例如:我要去饭堂吃饭,这时饭堂的人很多,我就得排队买饭,排队的时间被浪费了,

(3)特点

  • 能够及时返回数据,无延迟
  • 性能下降

2.NIO(nonblocking IO):同步非阻塞 I/O

(1)过程

这里写图片描述

分析:从上图可以看到在I/O执行的两个阶段中,用户进程只有在第二个阶段被阻塞了,而第一个阶段没有阻塞,但是在第一个阶段中,用户进程需要盲等,不停的去轮询内核,看数据是否准备好了。

(2)实例

  • nonblocking I/O是在I/O执行的第二个阶段(数据复制)被block了,而第一个阶段并未阻塞(数据准备)。

  • 例如:我要去饭堂吃饭,这时饭堂的人很多,一般来说我需要排队买饭,但我们饭堂的管理最近变的比较人性化,你点完饭后,会给你一个号码,但饭堂噪声很大,我不得不频繁的询问我的饭是否做好了,但是我可以利用之前排队的时间去买瓶饮料喝!

(3)特点

  • 拷贝数据的整个过程,进程仍然是阻塞的
  • 需要不断询问数据是否准备好了
  • 能够在等待任务完成的过程中处理其他事件
  • 由于需要轮询,所以延迟会增加

3.多路复用IO( IO multiplexing)

(1)过程

这里写图片描述

分析:

  • 从上图可以看到在I/O复用模型中,由于同步非阻塞方式需要不断主动轮询,轮询占据了很大一部分过程,轮询会消耗大量的CPU时间,而 “后台” 可能有多个任务在同时进行,

  • 如果循环查询多个任务的完成状态,只要有任何一个任务完成,就去处理它。轮询不是进程的用户态。这时 “IO 多路复用”就出现了。即UNIX/Linux 的 select、poll、epoll,

  • IO多路复用是阻塞在select,epoll这样的系统调用之上,而没有阻塞在真正的I/O系统调用如recvfrom之上。

  • 从整个IO过程来看,他们都是顺序执行的,因此可以归为同步模型(synchronous)。都是进程主动等待且向内核检查状态

(2)实例

  • 多路复用I/O执行的两个阶段用户进程都是阻塞的,但是两个阶段是独立的。

  • 例如:我要去饭堂吃饭,这时饭堂的人很多,点完饭后,我会拿到一个号码,以前我不得不频繁的询问我的饭做好了没,但是最近饭堂安装了一块电子显示屏,你的饭好了就会在屏上显示出来,这时候我就不用频繁的去问了,直接看电子显示屏就醒了,然后我就可以利用这个时间去超市买个牙膏了。

(3)特点

  • select/poll调用后会阻塞进程,但可以同时阻塞多个IO事件操作(文件描述符),有数据可读或可写(就绪事件),就通知用户进程。

  • select 需要每次注册事件(轮询),而epoll不需要每次注册事件(没有轮询,回调函数)

  • IO多路复用阻塞在select/epoll的系统调用之上的,而真正的IO系统调用如recvfrom是非阻塞的。

(4)适用场景

  • 服务器需要同时处理多个处于监听状态或连接状态的套接字

  • 服务器需要处理多种网络协议的套接字

4.信号驱动I/O( signal driven IO)

(1)过程

这里写图片描述

分析:从上图可以看出,只有在I/O执行的第二阶段阻塞了用户进程,而在第一阶段是没有阻塞的。该模型在I/O执行的第一阶段,当数据准备完成之后,会主动的通知用户进程数据已经准备完成,即对用户进程做一个回调。该通知分为两种,一为水平触发,即如果用户进程不响应则会一直发送通知,二为边缘触发,即只通知一次。

(2)实例

  • 信号驱动I/O执行的第一阶段阻塞,而第二阶段不阻塞。

  • 例如:我要去饭堂吃饭,这时饭堂的人很多,点完饭后,我会拿到一个号码,虽然说饭堂安装了一块电子显示屏,但我在玩手机时还不得不抬头看一下显示屏上有我的号码没,最近饭堂买了一个大喇叭,哪个号码好了,卖饭的阿姨就会用喊,虽说饭堂有点吵,但这个声音还是可以听到的,这样我就可以专心的低头玩手机了。

5.异步 I/O(asynchronous IO)

(1)过程

这里写图片描述

分析:从上图可以看出,在该模型中,当用户进程发起系统调用后,立刻就可以开始去做其它的事情,然后直到I/O执行的两个阶段都完成之后,内核会给用户进程发送通知,告诉用户进程操作已经完成了。

(2)实例

  • 异步 I/O执行的两个阶段都不会阻塞。

  • 例如:我要去饭堂吃饭,估计这会饭堂的人很多,但最近我们饭堂可以叫外卖了,这样就省事多了,我直接打个电话,订份饭送到我们宿舍,而我现在就可以利用原来去饭堂路上和等饭的时间写博客了。

  • 这就是同步和异步的区别,原来我得亲自去饭堂买饭,而现在我可以在宿舍叫外卖。

(3)特点

  • 读写操作由内核完成,完成后内核将数据放到指定的缓冲区,通知应用程序来取。

总结

这里写图片描述

  • 阻塞IO和非阻塞IO的区别:数据准备的过程中,进程是否阻塞。

  • 同步IO和异步IO的区别:数据拷贝的过程中,进程是否阻塞。



本人才疏学浅,若有错,请指出,谢谢! 
如果你有更好的建议,可以留言我们一起讨论,共同进步! 
衷心的感谢您能耐心的读完本篇博文!

参考资料:聊聊Linux 五种IO模型

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

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

相关文章

计算机网络【五】广播通信+以太网

局域网的拓扑 广域网使用点到点通信 局域网使用广播通信 可以随意向网络中添加设备。 总线网星形网,使用集线器。现在多使用星形网络。环状网树形网 其中匹配电阻用来吸收总线上传播的信号。 共享通信媒体 静态划分信道 频分复用、时分复用、波分复用、码分复用…

聊聊Linux 五种IO模型

一篇《聊聊同步、异步、阻塞与非阻塞》已经通俗的讲解了,要理解同步、异步、阻塞与非阻塞重要的两个概念点了,没有看过的,建议先看这篇博文理解这两个概念点。在认知上,建立统一的模型。这样,大家在继续看本篇时&#…

操作系统【四】分页存储管理

连续分配方式的缺点: 固定分区分配:缺乏灵活性,产生大量的内部碎片,内存的利用率较低 动态分区分配:会产生许多外部碎片,虽然可以用紧凑技术处理,但是紧凑技术的时间代价较高 基本分页存储管理…

操作系统【五】分段内存管理+段页式内存管理

基本分段存储管理 与分页最大的区别:离散分配时所分配地址空间的基本单位不同 进程的地址空间:按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名,每段从0开始编址 内存分配规则:以段位单位进行分配&#xff…

计算机网络【六】网络层协议

网络层负责在不同网络之间尽力转发数据包(基于数据包的IP地址转发)。不负责丢失重传,也不负责顺序(每一个数据包都是单独选择路径)。 可靠传输是由传输层实现。 网络设备和OSI参考模型 通过分层,屏蔽了…

计算机网络【3】网络层

主要任务时把分组从源端发送到目的端,为分组交换网上的不同主机提供服务。网络层传输单位是数据报 功能: 路由选择与分组转发(最佳路径 )异构网络互联拥塞控制 数据交换方式 电路交换:通信时延小、有序传输、没有冲…

Linux探秘之用户态与内核态

https://www.cnblogs.com/bakari/p/5520860.html 一、 Unix/Linux的体系架构 如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核)。内核从本质上看是一种软件——控制计算机的硬件资源&…

哈夫曼算法证明+哈夫曼编码译码程序实现

哈夫曼算法证明 哈夫曼算法是一种贪心算法,我们考虑证明其最优子结构和贪心选择性质: 最优子结构:假设一个树是哈夫曼树,则以其任意节点为根节点的最大子树也是哈夫曼树。 证明:子树的根节点的值是其所有叶子节点出现…

Python3小知识

对于迭代器对象,Python默认赋值是将引用赋值,即指向同一片内存空间。为了实现对内存空间的赋值,我们可以使用分片进行深复制。例如: 当定义元组的时候,我们一般使用小括号将元素包围起来,也可以不使用括号…

汇编:实现日历星期数查询工具

编制一个简单日历查询工具,输入年、月、日,能够判断当日的星期数,并进行输出,数据的输入和结果的输出要有必要的提示,且提示独占一行。 查阅资料 ​ 经过查阅资料,发现有两个相关的算法可以解决这个问题&…

Linux C 实现一个简单的线程池

https://www.cnblogs.com/GyForever1004/p/9185240.html 线程池的定义 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级…

斐波那契数列求解+尾递归

1.普通递归 这里观察f[4]的递归树代替f[10]的递归树(后者比较大,画不下)。 使用递归求解的时候复杂度为T(n)T(n−1)T(n−2)T(n)T(n-1)T(n-2)T(n)T(n−1)T(n−2),观察递归树,发现降速最快的是最右边每次减2&#xff0c…

LCS最长公共子串

问题介绍 LCS问题(longest common subsequence problem)指的是求解两个字符串最长公共子序列问题。这里的子序列是可以不连续的。LCS问题广泛地出现在计算生物学中(DNA序列、系统生成树等等)。这里介绍如何解决LCS问题,以及算法的正确性证明…

操作系统【六】虚拟内存

传统存储管理方式的不足 一次性:作业必须一次性全部装入内存后才能开始运行。这会造成:当作也很大时不能全部装入内存;当大量作业要求运行时,由于内存无法容纳所有作业,因此只有少量作业能够运行,导致多道…

SQL Server【一】简介和基本概念和命令

数据结构和数据库的区别 数据库是应用软件级别研究数据的存储和操作(主要针对磁盘上的数据) 数据结构是在系统软件级别研究数据的存储和操作(主要是针对内存中的数据) 对硬盘数操作是数据库的强项,是数据库研究的核心…

Linux下网络socket编程——实现服务器(select)与多个客户端通信

一、关于socket通信 服务器端工作流程: 调用 socket() 函数创建套接字 用 bind() 函数将创建的套接字与服务端IP地址绑定调用listen()函数监听socket() 函数创建的套接字,等待客户端连接 当客户端请求到来之后调用 accept()函数接受连接请求&#xff0c…

SQL Server【四】

identity 主键自动增长,用户不需要为identity修饰的主键赋值 create table student (std_id int primary key identity(10,5),--(10,5)可以省略,默认为(1,1)std_name nvarchar(200) not null ) select * from student insert into student values (张三…

计算机网络【4】传输层

概述 传输层是只有主机才有的层次 传输层的功能: 传输层提供进程和进程之间的逻辑通信(网络层提供主机与主机之间的逻辑通信)复用和分用传输层对收到的报文进行差错检测 传输层有两个协议: 面向连接的传输层控制协议TCP&…

计算机网络【0】概述

计算机网络概念和功能 概念 是一个将分散的、具有独立功能的计算机系统,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统。 计算机网络是互连的、自治(无主从关系)的计算机集合。 功能 数据通信&am…

计算机网络【1】物理层

物理层解决如何在连接各种计算机的传输媒体上传输数据比特流,而不是指具体的传输媒体。 确定与传输媒体接口有关的特性 机械特性:定义物理连接的特性,如规格、接口形状、引线数目、引脚数目、排列电气特性:规定传输二进制位时的电…