操作系统(四-part1)文件管理
文件管理提要
文件的信息,文件内部信息的组织形式,文件之间的组织形式
OS提供的功能
文件如何存放在磁盘上
文件属性
文件名:同一目录下不能相同
标识符:一个系统内文件标识符唯一
类型:指定文件类型
位置:文件存放的路径(用户),外存中的地址(OS)
保护信息:操作权限
文件内部的组织形式
无结构文件:由一系列二进制或字符流组成,如
.txt
有结构文件:由记录 - 数据项结构组成,如
.xls
文件之间的组织:文件由目录有序的组织起来,目录本身也是一种文件
OS操作文件:使用
create
、read
、write
、delete
、open
、close
等系统调用文件在外存中
外存同上节所属的内存,其中被分为一个个的存储单元(磁盘块)
文件的逻辑地址:逻辑块号 + 块内地址
文件的物理地址:物理块号 + 块内地址
OS需要将逻辑地址转换为物理地址
文件的逻辑结构
无结构文件:流式文件,无明显结构特征
有结构文件:每条记录有一个数据项作为关键字,根据各项目的记录长度是否相等可以分为定长记录和变长记录
顺序文件:文件中记录的内容依次顺序排列,记录可以定长或变长。顺序或链式存储
结构
串结构:索引与记录二者的顺序无关
顺序结构:记录的顺序按照索引的顺序排列
能否实现随机存取
链式存储
无论为定长/可变长记录,均无法实现链式存储
顺序存储
可变长记录
无法实现随机存取,只能由第一个记录开始向后查找
定长记录
可实现随机存取,记录长度为L,则第i个记录的位置是 i × L i \times L i×L
采用串结构,无法找到关键字对应记录
顺序结构,可以快速找到关键字对应记录
顺序文件即物理上顺序存储文件,导致增、删文件比较困难
索引文件
建立索引表,索引表中的每个项目对应一条记录
索引表自身是定长记录的顺序索引文件
便于在快速响应的场景下使用
索引顺序文件:缩小索引的规模
给记录分组,每个分组建立一个索引表项
各分组之间由索引组织,各分组内部顺序存储
多级索引顺序文件:参考多级页表和索引顺序文件
顶级索引表索引分组索引表
分组索引表索引分组
各分组顺序存储
文件目录
可以理解为”文件夹“
文件控制块(FCB):实现文件目录的关键结构
实现”按名存取“,实现文件名与文件之间的映射
包含文件名,物理地址,逻辑结构等基本信息
需要目录进行的操作
搜索:根据文件名搜索目录
创建文件:创建文件的同时增加一个目录项
删除文件:删除一个文件的同时删除响应的目录项
显示目录:显示目录文件的内容
修改目录:文件改变时修改目录项
目录结构
单级目录结构:单用户操作系统
两级目录结构:早期多用户操作系统
主文件目录:记录用户名以及相对应的用户文件信息
用户文件目录:由该用户的文件FCB组成
缺点:无法对文件进行分类
多级目录结构(树型目录结构)
绝对路径
由根目录向下查找,由外存读入目录表一级级向下查找 - 读取
几层目录就需要几次磁盘I/O操作
当前目录:由当前文件夹出发的相对位置
缺点:不便于实现文件的共享
无环图目录结构
可以使用不同的文件名指向同一个文件
逻辑上等价于增加了一些指向同一个节点的有向边,使得整个目录形成一个有向无环图
需要为每个共享节点设置一个共享计数器,用于记录有多少目录项在共享该节点
用户提出删除节点时,只是删除该用户的FCB,并将共享计数器-1(不直接删除此节点)
索引节点:对文件控制块FCB的优化
简化FCB,只留下文件名和索引节点指针
将其他的文件描述信息放在索引节点中
存放在外存的索引节点称为磁盘索引节点,放入内存后称为内存索引节点
内存索引节点中加入一些额外信息,如文件是否被修改、此时有多少进程正在访问此文件等
文件的物理结构
对于文件的的存储空间的管理
操作系统需要对磁盘进行那些管理
对非空闲磁盘块
对空闲磁盘块
文件的物理结构:类似内存管理,文件的逻辑地址空间同样也被分为一个个文件块,标识为(逻辑块号,块内地址)的形式
连续分配
每个文件在磁盘上占有一组连续的块
记录文件的起始块号和长度,查找文件中的某部分时,物理块号 = 起始块号 + 逻辑块号
连续分配的优点
连续分配支持顺序访问和直接访问(随机访问)
有利于磁盘上的文件读取(磁头移动距离较短),顺序访问速度快
缺点:不利于文件的拓展,存储空间利用率低,产生难以利用的磁盘碎片
链接分配:离散分配,使用指针链接的方式进行串联
隐式链接(链式分配)
记录方式
在FCB中记录文件的起始块号和结束块号,以及指向下一块的链接指针
逻辑块号到物理块号的转变
系统给出要访问的逻辑块号 -> 找到起始块号 -> (递归的)一块块寻找对应块号
访问i号块需要i+1次操作
只支持顺序访问,不支持随机访问
便于文件拓展,没有碎片空间利用率高
显式链接
目录中只记录起始块号
文件分配表FAT,例如依次存放磁盘块 2 -> 5 -> 0 -> 1(此处省略了其他块)
物理块号 下一块 0 1 1 -1(标识结尾) 2 5 5 0 寻找物理地址
从目录中找到起始块号
利用起始块号,在FAT中找到对应的物理块号
逻辑块号转换物理块号不需要读磁盘操作
优点
支持顺序访问和随机访问
由于不需要遍历,速度块
缺点:文件分配表FAT需要占用一定的存储空间
索引分配:允许文件离散的分配在各磁盘块中
系统为每个文件建立一张索引表,索引表中记录了文件各逻辑块对应的物理块(由于块号的编号所占字节数相同,所以逻辑块号可以是隐含的,由物理块号字段长度进行计算即可)
索引表所在的磁盘块称为索引块(记录在FCB中),存放实际数据的块称为数据块
与显式连接的区别:显示连接的FAT一个磁盘一张,而索引表是一个文件对应一张
如何实现逻辑块号到物理块号的转变
用户给出要访问的逻辑块号i,OS找到对应文件的FCB
FCB中找到索引表位置,进而读出读出索引表内容
查找第i块的位置
索引分配的优点:支持随机访问,易于实现文件拓展
缺点:索引表需要占空间
索引分配PLUS:索引表过大,一个磁盘块装不下,需要解决索引表过大的问题,做题时注意顶级索引块是否已经调入内存
链接方案
将多个索引块链接起来存放
FCB中只需记录第一个索引块的块号
查找一个块号时,需要先逐个的读取之前的块号来找到该块号,I/O次数过多导致效率低下
多层索引
类似多级页表
查找物理块号
根据逻辑块号计算应该查找索引表中的那个表项
n级索引表需要进行n+1次磁盘I/O
小文件进行了多次不必要的I/O导致小文件读写效率低
混合索引
包含直接地址索引、单层索引表、二级间接索引
文件存储空间管理
对于存储空间的总体管理
存储空间的划分与初始化
文件卷(逻辑卷)的概念:即常见的磁盘分区
目录与文件区
目录区:FCB,索引节点等用于管理磁盘空间的信息
文件区:存放普通的文件
几种空闲区的管理方法
空闲表法
使用”空闲盘块表进行记录“
第一个空闲盘块号 (从第一个开始累计的)空闲盘块数 - - 适用于存储空间连续分配的方式
磁盘块分配:类似内存管理,可以使用的分配算法包括首次适应、最佳适应、最坏适应等
磁盘块回收:注意表项合并的问题
空闲链表法
空闲盘块链
各空闲盘块中存储着指向下一空闲盘块的指针
分配:依次取下若干盘块进行分配,修改链头指针
回收:回收的盘块依次加到链为,并修改链尾指针
空闲盘区链
连续的空闲盘块组成一个空闲盘区
空闲盘曲的第一个盘块记录盘区的长度和指向下一盘区的指针
位视图法
每个二进制对应一个盘块,使用(行号,位号)或(行号,列号)
例如一个有4个块的硬盘
0 1 0 0 1 1 0 1 即0,2块未被使用,1,3块已经被使用
分配:若需要K个块
- 顺序扫描位视图,找到K个相邻或者不相邻的0
- 根据字号、位号计算出对应的盘块号,将响应的盘分配,将响应的位置为1
回收:求出字号、位号,将二进制设置为0
成组链接法
适用于大文件
文件卷的目录区中专门设置一个磁盘块作为“超级块”,系统启动时将其读入内存,并且时刻保持内存外存中的超级块一致
文件的基本操作
创建文件:
create
系统调用,找到所需空间、创建文件目录项删除文件:
delete
系统调用,找到目录项 -> 回收磁盘块 -> 删除对应目录项打开文件
open
系统调用,找到目录项、检查操作权限 -> 将目录项复制到内存的打开文件表 -> 使用打开文件表的编号来指明要操作的文件(加快访问速度)打开文件表
系统打开文件表:注意打开计数器(有多少个进程打开了文件?)
进程打开文件表:注意读写指针、访问权限
读文件:
read
系统调用写文件:
write
系统调用
文件共享
便于多个用户共享文件
基于索引结点的共享方式(硬链接)
索引节点设置一个链接计数器
count
,标识链接到本索引节点上的用户目录项数删除文件时只是产出对应的目录项(count–),只有count == 0的时候才真正删除文件数据和索引节点
基于符号链的共享方式(软链接)
创建一个新文件,记录了被引用文件的存放路径
磁盘I/O次数多
文件保护
口令保护
用户访问文件时需要输入口令,口令一般存储于FCB或索引节点中
保存口令开销小,验证口令时间少
口令存放在系统内部,不够安全
加密保护
使用密码对文件进行加密,访问文件时需要提供正确的密码才能正确的解密
不需要存储密码,保密性强
编码解码存在开销
访问控制
系统在每个文件的
FCB
或者索引节点中增加一个访问控制列表,记录各用户对该文件执行那些操作使用精简的访问列表:以组为单位(系统管理员、文件主、文件主伙伴、其他用户)进行分组,用户想访问文件时,检查对应组是否有权限
文件系统层次结构
文件系统层次结构 文件目录系统 存取控制块FCB 逻辑文件系统于文件信息缓冲区 物理文件系统