五种IO模型:同步阻塞I/O、同步非阻塞I/O、同步I/O复用模型、同步信号驱动I/O、异步I/O模型

news/2024/7/23 22:01:39 标签: linux, 服务器, 网络

五种编程模型

1、同步异步,阻塞非阻塞区别联系

实际上同步与异步是针对应用程序与内核的交互而言的。同步过程中进程触发IO操作并等待(也就是我
们说的阻塞)或者轮询的去查看IO操作(也就是我们说的非阻塞)是否完成。异步过程中进程触发IO操作以后,直接返回,做自己的事情,IO交给内核来处理,完成后内核通知进程IO完成。

同步和异步针对应用程序来说的,关注的是程序中间的协作关系;阻塞与非阻塞更关注的是单个进程的执行状态。

同步有阻塞和非阻塞之分,异步没有,它一定是非阻塞的。

对于一个network IO ,它会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就
是系统内核(kernel)。当一个read操作发生时,它会经历两个阶段:

1、等待数据准备
2、将数据从内核拷贝到进程中

阻塞、非阻塞、多路IO复用,都是同步IO,异步必定是非阻塞的,所以不存在异步阻塞和异步非阻塞的说法。真正的异步IO需要CPU的深度参与。换句话说,只有用户线程在操作IO的时候根本不去考虑IO的执行,全部都交给CPU去完成,而自己只等待一个完成信号的时候,才是真正的异步IO。

所以,拉一个子线程去轮询、去死循环,或者使用select、poll、epool,都不是异步。

同步:执行一个操作之后,进程触发IO操作并等待(也就是我们说的阻塞)或者轮询的去查看IO操作(也就是我们说的非阻塞)是否完成,等待结果,然后才继续执行后续的操作。

异步:执行一个操作后,可以去执行其他的操作,然后等待通知再回来执行刚才没执行完的操作。

阻塞:进程给CPU传达一个任务之后,一直等待CPU处理完成,然后才执行后面的操作。

非阻塞:进程给CPU传达任我后,继续处理后续的操作,隔断时间再来询问之前的操作是否完成。这样的过程其实也叫轮询。

2、IO模型(五种编程模型)

这里统一使用Linux下的系统调用recv作为例子,它用于从套接字上接收一个消息,因为是一个系统调
用,所以调用时会从用户进程空间切换到内核空间运行一段时间再切换回来。默认情况下recv会等到网络数据到达并且复制到用户进程空间或者发生错误时返回,而第4个参数flags可以让它马上返回。

• 阻塞IO模型

使用recv的默认参数一直等数据直到拷贝到用户空间,这段时间内进程始终阻塞。A同学用杯子装水,
打开水龙头装满水然后离开。这一过程就可以看成是使用了阻塞IO模型,因为如果水龙头没有水,他也要等到有水并装满杯子才能离开去做别的事情。很显然,这种IO模型是同步的。
在这里插入图片描述
• 非阻塞IO模型

改变status,让recv不管有没有获取到数据都返回,如果没有数据那么一段时间后再调用recv看看,如
此循环。B同学也用杯子装水,打开水龙头后发现没有水,它离开了,过一会他又拿着杯子来看看……在中间离开的这些时间里,B同学离开了装水现场(回到用户进程空间),可以做他自己的事情。这就是非阻塞IO模型。但是它只有是检查无数据的时候是非阻塞的,在数据到达的时候依然要等待复制数据到用户空间(等着水将水杯装满),因此它还是同步IO。
在这里插入图片描述
• IO复用模型

这里在调用recv前先调用select或者poll,这2个系统调用都可以在内核准备好数据(网络数据到达内核)
时告知用户进程,这个时候再调用recv一定是有数据的。因此这一过程中它是阻塞于select或poll,而
没有阻塞于recv,有人将非阻塞IO定义成在读写操作时没有阻塞于系统调用的IO操作(不包括数据从内
核复制到用户空间时的阻塞,因为这相对于网络IO来说确实很短暂),如果按这样理解,这种IO模型也
能称之为非阻塞IO模型,但是按POSIX来看,它也是同步IO,那么也和楼上一样称之为同步非阻塞IO
吧。

