Linux 文件IO的流程到底如何工作的
2019-03-21 本文已影响62人
简书徐小耳
image.png摘抄:https://www.ibm.com/developerworks/cn/linux/l-cache/index.html
概述
上图的整个流程可以分为从磁盘读取文件,以及从进程写入文件到磁盘。
从磁盘读取文件的流程如下(粗略的流程):
- 1.文件系统从disk上读取内容到FS Cache(文件系统缓冲)的bufferCache中
- 2.通过VFS(虚拟文件系统)从FS Cache的Page cache中获取数据---
FS Cache 把Buffer Cache组装成PageCache
(即一个PageCache包含多个bufferCache)。 - 3.当PageCache的内容进入到物理内存Page,进程通过调用操作系统函数Read即可以获取Page数据。
从进程写数据到文件流程如下(粗略的流程):
- 1.进程开始写数据的时候通过页表拿到可写的Page开始写数据
- 2.通过VFS将数据写入到PageCache。
- 3.调用文件系统的函数将PageCache数据写入到Disk
VFS和FS之间的关系
- 由于linux会操作不同的文件存储介质,不同的介质需要不同的文件系统,而VFS可以堪称是FS的上层抽象(接口)
磁盘到用户进程之间细致的流程
磁盘的簇(硬件缓存)-->文件系统的块(通过队列去执行块的IO)-->文件系统的pageCache(块内容变为bufferCache,BufferCache组装成PageCache)-->到物理Page-->进程一次性读取一个或多个Page内容。
MMAP
- 1.可以看到内存管理系统有VMM(虚拟内存管理系统)可以通过mmap直接操作page cache,而不需要经过Page
LInuxIO的五种模型
- 1.BIO
- 2.NIO
- 3.signal IO
- 4.IO 多路复用
- 5.AIO
个人认为其实只有4中IO模型,因为多路复用不属于新的IO,只是一种IO的管理方式,
IO的五种模型分类主要是从read角度来区分的
,而对于文件IO 从read角度可以看为是NIO(当然如果出现磁盘抖动也会出现阻塞),从write角度可以分为Buffer IO和DIO,前者是主要依赖于page cache,后者绕过pageCache 直接写块。IO的分类只是角度不同,就像人可以分为男人和女人,也可以分为好人和坏人