Linux之五种IO模型

根据维基百科的定义,IO指的是输入输出,通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出。简而言之,从硬盘中读写数据或者从网络上收发数据,都属于IO行为。

一、输入操作的步骤
1、等待操作系统内核把数据准备好
2、将数据从操作系统内核复制到用户进程空间

二、Unix 五种IO模型
Blocking IO - 阻塞IO
NoneBlocking IO - 非阻塞IO
IO multiplexing - IO多路复用
signal driven IO - 信号驱动IO
asynchronous IO - 异步IO

1、Blocking IO - 阻塞IO
当进程采用系统调用时,进程会一直被阻塞,知道内核吧所有需要的数据准备好,之后再由内核缓冲区复制到用户态,期间,用户进程什么也不做,只是无谓的等待。
在这里插入图片描述
当用户进程调用了recvfrom这个系统调用,kernel就开始了IO的第一个阶段:准备数据。对于network IO来说,很多时候数据在一开始还没有到达(比如,还没有收到一个完整的UDP包),这个时候kernel就要等待足够的数据到来。而在用户进程这边,整个进程会被阻塞。当kernel一直等到数据准备好了,它就会将数据从kernel中拷贝到用户内存,然后kernel返回结果,用户进程才解除block的状态,重新运行起来。
所以,blocking IO的特点就是在IO执行的两个阶段(准备数据和复制数据)都被block了。

2、NoneBlocking IO - 非阻塞IO
内核在没有准备好数据的时候会返回错误码,而调用程序不会休眠(阻塞),而是不断轮询询问内核数据是否准备好
在这里插入图片描述
从图中可以看出,当用户进程发出recvfrom这个系统调用后,如果kernel中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一个结果(no datagram ready)。从用户进程角度讲 ,它发起一个操作后,并没有等待,而是马上就得到了一个结果。用户进程得知数据还没有准备好后,它可以每隔一段时间再次发送recvfrom操作。一旦kernel中的数据准备好了,并且又再次收到了用户进程的system call,那么它马上就将数据拷贝到了用户内存,然后返回。
所以,用户进程其实是需要不断的主动询问kernel数据好了没有。

3、IO multiplexing - IO多路复用
类似于非阻塞,只不过轮询不是由用户线程去执行,而是由内核去轮询,内核监听程序监听到数据准备好后,调用内核函数复制数据到用户态。

其包含:select、poll和epoll,下面以select为例:
在这里插入图片描述
看起来它与blocking I/O很相似,两个阶段都阻塞。但它与blocking I/O的一个重要区别就是它可以等待多个数据报就绪(datagram ready),即可以处理多个连接。这里的select相当于一个“代理”,调用select以后进程会被select阻塞,这时候在内核空间内select会监听指定的多个datagram (如socket连接),如果其中任意一个数据就绪了就返回。此时程序再进行数据读取操作,将数据拷贝至当前进程内。由于select可以监听多个socket,我们可以用它来处理多个连接。

4、signal driven IO - 信号驱动IO
使用信号,内核在数据准备就绪时通过信号来进行通知
在这里插入图片描述
信号驱动式IO是指让操作系统内核在文件描述符就绪时发送信号给用户进程,这样一来用户进程只要调用sigaction后就能立即返回,不会被阻塞。当操作系统的文件描述符就绪时,会发送信号给用户进程,用户进程再调用recvfrom开始IO操作。但是复制数据期间,用户进程是阻塞的。

5、asynchronous IO - 异步IO
异步IO依赖信号处理程序来进行通知
不过异步IO与前面IO模型不同的是:前面的都是数据准备阶段的阻塞与非阻塞,异步IO模型通知的是IO操作已经完成,而不是数据准备完成
异步IO才是真正的非阻塞,主进程只负责做自己的事情,等IO操作完成(数据成功从内核缓存区复制到应用程序缓冲区)时通过回调函数对数据进行处理。
在这里插入图片描述
读取操作会立刻返回,程序可以进行其它的操作,所有的读取、拷贝工作都由内核去做,做完以后通知进程,进程调用绑定的回调函数来处理数据。

三、区分一下两组概念:

阻塞与非阻塞
阻塞是指:系统调用在直到数据准备完成才有返回值,其间用户进程和调用都只是无谓的等待
非阻塞是指:系统调用和用户进程会一直轮询,一直会有返回值。返回值如果是还没有准备好数据,则用户进程去做其他事。

同步与异步
同步:在准备数据和复制数据期间会让进程休眠(“阻塞”)。所以前四种IO模型都属于同步
异步:在准备数据和复制数据期间进程去做其他事情,这两个阶段完全不用管。就像雷军最近的屏保:能不管的事情,尽量不管。

最后贴一张五种模型的对比图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值