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项中文件占用的块位置
更新块位图和超级块
上面的更新并没有考虑失败和并发的可能。不过大概思路就是这样。