磁盘布局是磁盘的空间划分管理,文件的空间被文件系统划分为与文件系统块一样大小的若干逻辑块,文件系统要做的事情就是将文件的逻辑块和磁盘的物理块建立联系,即文件系统数据管理。
基于连续区域
一次性为文件分配其所需要的空间,且空间在磁盘上是连续性的。因此只需要知道文件的起始位置所对应的磁盘位置和文件长度就可以知道文件数据在磁盘上是如何存储的。
这种方案的主要缺点是:
- 不够灵活,特别是追加写操作非常困难
- 容易形成碎片空间
目前主要应用在光盘等存储介质的文件系统中,如ISOFS
基于链表
将磁盘空间划分为相等大小的逻辑块,在目录项中包含文件名、数据的起止位置和终止位置,每个数据块后面用一个指针指向下一个数据块。
可以很好的解决连续区域的碎片问题,但是对于随机读写无能为力。因此一些基于链表的管理在实现时会进行一些调整,比如FAT12。
基于索引
通过索引项来实现对文件内数据的管理。读写数据时,根据文件名找到索引块的位置,然后根据索引块中记录的索引项,可以找到数据块的位置。
工程中中的不同实现会有所差异,比如常见的两种索引方式:
- 基于间接块
- 基于Extent
基于间接块
每个逻辑块都有一个对应的索引项,并将索引项用一个数组管理,访问文件某个位置的数据时,可以根据文件的逻辑偏移计算出数组的索引值,然后根据索引值找到索引项,从而找到磁盘上的数据。
缺点:大文件无法将索引数据一次性加载到内存中。
变通的方式是可以通过多级索引,即一级索引中存的不一定是物理地址,也可能是索引块地址。
基于Extent
每个索引项记录的值不是一个数据块的地址,而是数据块的起始地址和长度。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)