4.文件管理
什么是文件
概念
文件File
定义:以计算机硬盘为载体的存储在计算机上的信息集合
属性
文件的属性是描述文件状态的一组信息
例如名称,标识符,类型,大小,位置等
结构
逻辑结构
以逻辑结构来看文件,文件还可以分为无结构文件和有结构文件
- 无结构文件(流式文件)
以字节为单位,没有具体结构
例如记事本里的数据,全是用户输入的数据,没有规定好的结构
- 有结构文件(记录式文件)
顺序文件:数据是有一定顺序的,例如表格里的数据
索引文件:数据有一个索引,一个索引对应一个数据
索引顺序文件:索引的一个项对应着一组数据,数据有一定顺序
直接文件或散列文件:数据以键值对形式表现,一个key对应一个value
目录
通过目录查找和管理文件,目录的具体表现形式就是文件夹
目录的结构:
- 文件控制块FCB
基本信息(大小,类型),存取控制信息(读写权限),使用信息(修改,创建信息)
目录中的每个条目都是一个FCB
一个FCB条目可能是文件,也可能是下一个目录
- 索引节点
根据文件名建立一个索引,以索引查找文件和目录
- 目录结构
目录是一种树形结构
文件的共享和保护
共享
文件的共享分为硬链接和软连接
- 硬链接(索引节点)
每个用户建立一个索引节点表,存储文件名和索引节点指针等信息,根据表中的一个条目与访问文件的索引节点建立联系
每个索引节点建立一个计数器,每当一个用户访问文件就+1,不在访问就-1
当没有用户访问时,文件就会被删除
- 软连接(符号链)
创建一个新的.lnk文件(快捷方式文件),该文件记录了目标文件的地址,
访问快捷方式时,计数器同样+1
不再访问时,删除快捷方式即可,保护原文件的存在
保护
保护文件不被随便访问和修改
- 口令保护
访问文件之前要输入密码口令,在索引节点进行拦截
- 加密保护
通过加密算法,对文件数据进行加密,需要解密才能得到正确的文件数据
- 访问控制
针对用户,限制用户对读写文件进行限制
文件系统的实现
文件系统层次结构
- 用户调用接口(用户对文件进行操作,打开,读写等)
- 文件目录系统(系统管理操作文件)
- 存取控制验证模块(判断用户访问权限)
- 逻辑文件系统与文件信息缓冲区
- 物理文件系统
- 辅助分配模块
- 设备管理程序模块
文件系统的实现
目录的实现
目录实际上就是FCB的集合
实现由线性列表或哈希表实现
线性列表
线性列表可以由链表或数组实现,其中每个元素都是一个FCB
由于链表和数组在查询和插入上各有缺陷,所以哈希表实现效率更高
哈希表
实现一个哈希表,通过键值对形式存放FCB。
通过文件名计算出hash值,找到对应的FCB
但是有可能不同的文件得到相应的哈希值,为了避免这种错误,当通过哈希值找到FCB后还要比较一下文件名,如果文件名相同则成功访问。

文件的实现
文件如何在硬盘中存放,如何分配空间
文件分配方式
磁盘也会像内存一样分页,分成一个个大小相等的盘块,一般大小为4K
- 连续分配:
文件所占用的空间是连续的
连续分配支持顺序和直接访问,速度快
但不方便扩展,并且会产生磁盘碎片
由于是连续的,则文件扩大后多的数据还要存放在连续的地址上。如果后面的块已经被占用,就无法扩展了
- 链接分配:
文件可以存储在离散的盘块中,按照顺序将这几个盘块像链表一样连接起来
链接分配解决了扩展问题,直接向后链接即可
磁盘内维护一张文件分配表FAT,来存放一个文件所占的块的信息
磁盘内维护的表有两种形式:
隐式:存放文件名,以及该文件名起始块号和结束块号
显示:存放物理块号,以及该块指向的下一个块的块号。
-1表示该块为最后一个块;其他负数代表其为空闲块,一般为-2
隐式连接支持顺序访问,没有碎片,方便扩展
但由于离散存放,不支持直接访问
显示连接也支持顺序访问,还支持随机访问(通过文件分配表)
效率高,无外部碎片,方便扩展
-
索引分配
文件维护一张索引表,存放逻辑块号和物理块号。
逻辑块号从0开始,每个逻辑块号对应一个实际存放在的物理块号
索引表也可以指向下一个索引表,类似于两级页表

文件存储空间管理
存储空间管理主要处理空闲空间
物理磁盘在实际使用时会分成一个一个卷,卷也称为逻辑盘,即我们在文件管理器中可以看到的C盘,D盘等
每个卷都分为两个区域:目录区和文件区
如何管理空闲的区域,分为四种方法
- 空闲表法:
建立一张表,记录空闲块号和空闲块数
为了减少空闲表的大小,对于连续的空闲盘块,空闲块号存放最小块号,空闲块数表示这几个连续的空闲盘块有几块
例如盘块1,2,3空闲,则空闲块号为1,空闲块数为3
表由数组实现
- 空闲链表法:
存放方式和空闲表法相同,只是表的实现形式是链表
链表元素还是存放空闲块号和空闲块数
这两种方法的缺陷是表容易过大,并且查询空闲块效率低,不利于大型文件分配空间
- 成组链接法
把空闲空间分成一个一个大小相等的组,每个组存放相同数量的盘块
每个组类似于链表相连,组由栈实现
组用于存放盘块,每个组还会维护一个表。表存储的信息是下一个组的存放的盘块数量和盘块编号
假设一个组存放100个盘块,则第一组存放第二组的盘块数量(N=100),以及每个盘块的编号
对于最后一个组,他有可能没有存满,则在倒数第二个组中,对于没满的空间的盘块号常为0或-1,以表示下一个组无后续分组

OS在调用分配空闲空间时,第一组会被加载,根据信息分配。当这个组分配完后,根据该组的表去调用下一个组的信息
第一组的表信息会分配到一个单独的盘块中,这个块称为超级块,OS启动后,把超级块加载到内存中,也就把第一组的信息加载到了内存中,以供使用。第一组使用完后,加载第二组,以此类推
在超级块中的组称为空闲盘号栈
- 位视图法
通过创建一个二维矩阵,每个元素对应一个盘块,如果元素值为1表示该块已经被使用,0表示未使用
分配时从左到右每行依次查找

浙公网安备 33010602011771号