IO分类
3/29/2022 IO
# 直接与非直接I/O
磁盘I/O是非常慢的,所以Linux内核为了减少磁盘I/O次数,在系统调用后,会把用户数据拷贝到内核中缓存起来,这个内核缓存空间也被称为页缓存,只有当缓存满足某些条件的时候,才会发起磁盘I/O的请求。
根据是否利用操作系统的缓存,可以把文件I/O分为直接I/O和非直接I/O。
- 直接I/O,不会发生内核缓存和用户程序之间的数据复制,而是直接经过文件系统访问磁盘。
- 非直接I/O,读操作时,数据从内核缓存中拷贝给用户程序,写操作时,数据从用户程序拷贝给内核缓存,再由内核决定什么时候写入数据到磁盘。
触发内核缓存写入到磁盘的场景:
- 在调用write的最后,当内核缓存数据太多时,内核会把数据写入到磁盘。
- 用户主动调用sync,内核缓存会刷新到磁盘上。
- 当内存十分紧张时,无法再分配页面,内核缓存的数据也会刷新到磁盘上。
- 内核缓存的数据的缓存时间超过某个时间时,也会把数据刷新到磁盘上。
# 阻塞与非阻塞IO/同步与异步IO
可以参考:
此处为语雀内容卡片,点击链接查看:https://www.yuque.com/hanchanmingqi-zjjw3/kb/slbpvi (opens new window)