操作系统的外存(主要指磁盘)管理模块根据各磁盘块的当前状态(忙和闲:磁盘管理程序可配置bitmap数据结构,用来统一表示各磁盘块忙闲情况)可分为两类,一是空闲磁盘块的调度管理,二是已占用了磁盘块的文件管理。本文便讨论已使用了外存存储设备的文件的索引和读取管理。
前面提到操作系统的磁盘管理为了和内存管理配合,也是将磁盘分割为最小单元进行统一调度,和内存的页帧概念对应,磁盘管理模块以磁盘块作为最小单元管理磁盘(常见的磁盘块为1KB,对应2个512B扇区,磁盘块是OS概念,磁盘驱动读取是以扇区作为最小单元)。
FCB (file control block)文件控制块
对于操作系统而言,当任何一个文件存储在本地后,会为了方便后续读取管理,而为每个文件建立专门的用以收集必要属性信息的数据结构,称为FCB(概念借鉴自进程管理模块中的PCB process control block)。将数据结构FCB中的信息收集如下。
Fig.1 FCB示意图
在UNIX系统中的FCB的具体实现如下
文件名 | 扩展名 | 属性 | 保留 | 时间 | 首块号 | 大小 |
---|
文件逻辑结构
按照文件逻辑可分为结构文件(数据表格)和字符流式文件(源程序,dll程序,普通文档)。
对于结构文件,又存在定长记录文件(表格项数目和长度固定)和非定长记录文件(非结构性数据,如每条评论留言,长短不一,当然也可以粗暴地预留足够空间统一规格对待,但是空间利用效率会低)
文件物理结构
结构类型 | 定义 | 优点 | 缺点 | 其他 |
---|---|---|---|---|
连续文件 | 文件顺序存放在外存的若干个连续物理块中 | 读取速度快,占用盘块可能处于相连甚至相同的磁道上,故而磁头移动距离较短。 | 该类占用的磁盘块需要连续成块分配,长期使用会导致较多的磁盘内部碎片,静态分配方式不利于文件长度的动态增删。 | 常用这种方式来存放频繁使用的程序文件,如boot程序、系统文件经常存放在序号较前的磁盘块连续序列中。 |
串联文件 | 该类文件使用的磁盘块不连续,盘块之间通过指针相连,行成串联的队列。 | 支持文件动态增删,磁盘利用率提高。 | 文件读取速度低下,磁盘块索引保存方式鲁棒性较差,一旦中间任一磁盘块的指针部分缺损,将导致整个文件无法读取。 | 指针若是直接埋在个磁盘块中,并没有集中二次处理成查询目录,则称之为隐式连接;若是这些指针统一放置在一张表中(Windows2000以前采用的FAT:file allocation table系统便是采用这种方式),则称为显式连接。每个表项对应一个物理块,存放的指针指向同一文件的逻辑上的下一物理块,这样该FAT表其实还间接地实现了此前提到的bitmap各磁盘块忙闲情况表示功能。当然对于现在的动辄1T的硬盘,其FAT表可不小,想要遍历一次FAT表可能得分批次读入FAT表,性能堪忧,所以现在Windows采用了更好的NTFS文件系统。 |
索引文件 | 为每个文件占用的磁盘块建立一张专属的索引表,即文件逻辑块号和物理磁盘块号的对照表。 | 即实现了磁盘块的动态分配,利于文件长度动态增减,因为索引表的引入故而速度介于连续文件和串联文件之间。 | 系统需要为每个文件维护一张索引表,系统存在额外开销。 | 索引表的size显然是和文件size的直接相关的,FBC中便保留了指向该索引表的指针,当然文件如果太大,还是需要多重索引来解决索引表过大的问题。如图2。 |
Fig.2 多重索引文件结构
转载自原文链接, 如需删除请联系管理员。
原文链接:操作系统&文件管理之FCB,转载请注明来源!