五种I/O模型

五种I/O模型

引入

我们知道,为了操作系统安全性等考虑,进程是无法直接操作I/O设备的,必须通过系统调用请求内核协助完成I/O操作。
如图
在这里插入图片描述

I/O操作中的阻塞、非阻塞、同步、异步

  • 阻塞:阻塞就是调用一个函数,这个调用没有得到结果之前,执行这个函数的线程会被挂起。
  • 非阻塞:是指一个函数不能立刻得到结果,这个函数不会阻塞该线程而立即返回。
  • 同步:这个词的可能会造成一些误解,同步实际上是协同步调,在一个功能调用时,在这个调用没有得到结果之前,这个调用就不会返回。
  • 异步:在一个功能调用时,这个调用不会立即得到结果,也不会被阻塞该线程,其所在线程会继续做其他的事情。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。

五种I/O模型

在了解了以上概念后,我们再来看五种I/O模型。

  • 同步阻塞I/O
  • 同步非阻塞I/O
  • I/O多路复用
  • 信号驱动
  • 异步I/O
同步阻塞I/O

图示:
在这里插入图片描述

通过图示我们可以清楚地看到,同步阻塞I/O模式的方式为:
应用程序调用一个I/O函数,如果数据没有准备好,就将线程阻塞并等待数据完成(将数据从内核拷贝到用户空间),并成功返回。

同步非阻塞I/O

图示:
在这里插入图片描述
与同步阻塞I/O不同,非阻塞模型下,当应用程序调用I/O函数而数据没有准备好时,它会立马返回告知调用者。调用者采用这样轮询的方式请求I/O,直到数据完成(将数据从内核拷贝到用户空间),在这不断地试探当中,频繁地进行系统调用,会大量占用CPU。

I/O多路复用

图示:
在这里插入图片描述

多路复用简而言之就是使用一个线程来检查多个文件描述的的状态。图示中采用的是select方式,传入多个文件描述符,采用轮询的方式进行监听,如果有文件描述符就绪则返回。
熟知的多路复用有三种方式selectpollepoll。后续博客会详细解析。

信号驱动

图示:
在这里插入图片描述
首先要允许接口进行信号驱动I/O,然后安装一个信号处理函数,线程继续运行并不阻塞。当数据准备好时,线程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。

异步I/O

图示:
在这里插入图片描述
当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者的输入输出操作。

总结

处理I/O操作分为两个过程:
1.等待数据
2.把数据从内核中搬到用户空间。

这五中I/O模型的不同之处是在等待数据的方式上,在第二个过程中是一样的,都是把数据从内核中搬到用户空间,然后进行相关操作。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值