初识五种高级IO模型

在谈五种高级IO之前,首先我们要明白,站在用户层面:IO = 等 + 数据拷贝(读写数据),读/写分为两步:等数据就绪,然后再读。
高级IO模型,大类可分为同步和异步两种,需要注意的是,这里的同步不等同于线程的同步,本文会做详细说明,大家一定不要混淆!
以下IO在介绍的时候,都以钓鱼为例。

一、同步IO

  • 阻塞IO
    在内核将数据准备好之前,系统调用会一直等待,所有的套接字,默认都是阻塞方式。

    例如:小米去钓鱼时,坐在河边一动不动盯着鱼竿,直到有鱼上钩。

  • 非阻塞IO
    如果内核还未将数据准备好,系统调用仍然会直接返回,并且返回EWOULDBLOCK错误码。

    例如:小涛去钓鱼时,并不是像小米一样啥都不做盯着鱼竿,而是一会刷微博,一会聊微信,过一会看看鱼竿有动静没,要是没动静,继续干自己的事情。像小涛这种钓鱼方式就是轮询的方式。

  • 信号驱动IO
    内核将数据准备好的时候,使用SIGIO信号通知应用程序进行IO操作

    例如:小花钓鱼时很聪明,在鱼竿上绑了铃铛,然后他去干别的事情,铃铛一想,小花就来收鱼,此时铃铛的响声就类似于信号。

  • IO多路转接
    IO多路转接能同时等待多个文件描述符的就绪状态。此时需要注意的是,应用进程调了select!!!如下图:
    在这里插入图片描述
    例如:小明钓鱼时装了一卡车的鱼竿,然后哪个鱼竿有鱼就去捞。

【划重点】:
此处的等是由select完成的;
虽然多路转接和阻塞的方式类似,但是很明显多路转接的效率更高

二、异步IO

  • 由内核在数据拷贝完成时,通知应用程序(而信号驱动是告诉应用程序何时可以开始拷贝)
    例如:老板让司机去钓鱼

三、总结

  • 阻塞 和 非阻塞比较
    (1)阻塞和非阻塞关注的是程序在等待调用结果时(消息,返回值)的状态。(等的方式不一样)

    (2)阻塞调用是指调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才会返回。

    (3)非阻塞调用是指在不能立刻得到结果之前,该调用不会阻塞当前线程

  • 同步通信 和 异步通信
    (1)同步是指在发出一个调用时,在没有得到结果之前,该调用就不返回,但是一旦调用返回,就得到返回值,即调用者主动等待调用的结果。

    (2)异步则相反,调用一经发出,直接返回,所以这个调用没有返回结果;即当一个异步调用发出后,调用者不会立即得到结果,而是在调用发出后,被调用者通过状态、通知来通知调用者,或者通过回调函数来处理这个调用。

【这里的同步不等同于进程/线程同步】

  • 进程/线程同步也是进程/线程之间的制约关系。
  • 是为完成某种任务而建立的两个或多个线程,这个线程需要在某些位置上协调它们的工作次序而等待。

四、必须知道的几个问题

  • 如何让IO更高效?

    一开始我们就介绍了任何IO = 等 + 数据拷贝,而在实际场景中,等耗费的时间往往更多,所以提高IO的效率,最重要的是减少等待的时间。

  • 进程等待是如何等待的?

    进程等待时是阻塞式等待,进程被挂起,并且状态由R变为S,当有数据就绪时,操作系统把进程拿到运行队列中,进程状态变为R。

  • 进程读数据是从哪读的?

    进程读数据时从文件描述符和套接字中读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值