操作系统的IO模型总结

一、下面就以应用程序需要从网卡中读取数据为例,整体IO交互流程主要分成如下几个步骤:

1、应用程序调用内核提供的函数发起请求数据(请求内核函数)

2、内核访问网卡存储空间获取数据(内核获取数据)

3、内核将获取的到数据复制到用户空间(内核复制数据)

4、应用程序从用户空间中获取需要的数据(应用程序获取数据)

二、介绍操作系统的IO模型之前,可以先了解下和IO模型的分类
主要有同步IO,异步IO,阻塞IO,非阻塞IO。

同步IO:应用程序调用内核函数到最终应用程序获取数据的整个流程是需要用户线程一次性完成的
那么就是同步IO。
异步IO:应用程序调用内核函数请求获取数据和最终从用户空间获取数据不是一次性完成的 而是先请求数据,等数据全部准备好之后在获取就是异步IO。
阻塞IO:应用程序调用内核函数请求数据,如果此时还没有数据,那么应用程序就一直等待着 直到成功拿到数据为止 此时应用程序一直处于等待状态的 那么就是等待阻塞IO。
非阻塞IO:应用程序调用内核函数请求数据 如果此时还没有数据 那么应用程序就不等待先去处理其他事情 过一会儿再去尝试请求 直到获取数据为止 此时应用程序进程不会一直处于等待状态,那么就是非阻塞IO。

三、操作系统的IO模型
操作系统的IO模型 主要分为同步IO以及异步IO两大类,而同步IO又分为阻塞和非阻塞等待类,异步IO不会出现阻塞IO情况  所以异步IO肯定是非阻塞IO。操作系统的IO模型主要是分为 如下几种类型:
步骤:tips:操作系统给应用程序提供了recv函数,该函数用于从socket套接字中接收数据,默认情况下会等到网络数据接收完成并复制到用户空间之后才返回结果或者失败之后返回结果,可以通过flags参数设置如果没有数据的话立即返回
[操作系统的IO交互模型](https://www.cnblogs.com/jackion5/p/13544927.html)结果
四、应用程序从网卡中读取数据的步骤

先说明一下 网卡是一个将数据从串行数据传输到并行传输的过程
整体交互的IO流程主要为:
①首先应用程序会去调用内核提供的函数去请求内核数据
②内核会去访问网卡的数据存储空间获取数据
③内核会将获取到的数据复制到用户空间
④应用程序会去用户空间读取需要的数据

五、操作系统会给应用程序提供一个叫recv的函数 这个函数会送socket套接字中接收数据, 默认情况下会等到网络数据接收完成并复制到用户空间之后才会返回结果或者失败之后返回结果
了一通难过flags参数设置如果没有数据的话立即返回结果。


六、同步阻塞IO
应用程序调用操作系统的recv函数 recv函数默认会等待数据接收完成并复制到用户空间之后才返回结果
如果数据没有准备好的话 那么应用程序就会一直处于等待状态,直到有数据才会返回。此时应用程序会处于阻塞状态  也就无法执行其他操作。

同步非阻塞IO

应用程序调用操作系统的recv函数  recv设置的值为立即返回  那么操作系统内核没有发现数据就会立即返回  应用程序得到结果之后就会立即返回

不再等待 而是去先处理其他业务 然后轮训不断地去尝试获取数据 此时程序不处于阻塞状态  可以先去处理其他操作  最重要的就是设置了一个flags标志位。

同步多路复用IO

应用程序先会调用操作系统的select函数或者poll函数 或者epoll函数,这几个函数的作用就是监听网络套接字上的数据状态

如果数据可读 那么就会通知应用程序   此时应用程序才回去调用recv函数  从套接字中读取数据  此时肯定是可以读取到数据的。可以发现IO多路复用的特点就是不需要尝试获取数据

而是开启另一个线程来监控数据状态   等到有数据的时候在同步获取数据  而在没有数据的时候也咩有必要一直砸等待,而失去执行其他业务。多路复用IO 调用select函数也会阻塞进程

但是不会将真正的IO线程阻塞,所以实质上是同步非阻塞IO。

同步信号驱动IO

通过调用sigaction函数注册信号函数,等内核数据准备好了之后会执行信号函数, 等内核数据准备好之后 执行信号函数通知应用程序  应用程序此时再调用recv函数同步获取数据。信号驱动IO与异步IO

有点类似  都是异步通知的,不同的是信号驱动IO的真正读取数据的操作还是同步读取数据的。

异步非阻塞IO

通过调用aio_read函数,那么内核就会先将数据准备好  并且复制到用户空间之后  再执行回调函数通知应用程序  此时应用程序就会直接从用户空间读取数据

而不需要从内核中读取数据了。

IO操作主要分为两个阶段    1.数据准备阶段

2.数据从内核空间复合到用户空间阶段

3.阻塞IO、非阻塞IO、多路复用IO以及信号驱动IO只是在第一个阶段不同,而第二个阶段是相同的,都是需要阻塞当前线程等待数据复制完成

虽然阻塞的时间足够短  所以只要执行第二阶段的都是同步IO。

4.异步IO模型的第一阶段和第二阶段都是主动完成   再两个阶段都不会阻塞当前线程 去处理其他事情。

而异步IO模型的第一阶段以及第二阶段都是内核主动完成,再两个阶段都不会阻塞当前线程去处理其他事情。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tronhon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值