1、对Linux操作系统而言,访问硬盘从软件到硬件,从上到下大致可以分为三层:
(1)、虚拟文件系统:通用抽象接口、具体文件系统、系统文件缓存。
(2)、设备驱动层:通用驱动接口、具体驱动接口
(3)、设备层(具体的硬件设备,可以理解为磁盘)
2、虚拟文件系统(VirtualFileSystem,VFS):隐藏了各种硬件的具体细节,把文件系统操作和不
同文件系统的具体实现细节分离了开来,为所有的设备提供了统一的接口,VFS提供了多达
数十种不同的文件系统。
虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件
系统,如ext2,fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。
3、写方面的优化主要:是延迟批量写,也就是数据先写到页缓存中,经过积累后再磁盘驱动提
交。这种积累和延迟写主要目的是为了增加数据的连续性,也就是为了规避磁盘机械臂的摆
动,因为磁盘机械臂摆动是最耗时的。
4、读方面的优化主要:是预读功能,预读就是根据当前应用读取数据的模式,提前将数据读到内
存当中。由于应用访问数据的区域局部性特点,这种预读就可以避免应用直接从磁盘读取数
据的延时,从而提高读性能。
5、关键结构
(1)super_block
描述一个已经挂载的文件系统,包含设备名,分区大小,blocksize等基础数据,superblock
方法集合,所包含的inode 链表等。superblock包含的信息众多,与磁盘上的实际数据对应,
常作为入参被内外部接口引用,对它的更新也会适时同步到磁盘上。
(2) inode
描述一个文件(包括普通文件,目录,FIFO 等等),包含文件类型,大小,更新时间等数据,
inode方法集合,其包含的信息同样与磁盘上数据对应,需要适时同步。
(3) dentry
描述系统目录树中的一个节点,通常会指向一个inode,其主要信息有该dentry的父子dentry,
文件名,指向的inode,dentry方法集合等,dentry最主要的作用是记录一个inode在目录树中的位置。dentry结构保存在内存dcache中,在磁盘中往往没有直接关联的数据。
dentry 直译为目录项,需要与目录进行区分,例如一个路径“/var/log/txt.log",其中包含4个
目录项“/”,“var”,"log",“txt.log”,前3个目录项指向目录inode,最后一个目录项指向普通文件
inode.
dentry 实现的方法主要是对 dentry 结构的初始化,比较,校验,删除等操作。由于dentry
通常只维护在内存中,底层文件系统驱动往往不需要实现全部方法,系统有默认处理流程。
参考博客: