文件的物理结构(文件分配方式)
类似于内存分页,磁盘中的存储单元也会被分为一个个“块/磁盘块/物理块”。很多操作系统中,磁盘块的大小与内存块、页面的大小相同。
内存与磁盘之间的数据交换(即读/写操作、磁盘 I/O )都是以“块"为单位进行的。即每次读入一块,或每次写出一块。
一、顺序分配(连续分配)
重点:
- 连续分配同时支持顺序访问和直接访问(随机访问)
- 连续分配的文件在顺序读/写时速度最快
- 物理上采用连续分配的文件不方便扩展
- 物理上采用连续分配,存储空间利用率低,会产生难以利用的磁盘碎片(可以用紧凑来处理碎片,但是需要耗费很大的时间代价)
二、链接分配
(一)隐式链接
理解:说白了就是普通的单向链表
重点:
- 方便文件扩展
- 所有的空闲磁盘块都可以被利用,不会有碎片问题,外存利用率高
- 只支持顺序访问,不支持随机访问,查找效率低
- 指向下一个盘块的指针也需要耗费少量的存储空间
转换过程:
- 用户给出要访问的逻辑块号 i,操作系统1找到该文件对应的目录项(FCB)。
- 从目录项中找到起始块号(0号逻辑块),将其读入内存,然后像链表一样逐步向下将每一块读入内存。
最后,读入 i 号逻辑块,总共需要 i+1 次磁盘 I/O
(二)显式链接
引入 FAT 文件分配表 File Allocation Table,把用于链接文件各物理块的指针显示地存放在一张表中
重点:
- 同时支持顺序访问和随机访问(想访问 i 号逻辑块时,并不需要依次访问之前的 0~i-1号逻辑块)
理解:隐式和显式在转换的区别,就在于:
隐式在顺序读取逻辑块的过程中要将每一块都放入内存(这里会执行磁盘 I/O ),才能知道下一块是哪块
显式在加载时会将 FAT 常驻内存,只是一张表,在内存里的这张表上进行一步步向下查找,到了需要的那一块的记录项后才将对应的块读入内存,只对最终需要读取的块进行了磁盘 I/O
- 不会产生外部碎片,外存利用率高
- 方便文件扩展
- 文件分配表的需要占用一定的存储空间
转换过程:
- 用户给出要访问的逻辑块号 i,操作系统1找到该文件对应的目录项(FCB)。
- 从目录项中找到起始块号,若 i > 0 ,则查询内存中的文件分配表 FAT,往后找到 i 号逻辑块对应的物理块号。逻辑块号转换成物理块号的过程不需要读磁盘操作。
考试题目中遇到未指明隐式/显式的“链接分配”,默认指的是隐式链接的链接分配(普通链表那个)。
三、索引分配
索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块(索引表的功能类似于内存管理中的页表一一建立逻辑页面到物理页之间的映射关系)。
- 索引块:索引表存放的磁盘块。
- 数据块:文件数据存放的磁盘块。
——索引表与文件分配表 FAT 的区别:
FAT 是一个磁盘对应一张。索引表是一个文件对应一张。
重点:
- 支持随机访问
- 方便文件扩展(只需要给文件分配一个空闲块,并增加一个索引表项即可)
转换过程:
- 用户给出要访问的逻辑块号 i,操作系统1找到该文件对应的目录项(FCB)。
- 从目录项中可知索引表存放位置,将索引表从外存读入内存,并查找索引表即可知道 i 号逻辑块在外存中的存放位置。
上述这种最基本的索引分配和显示链接的链接分配比较像。
——引申问题:
若每个磁盘块 1KB ,一个索引表项 4B ,则一个磁盘块只能存放 256 个索引项。如果一个文件的大小超过了 256 块,那么一个磁盘块是装不下文件的整张索引表的,如何解决这个问题?
(一)链接方案
缺点:若文件很大,索引表很长,就需要将很多个索引块链接起来。想要找到 i 号索引块,必须先依次读入 0~i-1 号索引块,这就导致磁盘 I/O 次数过多,查找效率低下。
(二)多层索引
缺点:即使是小文件,访问一个数据块依然需要 K+1 次读磁盘。
(三)混合索引
顶层索引表的结构更为复杂
优点:对于小文件来说,访问一个数据块所需的读磁盘次数更少。