Linux五种IO模型

1.阻塞IO模型

这是一种最传统的一种IO模型,即在读写数据过程中会发生阻塞现象
也是最简单的IO模型,一般表现为进程或县城等待某个条件,如果条件不满足,
则一直等待下去,如果条件满足,则进行下一步操作
应用进程通过系统调用recvfrom接收数据,但由于内核还没准备好数据,应用进程
就会阻塞,知道内核准备好数据,recvfrom完成数据报的复制工作,应用进程才能结束阻塞状态
在这里插入图片描述

2.非阻塞IO模型

应用进程与内核进行交互,目的未达到之前,不再一味地等待,而是直接返回
然后通过轮询的方式,不停地询问内核数据有没有准备好,如果某一次轮询时发现数据
已经准备好了,那么就把数据复制到用户空间
应用进程通过recvfrom不停地与内核交互,直到内核准备好数据。如果没有准备好
内核会返回error,应用进程在得到error后,过一段时间再发送recvfrom请求,
在两次请求的时间间隔,进程可以做别的事情
在这里插入图片描述

3.信号驱动IO模型

应用进程预先向内核注册一个信号处理函数
然后用户进程不阻塞直接返回,当内核数据准备就绪时
会发送一个信号给进程,用户进程在信号处理函数中把数据
复制到用户空间,实现比较复杂
在这里插入图片描述

4.IO复用模型

多个进程的IO可以注册到同一个管道上,这个管道会统一和内核进行交互
当管道中的某一个请求需要的数据准备好之后,进程再把对应的数据复制到用户空间
IO多路转接是多了一个select函数,多个进程的IO可以注册到同一个select上,当用户进程调用该select时
select会监听所有注册好的IO,如果所有被监听的IO需要的数据都没有准备好,那么select调用进程会阻塞
当任意一个IO所需要的数据准备好之后,select调用就会返回,然后进程通过recvfrom实现数据复制
这里并没有向内核注册信号处理函数,所以IO复用模型并不是非阻塞的,进程在发出select后
要等select监听的所有IO操作中至少一个需要的数据准备好,才会由返回值,并且需要再次发送请求去执行文件的复制
阻塞IO模型,非阻塞IO模型,IO复用模型和信号驱动IO模型都是同步的IO模型,因为无论哪种模型
真正的数据复制过程都是同步进行的
在这里插入图片描述

5.异步IO模型

应用进程把IO请求传给内核后,完全由内核去完成文件的复制。
内核完成相关操作后,会发送信号告诉应用进程本次IO操作已经完成
用户进程发起aio_read操作之后,给内核传递描述符、缓冲区指针、缓冲区大小等
告诉内核当整个操作完成时,如何通知进程,然后就立刻去做其他事情了,
当内核收到aio_read后会立刻返回,然后开始等待数据准备,数据准备好之后,直接把
数据复制到用户空间,然后通知本次IO操作已经完成
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

coffee_babe

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

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

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

打赏作者

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

抵扣说明:

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

余额充值