OS对硬盘的io进行了一系列的优化
类似网络的分层结构,操作系统对磁盘读取也进行了结构分层
virtual file System layer,虚拟文件系统扮演着文件系统管理者的角色,屏蔽下层具体文件系统的差异,为上层的操作提供一个统一的接口,与其相关的数据结构只存在于内存中,因此linux允许多个不同的文件系统存在并且对文件的操作可以跨文件系统执行
Linux中vfs靠四个主要的数据结构描述其结构信息
Super Block:超级块对象表示了一个文件系统,存储一个已安装的文件系统的控制信息,包括名称,大小,状态,块设备的引用和元数据信息
Inode:索引节点存储了文件相关的元数据信息,例如:文件大小,设备标识符,用户标识符,用户组标识符等
Inode分两种,一种是VFS的Inode,在内存中,一种是具体文件系统的Inode,在硬盘中,所以每次实际上就是将磁盘中的inode提取到内存中,一个Inode只对应一个实际文件
Dentry:目录项,方便查找文件,目录项没有对应的磁盘数据结构,只存在于内存中,一个路径的各个组成部分,都是一个目录项对象,VFS在查找的时候,根据一层一层的目录项找到对应的Inode,之后沿着目录项进行操作就可以找到最终的文件
File:文件对象,描述的是进程已经打开的文件,一个文件可以被多个进程打开,所以一个文件可以存在多个文件对象
以Ext2为例
硬盘分区首先被划分成一个个的block,一个Ext2文件系统上的每个Block大小都是一一样的,一般为1K或者4K,Ext2将一些Block聚集在一起分为几个大的块组,每个块组包含等量的物理块,在块组的数据块中存储文件或目录
Super Block和Inode Table分别对应VFS中的超级块和索引节点,存放在硬盘。每个块组都有一个块组描述符GDT(Group descriptor Tables),存储块组的描述信息例如从哪开始是Inode表,哪里开始是数据块等
Block Bitmap和Inode Bitmap 分别表示Block和Inode是否空闲可用(位图),Data Blocks存文件内容
Ext2将Inode记录Block号码的区域定义为12个直接,一个间接,一个双间接,一个三间接记录区,Inode存储如下
最左边为Inode本身(128 bytes),里面有12个直接指向Block号码的对照,这12笔记录能够直接取得Block号码。至于所谓的间接就是再拿一个Block来当作记录Block号码的记录区,如果文件太大时,就会使用间接的Block来记录编号。如上图拿一个Block来记录额外的号码。 同理,如果文件持续长大,那么就会利用所谓的双间接,第一个Block仅再指出下一个记录编号的Block在哪里,实际记录的在第二个Block当中。依此类推,三间接就是利用第三层Block来记录编号。(多级页表)