文件系统有3个地方:
1)磁盘里面,带格式的文件
2)内存里面,与操作系统结合的文件接口vfs、存储驱动接口
3)应用层,与进程结合的文件(每个进程有一个数组,存放打开的文件列表)
下面是磁盘里面的文件系统:
由上图可见:
连续分配的方式,不适合编辑文件,只适合归档文件。
隐藏式链式分配的方式,不适合快速定位某个扇区,只适合顺序读写。
显性链式分配的方式,对内存浪费,在mount()之后会一次性把所有的FAT加载到内存中。 试想一下,你的sd卡有2G,但是你一次只编辑一个文件。你需要8M的内存来存放文件分区表,否则,读写文件就很慢(需要从flash读写分区表)。
索引表的方式:只把被当前进程打开的文件,从磁盘的索引表读取到内存中,这样内存就没有闲置浪费了。 没有被进程打开的文件的索引表,躺在磁盘上面,不占用内存。
下面是内存里面,文件系统的表现:
文件需要与操作系统进程调度、存储器驱动进行交互,因此内存里面的文件系统,是包含了磁盘文件系统、操作系统的一个超集。
文件应用接口:数据的格式化,与扇区的读写,分开成2个处理单元。 流水线作业:
posix -> 数据格式化 -> buffer -> 扇区读写
通过文件名,例如"/root/dir1/nginx.log" 找到文件系统/socket手柄、扇区读写函数/网卡读写接口。
解析posix传输的数据,经过文件系统格式化,最终写入磁盘/内存/网络。
vfs的在文件读写中的作用:为应用提供统一的接口,在linux中一切皆是文件。
文件内核接口: