五种IO模型

  了解了什么是阻塞什么是非阻塞和同步和异步理解起来五种IO模型就很容易了。

  五种IO模型:阻塞IO、非阻塞IO、信号驱动IO、多路转接IO、异步IO

  阻塞IO:

   

阻塞IO是最简单的一种,也就是所进程在等待某个条件的时候如果条件不满足就一直等待下去,一直到满足了再去执行下一个操作。这里再拿一个比较广泛的例子来说一下,就是钓鱼的例子,在网上浏览一些文章的时候会发现很多都是用这个例子来解释的。对于阻塞IO来说,当你钓鱼的时候,拿一根鱼竿就一直在等待,直到鱼上来,但是缺点就是比较耗费时间,不过对于那些对鱼的需求量小的时候可使用,阻塞IO并发性和时效性都比较低。

非阻塞IO是,我们在钓鱼的时候在等鱼上钩的过程中,我们可以去做其他事情,打王者,看电影等等。在内核中就是非阻塞IO,应用进程和内核交互,当还没有数据来时候,不再等待,而是直接返回,然后通过轮询的方式,不断的去问内核数据有没有准备好,如果某一次轮询之后发现准备好了,就直接把数据拷贝到用户空间中去。这样在某种程度上就提升了时间的利用率。

信号驱动IO,上边的非阻塞IO,虽然我们可以做别的事情,但是我们还是要不断的去查看鱼竿的状态,也就是不断的轮询到底好了没有。信号驱动IO就好像我们给鱼竿安了一个报警装置,当有鱼的时候立马报警,我们收到信息之后,把鱼竿拿起来就可以了,在操作系统中,我们会调用函数,当条件不满足的时候就等着操作系统给我们发送一个信号, 当我们收到信号了,就说明条件满足了,可以进行后续处理了。也就是进程会预先向内核注册一个信号处理函数,然后进程返回,并且不阻塞,当内核中数据准备就绪的时候就发送一个信号给进程。

当我们想大量钓鱼的时候怎么办?我们可以同一时间摆放多个鱼竿,等哪个鱼竿有鱼的时候,我们就处理哪个鱼竿,这就是Linux里边的IO复用模型,我们让多个进程的IO注册到同一个数据结构中,这个数据结构会统一和内核进行交互,当结构中某个数据准备好的时候,进程就把对应的数据拷贝到用户空间中。这里的IO复用模型,并没有向内核注册信号处理函数,所以他是阻塞的,这种方式可以有效的提升效率。

 我们上边说到的四种模型都是同步的,为什么信号驱动是同步的?难道信号驱动不是异步的吗?因为以上无论哪种模型真正的数据拷贝过程都是同步进行的,信号驱动,内核是在数据准备好之后通知进程,进程再通过recvfrom操作进行数据拷贝,我们可以认为数据准备阶段是异步的,但是数据拷贝阶段是同步的。拿钓鱼来说,钓鱼我们简单的分成两个步骤,一个是鱼上钩它对应了操作系统中的内核准备过程,也就是说鱼上钩了代表着数据到达操作系统内核了,但是还需要第二步,也就是把鱼钓上来对应着把数据拷贝到我们对应进程的空间,所以无论上边哪种方式都是由我们人来去把鱼钓上来,所以钓鱼过程其实还是一个同步的过程。

那有没有真正意义上的异步呢?是有的,就比如我们这里采用更高级的鱼竿,全自动的,他会帮我们自动的钓鱼,然后把鱼放到桶里,之后告诉我们我钓上来了鱼了,我去钓下一条鱼了。

在操作系统中当我们把IO请求传给内核之后,完全由内核去操作文件拷贝,内核完成之后会发信号告诉进程这次的IO完成了。

   对于五种IO模型的对比

  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值