linux 的五种 IO 模型

linux 的五种 IO 模型

  • 在java中,主要有三种IO模型,分别是阻塞IO(BIO)、非阻塞IO(NIO)和异步IO(AIO);

  • java中提供的IO有关的API,在文件处理的时候,其实依赖操作系统层面的IO操作实现的。

  • 在linux操作系统中,共五种,分别是:阻塞IO模型、非阻塞IO模型、IO复用模型、信号驱动IO模型以及异步IO模型。

  • IO 指把数据从硬件(硬盘)中读取到用户空间中,中间过渡的空间称为内核空间。

1.阻塞IO模型
在这里插入图片描述
应用进程通过系统调用 recvfrom 接收数据,但由于内核还未准备好数据报,应用进程就会阻塞住,直到内核准备好数据报, recvfrom 完成数据报复制工作,应用进程才能结束阻塞状态。

  • 实现简单,并发低,时效性要求低。

2.非阻塞IO模型
在这里插入图片描述

  • 应用进程于内核交互,目的未达到之前,不再一味的等待,而是直接返回。然后通过轮询的方式,不停的去问内核数据是否准备好。如果某一次轮询发现数据已经准备好了,就将数据拷贝到用户空间中;如果没有准备好内核会返回error。
  • 两次请求间隙可以完成其他任务,增加时间利用率。

3.信号驱动 IO 模型
在这里插入图片描述

  • 应用进程在读取文件时通知内核,如果某个socket的某个事件发生时,请向我发一个信号。在收到信号后,信号对应的处理函数会进行后续处理。
  • 应用进程预先向内核注册一个信号处理函数,然后用户进程返回,并且不阻塞,当内核数据准备就绪时会发送一个信号给进程,用户进程便在信号处理函数中开始把数据拷贝到用户空间中。
  • 实现复杂
  1. IO 复用模型
    在这里插入图片描述
  • 多个进程的IO可以注册到同一个管道上,这个管道会统一和内核进行交互。当管道中的某一个请求需要的数据准备好之后,进程再把对应的数据拷贝到用户空间中。
  • IO多路转接时多了一个select函数,多个进程的IO可以注册到同一个select上,当用户进程调用该select,select会监听所有注册好的IO,如果所有被监听的IO需要数据都没有准备好时,select调用进程会阻塞。当任意一个IO所需的数据准备好之后,select调用就会返回,然后进程在通过recvfrom来进行数据拷贝。
  • 这里的IO复用模型,并没有向内核注册信号处理函数,所以,他并不是非阻塞的。进程在发出select后,要等到select监听的所有IO操作中至少有一个需要的数据准备好,才会有返回,并且也需要再次发送请求去进行文件的拷贝。
  • 有效的提舍效率。

上面四种都是同步的,真正数据拷贝过程,都是同步进行的。

信号驱动,是内核在数据准备好之后通知进程,然后进程再通过recvfrom操作进行数据拷贝。可以认为数据准备阶段是异步的,但是,数据拷贝依然是同步的,所有整个过程也不能认为是异步的。

5.异步 IO 模型

  • 应用进程把IO请求传给内核后,完全由内核去操作文件拷贝。内核完成相关操作后,会发信号告诉应用进程本次IO已经完成。
    在这里插入图片描述
    用户进程发起 aio_read 操作之后,给内核传递描述符、缓冲区指针、缓冲区大小等,告诉内核当整个操作完成时,如何通知进程,然后立即去做其他事情了。当内核收到 aio_read 后,会立刻返回,然后等待数据准备,准备好后拷贝到用户空间,然后通知本次IO已经完成。

5中IO模型对比

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_35958788/article/details/93708886