文件的物理结构
文件的物理结构(文件分配方式)
操作系统需要对磁盘进行哪些管理?
对非空闲磁盘块的管理(存放了文件数据的磁盘块)/文件的物理结构/文件分配方式要探讨的问题/
对空闲磁盘块的管理/文件存储空间管理要探讨的问题
文件的物理结构(文件的分配方式)
连续分配,链接分配(隐式链接,显示链接),索引分配
文件块,磁盘块
类似于内存分页,磁盘中的存储单元也会分为一个个“块/磁盘块/物理块”。很多操作系统中,磁盘块的大小与内存块,页面的大小相同
内存与磁盘之间的数据交换(即读/写操作,磁盘I/O)都是以‘’块‘为单位进行的,即每次读入一块,或每次写出一块。
在内存管理中,进行的逻辑地址空间被分为一个一个页面。同样的在外存管理中,为了方便对文件数据的管理,文件的逻辑地址空间也被分为了一个个的文件块。
文件的逻辑地址可以表示为(逻辑块号,块内地址)的形式。
用户通过逻辑地址来操作自己的文件,操作系统要负责实现从逻辑地址到屋里地址的映射。
连续分配方式
连续分配方式要求每个文件在磁盘上占有一组连续的块。
用户通过逻辑地址来操作自己的文件,操作系统如何实现从逻辑地址到物理地址的映射?
(逻辑块号,块内地址)->(物理块号,块内地址)。只需转换块号就行,块号地址保持不变。
用户给出要访问的逻辑块号,操作系统找到该文件对应的目录项(FCB)物理块号=起始块号+逻辑块号
操作系统还需要验证用户提供的逻辑块号是否合法
优点:
可以直接算出逻辑块号对应的物理块号,因此连续分配支持顺序访问和直接访问(随机访问)
读取某个磁盘块时,需要移动磁头。访问的两个磁盘块相隔越远,移动磁头所需时间就越长。
结论:连续分配的文件在顺序读/写时速度最快
缺点:
物理上采用连续分配的文件不方便拓展
物理上采用连续分配,存储空间利用率低,会产生难以利用的磁盘碎片,可以用紧凑来处理碎片,但是需要耗费很大的时间代价。
总结:
链接分配
可以为文件分配离散的磁盘块
隐式链接
目录中记录了文件存放的起始块号和结束块号,也可以增加一个字段来表示文件的长度
除了文件最后一个磁盘块之外,每个磁盘块中都会保存指向下一个盘块的指针,这些指针对用户是透明的
用户给出要访问的逻辑块号,操作系统找到该文件对应的目录项(FCB)
从目录中找到其实块号(即0块号),将0块号逻辑块读入内存,由此知道1号逻辑块存放的物理号,于是读入1号逻辑块,再找到逻辑块的存放位置,以此类推
结论:
采用隐式链式分配方式的文件,只支持顺序访问,不支持随机访问,查找效率低,另外,指向下一个盘块的指针也需要耗费少量的存储空间
若此时要拓展文件,则可以随便找到一个空闲磁盘块,挂到文件的磁盘块链尾,并修改文件的FCB
很方便拓展文件,另外,所有的空闲磁盘块都可以被利用,不会有碎片问题,外存利用率高。
显示链接
把用于链接文件各物理块的指针显示地存放在一张表中,即文件分配表(FAT,File Allocation Table)
目录中只需记录文件的起始块号,
注意:
一个磁盘仅设置一张FAT。开机时,将FAT读入内存,并常驻内存,FAT的各表项在物理上连续存储,且每一个表项长度相同,因此物理块号字段可以是隐含的。
文件逻辑块号到物理块号的转变:
从目录中找到起始块号,若i>0.则查询内存中文件分配表FAT,往后找到i号逻辑对应的物理块号。逻辑块号转换成物理块号的过程不需要读磁盘操作。
结论:采用显示链接方式的文件,支持顺序访问,也支持1随机访问(想访问i号逻辑块时,并不需要一次访问之前的0~i-1号逻辑块)由于块号转换的过程不需要访问磁盘,因此相比于隐式链接来说,访问速度快很多。
不会产生文件碎片
缺点:文件分配表需要占用一定的存储空间。
索引分配
索引分配允许文件离散的分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件各个逻辑块对应的物理块,(索引表的功能类似于内存管理中的页表--建立逻辑页面到物理页之间的映射关系)。索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块。
注意:在显示链接的链式分配方式张,文件分配表FAT1是一个磁盘对应一张。而索引分配方式中,索引表是一个文件对应一张。
实现逻辑块号到物理块号的转变:
从目录中可知索引表存放位置,将索引表从外存读入内存,并查找索引表即可只i号逻辑块在外存中的存放位置。
索引分配的方式支持随机访问,文件拓展也很容易实现(只需给文件分配一个空闲块,并增加一个索引表项即可)但是索引表需要占用一定的存储空间
出现为问题:当一个磁盘块装不下文件的整张索引表,
链接方案
如果索引表太大,一个索引块装不下,那么可以将多个索引块链接起来放
缺点:若想要访问文件的最后一个逻辑块,就必须找到最后一个索引块(第256个索引块),而各个索引块之间是用指针链接起来的,因此必须先顺序地读入前255索引快,这显然效率是很低的
多层索引
建立多层索引(原理类似于多级页表),使第一层索引快指向第二层的索引快。还可根据文件大小的要求再建立第三层,第四层索引快。
采用K层索引结构,且顶级索引表未调入内存,则访问一个数据块只需要K+1次读磁盘操作
混合索引
多种索引分配的结合。例如,一个文件的顶级索引表中,既包含直接地址索引(直接指向数据块),又包含一级简接索引(指向单层索引表),还包含两级简接索引(指向两层索引表)
对于小文件,只需较少的读磁盘次数就可以访问目标数据块。一般计算机中小文件更多。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?