这种IO模型比较特别,分个段。因为它能同时监听多个文件描述符(fd)。这个时候C同学来装水,发现有一排水龙头,舍管阿姨告诉他这些水龙头都还没有水,等有水了告诉他。于是等啊等(select调用中),过了一会阿姨告诉他有水了,但不知道是哪个水龙头有水,自己看吧。于是C同学一个个打开,往杯子里装水(recv)。这里再顺便说说鼎鼎大名的epoll(高性能的代名词啊),epoll也属于IO复用模型,主要区别在于舍管阿姨会告诉C同学哪几个水龙头有水了,不需要一个个打开看(当然还有其它区别)。
在这里插入图片描述
• 信号驱动IO模型

通过调用sigaction注册信号函数,等内核数据准备好的时候系统中断当前程序,执行信号函数(在这里
面调用recv)。D同学让舍管阿姨等有水的时候通知他(注册信号函数),没多久D同学得知有水了,跑去装水。是不是很像异步IO?很遗憾,它还是同步IO(省不了装水的时间啊)。
在这里插入图片描述
• 异步IO模型

调用aio_read,让内核等数据准备好,并且复制到用户进程空间后执行事先指定好的函数。E同学让舍
管阿姨将杯子装满水后通知他。整个过程E同学都可以做别的事情(没有recv),这才是真正的异步IO。
在这里插入图片描述
总结
IO分两阶段:
1、 数据准备阶段
2、 内核空间复制回用户进程缓冲区阶段

一般来讲:阻塞IO模型、非阻塞IO模型、IO复用模型(select/poll/epoll)、信号驱动IO模型都属于同步
IO,因为阶段2是阻塞的(尽管时间很短)。只有异步IO模型是符合POSIX异步IO操作含义的,不管在阶段1还是阶段2都可以干别的事。

linux的五种IO模式/异步模式:
同步阻塞I/O
同步非阻塞I/O
同步I/O复用模型
同步信号驱动I/O
异步I/O模型


http://www.niftyadmin.cn/n/162988.html

相关文章

对象存储服务器请求返回的头文件信息

里云OSS 名称 描述 返回值示例 Server 服务器 AliyunOSS Date 创建日期 Sat, 18 Mar 2023 08:50:33 GMT Content-Type 互联网媒体类型 application/zip Content-Length 文件大小/字节 112075 Connection 联系 keep-alive x-oss-request-id 请求ID 64157B59…

SEO和反向链接对ASO的影响

Google Play中的搜索结果包括移动应用程序。谷歌可以索引移动应用程序的内容,如果它与特定的搜索查询相关,谷歌搜索结果可以包含来自应用程序商店的应用程序列表。 如果要将应用程序编入Google的索引,我们需要将应用程序与网站相关联。这样谷…

【SpringBoot】SpringDataJPA实现分页排序

一、导读 如果一次性加载成千上万的列表数据,在网页上显示将十分的耗时,用户体验不好。所以处理较大数据查询结果展现的时候,分页查询是必不可少的。分页查询必然伴随着一定的排序规则,否则分页数据的状态很难控制,导…

Esp8266学习5. 红外信号收发实验

Esp8266学习5. 红外信号收发实验一、概述1. ESP8266红外功能及库2. 红外收发常见步骤二、发送端1. 电路接线2. 源代码3. sendSony介绍二、接收1. 源代码一、概述 1. ESP8266红外功能及库 ESP8266 支持通过红外接收器和红外LED进行红外收发功能。 ESP8266的红外收发功能需要借…

上市公司-共同富裕系列数据集:员工就业关键数据(2011-2021年)

1、数据来源:第三方2、时间跨度:2011-2021年3、区域范围:沪深A股上市公司4、指标说明:统计年度新增就业岗位(%)证券代码管理层性别多样性(%)证券简称职位竞争力与职业生涯管理&#…

git am 冲突解决

git am 冲突解决技巧 使用git am合patch的时候可能有冲突出现,这个时候,手动解决的办法是看看冲突在哪里, 然后手动的把那个patch和入。手动合入需要的时间太长. 我们可以用git apply --reject patch的方式合入。这里需要注意几个问题。 gi…

Faster R-CNN

Faster R-CNN的步骤 1. 输入任意大小的图片,经过CNN网络输出特征图,特征图用于共享RPN、ROI Pooling 2. 特征图经过RPN生成候选区域 3.候选区域与1.中的特征图共同输入到ROI Pooling得到每个候选区域的特征图,然后进行softmax分类&#xff0…

DFT简单介绍以及CP和FT测试介绍

相信很多ICer在Light芯片的过程中无论前端还是后端都听过DFT设计测试,DFT全称Desigh for Test(即可靠性设计),众所周知,测试的目的是为了保证芯片成品的质量以及功能逻辑的可靠性的必须措施,在十年前&#…