OS对硬盘的io进行了一系列的优化

类似网络的分层结构,操作系统对磁盘读取也进行了结构分层

Untitled

VFS Layer

virtual file System layer,虚拟文件系统扮演着文件系统管理者的角色,屏蔽下层具体文件系统的差异,为上层的操作提供一个统一的接口,与其相关的数据结构只存在于内存中,因此linux允许多个不同的文件系统存在并且对文件的操作可以跨文件系统执行

Linux中vfs靠四个主要的数据结构描述其结构信息

文件系统

以Ext2为例

硬盘分区首先被划分成一个个的block,一个Ext2文件系统上的每个Block大小都是一一样的,一般为1K或者4K,Ext2将一些Block聚集在一起分为几个大的块组,每个块组包含等量的物理块,在块组的数据块中存储文件或目录

Untitled

Super Block和Inode Table分别对应VFS中的超级块和索引节点,存放在硬盘。每个块组都有一个块组描述符GDT(Group descriptor Tables),存储块组的描述信息例如从哪开始是Inode表,哪里开始是数据块等

Block Bitmap和Inode Bitmap 分别表示Block和Inode是否空闲可用(位图),Data Blocks存文件内容

Ext2将Inode记录Block号码的区域定义为12个直接,一个间接,一个双间接,一个三间接记录区,Inode存储如下

Untitled

最左边为Inode本身(128 bytes),里面有12个直接指向Block号码的对照,这12笔记录能够直接取得Block号码。至于所谓的间接就是再拿一个Block来当作记录Block号码的记录区,如果文件太大时,就会使用间接的Block来记录编号。如上图拿一个Block来记录额外的号码。 同理,如果文件持续长大,那么就会利用所谓的双间接,第一个Block仅再指出下一个记录编号的Block在哪里,实际记录的在第二个Block当中。依此类推,三间接就是利用第三层Block来记录编号。(多级页表)

Page cache