1.分类
文件IO可以从不同的角度去分类,下面我们跟着小林来看一下几种分类
- 缓冲IO和非缓冲IO
- 直接和非直接IO
-
2.缓冲IO和非缓冲IO
区别:是否利用标准库的缓存机制访问文件
缓冲IO:利用标准库的缓存机制,程序现将数据从缓存中读取或写入,然后再从缓存到文件
-
3.直接和非直接IO
区别:是否使用了操作系统的缓存机制
直接IO: 直接访问文件系统,数据不会先读取到内核缓存
- 非直接IO:数据会先到内核缓存,用户程序需要从内核缓存中复制数据,或者写数据到内核缓存中。
4.阻塞和非阻塞IO
在这里首先应该讲述一下,用户程序调用读取文件操作的一个流程。
- 用户程序读取一个文件,首先是等待文件数据拷贝到内核缓冲区中
- 之后需要从内核缓冲区中拷贝到用户空间中。
针对以上两个过程【等待数据拷贝到内核缓冲区】和【等待数据从内核缓冲区拷贝到用户空间】两种的不同表现,将IO方式分成了阻塞和非阻塞IO。
- 阻塞式IO
- 用户程序调用读取文件。
- 等待数据从磁盘拷贝到内核空间
- 然后再等待内核空间到用户空间的拷贝
- 非阻塞式IO
- 用户程序调用读取文件
- 此时,用户程序不等待数据从磁盘->内核空间的拷贝。
- 而是,一直轮询,询问是否已完成内核空间的数据准备
- 一旦完成了内核空间数据准备,立刻从内核空间拷贝到应用程序。这一阶段是阻塞的。
- 非阻塞进阶之IO多路复用
上面的非阻塞IO是不是傻傻的,要轮询内核是否完成系统拷贝。于是可以使用发布订阅模式。通过事件。内核拷贝好了发消息给应用进程
- 小结
无论是阻塞IO、非阻塞IO或者说IO多路复用。都是同步IO,因为从内核->用户空间这个过程的数据拷贝都是需要等待的。
5.同步和异步IO
阻塞IO和非阻塞IO都是同步IO。那异步IO是什么样子的呢?
- 用户进程发起系统文件读取调用
- 系统会自动完成磁盘->内核数据拷贝和内核->用户空间的两次拷贝
- 最后发送通知给用户程序。