简述Linux下的5种I/O模型

在说正文之前我觉得有必要解释一下同步(synchronous)IO,异步(asynchronous)IO,阻塞(blocking)IO和非阻塞(non-blocking)IO到底是什么,有什么区别:

  • 同步/异步:同步和异步主要强调一种处理方对请求方的行为,主动权在处理方。在请求方向处理方发起一次请求调用时,处理方决定以何种方式向请求方发送数据,让请求方一直等待处理方把事情做完这就是同步,处理方告诉请求方,你去搞别的事吧,好了会通知你(可以通过状态,通知,回调来通知请求方),这就是异步。举一个简单的例子,你(请求方)打电话点外卖,问老板(处理方)鱼还有没有了。于是老板会说,“你等一下,我去查一下”,对于同步的方式,处理方老板选择让请求方你等,所以你就等啊等,等啊等,等了天昏地暗,海枯石烂,老板告诉你,鱼没有了。然而对于异步的方式,老板选择不让你等,有结果会打电话通知你,所以你会选择挂断电话,想起今天的报纸还没看,就去看报纸了,也不知道看了多久,老板打电话过来告诉你,鱼已经卖完了。

  • 阻塞/非阻塞:阻塞和非阻塞主要强调一种请求方在等待结果时的行为,主动权在请求方。阻塞指的是调用结果返回之前,当前线程会被“挂起”,调用线程只有在得到结果之后才会返回。而非阻塞是指在不能立刻得到结果之前,该调用不会阻塞当前线程。还是上面的例子,对于阻塞方式,当你问老板有没有鱼时,你会“挂起”自己,选择在电话那头一直等待结果,直到等到结果才恢复自由。对于非阻塞,你一直是自由状态的,可以选择挂断电话,做自己喜欢的事情,当然你会时不时打电话去问老板有没有结果了。

在理解了同步和异步,阻塞和非阻塞的区别之后,这还远远不够,很多人都会把同步和阻塞,异步和非阻塞混为一谈,其实这之间的区别还是挺大的。下面我们把这四种方式两两组合,依旧是那个例子来说明。

  • 同步阻塞:老板选择让你一直等待,而你也不能去做其他的事情,所以同步阻塞的表现是你在电话那头一直等待结果。

  • 同步非阻塞:老板选择让你一直等待,但是你可以一边等一边去做其他的事,而且你需要时不时打电话给老板问他有没有结果了,所以同步非阻塞的表现是你在电话那头一边等待一边看报纸,看一会打个电话问问老板有没有结果了。

  • 异步阻塞:老板选择让你不用一直等待,可以做其他的事情,他到时候会主动联系你告诉你结果,但是你是阻塞状态的,不能去做其他的事情。所以异步阻塞的表现是你挂掉电话,在家里一直等待老板的回复,期间你不能做任何事情,直到老板打来电话告诉你结果。

  • 异步非阻塞:老板选择让你不用一直等待,可以做其他的事情,他到时候会主动联系你告诉你结果,而且你也是非阻塞状态的,可以去做其他的事情。所以异步非阻塞的表现是你挂掉电话,去看报纸,老板过了不知多久会主动打来电话告诉你结果。


讲完了这些,是时候进入我们的正题了,linux下的io模型分为以下几种:

  • 阻塞I/O模型
  • 非阻塞I/O模型
  • I/O复用模型
  • 信号驱动模型
  • 异步I/O模型

当 I/O通信发生时,会涉及到两个对象,一个是调用I/O的进程或者线程,另一个是系统内核。同时,也会经历两个阶段,一个是数据准备,另一个是将数据从内核拷贝到进程中。

阻塞I/O模型.
这里写图片描述
我们可以看到当用户进程调用recvfrom时,系统便开始了I/O通信的第一个阶段,数据准备。数据是没有那么快准备好的,内核需要等待足够多的数据到来。一旦数据准备好,系统就会将数据从内核拷贝到进程中,并返回结果。整个过程,用户进程都是阻塞的,需要全程等待。

非阻塞I/O模型.
这里写图片描述
从图中可以看出,当用户进程调用recvfrom时,系统不会阻塞用户进程,而是直接返回一个ewouldblock错误,用户进程判断标志是ewouldblock时,就知道数据还没准备好,于是它就可以去做其他的事了,同时它也会轮询检查这个状态,看内核是不是有数据到来。一旦数据准备好之后,便会马上将数据从内核拷贝到用户进程中,然后返回。

I/O复用模型.
这里写图片描述
I/O复用模型最大的好处就是一个进程可以处理多个I/O操作。I/O复用模型会用到select、poll,这也会使进程阻塞,但是和阻塞I/O所不同的是,它可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O进行检测,直到有数据可读或可写时,才真正调用I/O。

信号驱动模型.
这里写图片描述
从图中,很明显可以看出用户进程不是阻塞的。首先用户进程建立SIGIO信号处理程序,并通过系统调用sigaction执行一个信号处理函数,这时用户进程便可以做其他的事了,一旦数据准备好,系统便为该进程生成一个SIGIO信号,去通知它数据已经准备好了,于是用户进程便调用recvfrom把数据从内核拷贝出来,并返回结果。

异步I/O模型.
这里写图片描述
当用户进程向内核发起某个操作后,会立刻得到返回,并把所有的任务都交给内核去完成(包括将数据从内核拷贝到用户自己的缓冲区),内核完成之后,只需返回一个信号告诉用户进程已经完成就可以了。

5中I/O模型的对比.
这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值