2025-03-10
格式化磁盘后,会将磁盘分割成一个个大小相同的块。这些块就是磁盘管理的最小单位。那么是如何找到空闲位置存储一个文件的呢?下面先来了解几个常用的概念。
块位图:使用一个bit
来标记一个块是否被占用。0
表示空闲,1
表示占用。
inode表:表中存放着inode项
,一个项存储文件的元信息和所需要占用的块位置。如果文件太大,存储块位置的最后一项用来指向一个空闲块,这个空闲块用来存储需要占用的块位置。如果二级列表还不够,需要使用二级列表的最后一项存储三级列表的块位置。重复上面的过程,这些块会形成一个存储文件占用块位置的列表。
inode位图:如果每次存储文件都要遍历inode表
,显然效率会很低。所以就出现了inode位图
。使用一个bit
来表示一个inode项
是否可用。
块组描述符:如果文件过多,一个块位图
、inode表
和inode位图
显然无法存储所有文件,所以需要多个。块组描述符
的作用就是用来标识块位图
、inode表
和inode位图
的起始块位置。这样就能方便找到磁盘元信息。
超级块:每次存储文件都需要通过块组描述符
->inode位图
来确定是否有空闲的inode项
,而且会遍历查找inode文图
,会降低效率。而超级块
就是用来解决这个问题的。超级块
中存储:空闲的块数量、使用的块数量、空闲的inode项
和使用的inode项
。这样就能够通过超级块
快速知道是否有足够空闲位置存储文件了。
了解完上面的基本概念后。那么存储一个文件的步骤大概如下:
查找超级块
,看是否有足够的空间存储文件
查找块组描述符
,找到磁盘元信息的位置
查找inode位图
,找到空闲的inode项
,更新位图信息
根据上一步找到的空闲项下标,在inode表
中找到对应的位置,写入文件的元信息
查找块位图
,找到空闲块来存储文件,写入文件
更新inode项
中文件占用的块位置
更新块位图
和超级块
上面的更新并没有考虑失败和并发的可能。不过大概思路就是这样。