文件系统有3个地方:
1)磁盘里面,带格式的文件
2)内存里面,与操作系统结合的文件接口vfs、存储驱动接口
3)应用层,与进程结合的文件(每个进程有一个数组,存放打开的文件列表)

下面是磁盘里面的文件系统:

《文件系统设计原理》_文件系统

由上图可见:

连续分配的方式,不适合编辑文件,只适合归档文件。

隐藏式链式分配的方式,不适合快速定位某个扇区,只适合顺序读写。

显性链式分配的方式,对内存浪费,在mount()之后会一次性把所有的FAT加载到内存中。 试想一下,你的sd卡有2G,但是你一次只编辑一个文件。你需要8M的内存来存放文件分区表,否则,读写文件就很慢(需要从flash读写分区表)。

索引表的方式:只把被当前进程打开的文件,从磁盘的索引表读取到内存中,这样内存就没有闲置浪费了。 没有被进程打开的文件的索引表,躺在磁盘上面,不占用内存。

下面是内存里面,文件系统的表现:

文件需要与操作系统进程调度、存储器驱动进行交互,因此内存里面的文件系统,是包含了磁盘文件系统、操作系统的一个超集。

《文件系统设计原理》_分区表_02

文件应用接口:数据的格式化,与扇区的读写,分开成2个处理单元。 流水线作业:

posix -> 数据格式化 -> buffer -> 扇区读写

通过文件名,例如"/root/dir1/nginx.log" 找到文件系统/socket手柄、扇区读写函数/网卡读写接口。

解析posix传输的数据,经过文件系统格式化,最终写入磁盘/内存/网络。

《文件系统设计原理》_分区表_03

vfs的在文件读写中的作用:为应用提供统一的接口,在linux中一切皆是文件。

《文件系统设计原理》_服务器_04

《文件系统设计原理》_运维_05

文件内核接口:

《文件系统设计原理》_服务器_06