五分钟带你了解IO模型

1.IO基础

在网络环境下,通俗的讲,将IO分为两步:

  1. 等;

  1. 数据搬迁。

如果要想提高IO效率,需要将等的时间降低。

五种IO模型包括:

同步IO模型

  • 阻塞IO、

  • 非阻塞IO、

  • 信号驱动IO、

  • IO多路转接、

异步IO模型

  • 异步IO。其中,前四个被称为同步IO。

2.举个栗子加深理解

在介绍五种IO模型时,拿生活找工作投简历为例:

  • 阻塞IO(blocking I/O)

A在网上投了简历,并且一直在电脑跟前等,在等的时候不做其他的事情,十分专心。只有简历被捞的时候,才结束掉等的动作,进入面试。

在内核将数据准备好之前,系统调用会一直等待所有的套接字,默认的是阻塞方式。其实,例子中所说的简历就是一个文件描述符。这个模型是我们最常见的,程序调用和我们编写的基本程序是一致的。

fd=connect();
write(fd);
read(fd);
close(fd

程序的read必须在write之后执行,当write阻塞住了,read就不能执行下去,一直处于等待状态。

  • 非阻塞IO(noblocking I/O)

B也在找工作投简历,但是B不想将自己的所有时间都花费在投简历上,在等面试通知这个时间段中,B也在做其他的事情(一会上上课,一会敲敲代码,一会又去看其他人考研等),但B在做这些事情的时候,每隔一个固定的时间查看手机简历是否被捞。一旦检查到有公司捞走简历,就停下手中的事情,专心准备面试找工作。其实,B在检查简历是否被捞,是一个轮询的过程。

每次客户询问内核是否有数据准备好,即文件描述符缓冲区是否就绪。当有数据报准备好时,就进行拷贝数据报的操作。当没有数据报准备好时,也不阻塞程序,内核直接返回未准备就绪的信号,等待用户程序的下一个轮寻。

但是,轮寻对于CPU来说是较大的浪费,一般只有在特定的场景下才使用。

  • 信号驱动IO(signal blocking I/O)

C也在找工作投简历,但与A、B不同的是,C比较聪明,他给面试APP设置了特别关心,当有公司捞走简历的时候,这个铃铛就会被碰响,C就会赶紧去准备面试。

信号驱动IO模型,应用进程告诉内核:当数据报准备好的时候,给我发送一个信号,对SIGIO信号进行捕捉,并且调用我的信号处理函数来获取数据报。

  • IO多路转接(I/O multiplexing)

D同样也在找工作投简历,但是D人脉比较好,D拿了很多的内推码,一次性可以投递多家公司,D不断的查看每个内推码是否有公司招聘。增加了效率,减少了等待的时间。

IO多路转接是多了一个select函数,select函数有一个参数是文件描述符集合,对这些文件描述符进行循环监听,当某个文件描述符就绪时,就对这个文件描述符进行处理。其中,select只负责等待,recvfrom只负责拷贝。

IO多路转接是属于阻塞IO,但可以对多个文件描述符进行阻塞监听,所以效率较阻塞IO的高。

  • 异步IO(asynchronous I/O)

E也想找工作,但E有事情,于是他雇来了F(猎头公司),让F帮他找工作投简历,一旦有公司捞走简历,F就打电话给E,E就会去准备面试。

当应用程序调用aio_read时,内核一方面去取数据报内容返回,另一方面将程序控制权还给应用进程,应用进程继续处理其他事情,是一种非阻塞的状态。当内核中有数据报就绪时,由内核将数据报拷贝到应用程序中,返回aio_read中定义好的函数处理程序。

但是很少有Linux系统支持,Windows的IOCP就是该模型。

阻塞程度:阻塞IO>非阻塞IO>多路转接IO>信号驱动IO>异步IO,效率是由低到高的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值