一个例子看懂IO模型

本片博客参考知乎大佬文章:100%弄明白5种IO模型 - 知乎

我们从用户B在TCP缓冲区读取数据这个案例来说起。

2.各种IO模型 

2.1阻塞IO

        应用程序发起recvfrom读取数据,从调用开始一直到数据准备完毕返回之前,应用程序一直处于一个阻塞等待的状态。

意思就是:当B要去缓冲区读取数据时,在内核数据没有准备好之前,会一直处于等待的状态,等到内核数据准备好了,并复制到用户空间,才会返回给B。

 

2.2非阻塞IO

        应用程序发起recvfrom读取数据,如果数据没有准备好,那么直接会返回一个错误的信息,不需要一直等待,也象征这如果你要读取数据,需要不断轮询的发起recvfrom请求,直到内核数据准备好了,然后才会复制到用户空间并返回。

意思就是:当B要去缓冲区读取数据时,发现数据还没有准备好,那么就直接返回,之后再轮询去读取,直到某次读取时刚好数据准备好了,然后复制到用户空间返回即可。

2.3IO多路复用

        假如此时有多个人同时向用户B发送信息,如果采用非阻塞IO的话,需要创建多个线程去读取数据,然后不断的轮询调用,这样效率很低,并且开销比较大。那么是否可以使用一个或几个线程去监听这些请求呢,IO复用就登场了。

fd也叫文件描述符,是一个非负的整数,本质上是一个索引值,是内核态为每个进程所记录其打开文件的记录表。 linux中也可以简单的理解为网络(此处也为读取)请求。

 IO多路复用的思路就是系统提供了一个函数去同时监听fd请求,监控的fd中只要有一个数据的状态准备就绪了,那么就会通知应用程序去recvfrom读取数据。函数有select、poll和epoll。

  • select缺点就是监听的IO数量有限,并且需要不断的轮询观察fd的状态,看此内核数据是否准备好了,所以大部分的轮询都是无效的。
  • poll解决了监听IO数量的限制问题,但是还是需要不断轮询观察,效率还是很低。
  • epoll采用的是事件监听回调的方式,可以迅速定位到相关fd上。

采用epoll函数的意思就是:应用程序将一个或多个fd传递注册到epoll函数中,阻塞在epoll操作上,epoll函数帮我们侦测每个fd是否准备就绪,当有fd准备就绪时,epoll返回数据可读状态,应用程序再调用recvfrom读取数据。

2.4信号驱动IO

应用程序想要读取数据时直接建立sigio信号处理程序,不需要等待,等到数据准备好了,会发送sigio信号回调,然后应用进程去recvfrom读取数据,内核数据拷贝到用户空间(此时的应用程序是阻塞的状态),则返回成功。

意思就是:因为采用IO复用select函数轮询的效率很低,采用一种信号驱动的方式,等到你准备好了,直接告诉我,然后我再去读取,这样效率就会提高。

 

可以发现IO多路复用核信号驱动IO都是需要两步操作的,一是看数据是否准备好,二是recvfrom去读取数据。

我们可以看到上面四种IO模型在内核数据拷贝到用户空间的这个过程,应用进程都是阻塞的。 

2.5异步IO

 异步IO真正做到了异步非阻塞,应用程序只需要发送read请求,然后直接返回,会自动完成内核将数据准备好并复制到用户空间返回。一劳永逸。

3.同步、异步、阻塞、非阻塞

  • 同步:程序的读取数据到最终完成,都需要自己来关心操作。
  • 异步:程序发出一个请求后,就不再参与了,一劳永逸,自动完成数据的读取。
  • 阻塞:当程序发起读取请求时,数据还没准备好时,继续在这里等待。
  • 非阻塞:当程序发起读取请求时,数据还没准备好时,直接返回。

由此,我们可以将IO模型进行归类:

4.Java NIO

4.1channel通道 

channel是一个全双工通道,可以通过此通道来读写数据,所有数据需要Buffer来进行处理。

4.2Buffer缓存

Buffer是用来与channel来进行交互的,数据是从Buffer写入通道,从通道读入缓冲区的。

4.3selector选择器

实现单个线程处理多个channel,用于检查每个channel的状态是否处于可读、可写。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值