文件的物理结构

文件的物理结构(文件分配方式)


操作系统需要对磁盘进行哪些管理?

对非空闲磁盘块的管理(存放了文件数据的磁盘块)/文件的物理结构/文件分配方式要探讨的问题/

对空闲磁盘块的管理/文件存储空间管理要探讨的问题

文件的物理结构(文件的分配方式)

连续分配,链接分配(隐式链接,显示链接),索引分配

文件块,磁盘块

类似于内存分页,磁盘中的存储单元也会分为一个个“块/磁盘块/物理块”。很多操作系统中,磁盘块的大小与内存块,页面的大小相同

内存与磁盘之间的数据交换(即读/写操作,磁盘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次读磁盘操作

混合索引

多种索引分配的结合。例如,一个文件的顶级索引表中,既包含直接地址索引(直接指向数据块),又包含一级简接索引(指向单层索引表),还包含两级简接索引(指向两层索引表)

对于小文件,只需较少的读磁盘次数就可以访问目标数据块。一般计算机中小文件更多。

posted @   IT小五  阅读(970)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示