1.分类

文件IO可以从不同的角度去分类,下面我们跟着小林来看一下几种分类

  • 缓冲IO和非缓冲IO
  • 直接和非直接IO
  • 阻塞和非阻塞、异步和同步IO

    2.缓冲IO和非缓冲IO

    区别:是否利用标准库的缓存机制访问文件

  • 缓冲IO:利用标准库的缓存机制,程序现将数据从缓存中读取或写入,然后再从缓存到文件

  • 非缓冲IO:直接系统调用文件

    3.直接和非直接IO

    区别:是否使用了操作系统的缓存机制

  • 直接IO: 直接访问文件系统,数据不会先读取到内核缓存

  • 非直接IO:数据会先到内核缓存,用户程序需要从内核缓存中复制数据,或者写数据到内核缓存中。

    4.阻塞和非阻塞IO

    在这里首先应该讲述一下,用户程序调用读取文件操作的一个流程。
  1. 用户程序读取一个文件,首先是等待文件数据拷贝到内核缓冲区中
  2. 之后需要从内核缓冲区中拷贝到用户空间中。

针对以上两个过程【等待数据拷贝到内核缓冲区】和【等待数据从内核缓冲区拷贝到用户空间】两种的不同表现,将IO方式分成了阻塞和非阻塞IO。

  1. 阻塞式IO

image.png

  • 用户程序调用读取文件。
  • 等待数据从磁盘拷贝到内核空间
  • 然后再等待内核空间到用户空间的拷贝
  1. 非阻塞式IO

image.png

  • 用户程序调用读取文件
  • 此时,用户程序不等待数据从磁盘->内核空间的拷贝。
  • 而是,一直轮询,询问是否已完成内核空间的数据准备
  • 一旦完成了内核空间数据准备,立刻从内核空间拷贝到应用程序。这一阶段是阻塞的。
    1. 非阻塞进阶之IO多路复用

上面的非阻塞IO是不是傻傻的,要轮询内核是否完成系统拷贝。于是可以使用发布订阅模式。通过事件。内核拷贝好了发消息给应用进程
image.png

  1. 小结

无论是阻塞IO、非阻塞IO或者说IO多路复用。都是同步IO,因为从内核->用户空间这个过程的数据拷贝都是需要等待的。

5.同步和异步IO

阻塞IO和非阻塞IO都是同步IO。那异步IO是什么样子的呢?
image.png

  • 用户进程发起系统文件读取调用
  • 系统会自动完成磁盘->内核数据拷贝和内核->用户空间的两次拷贝
  • 最后发送通知给用户程序。