文件管理
文件的逻辑结构
无结构文件
一系列二进制流或字符流组成
有结构文件
由一组相似的记录组成
- 顺序文件
文件中的记录一个接一个排序,可以是定长也可以是可变长。各个记录在物理上可以是顺序储存或链式储存
分为串结构和顺序结构,串结构记录之间的顺序和关键字无关,顺序有关 - 索引文件
建立索引表指向逻辑文件。索引表固定长度,定长顺序文件,可以随机访问 - 索引顺序文件
索引表里面的项指向顺序文件的第一个
顺序文件和索引文件的结合
文件目录
文件控制块
目录文件记录了目录下所有文件的属性,包括文件名、类型、物理地址等。目录文件中的每一条记录就是一个文件控制块FCB
FCB实现了文件名和文件之间的映射。
操作
搜索
创建
删除
显示目录
修改目录
目录结构
- 单级目录结构
系统中只有一张目录表,不允许重名 - 两级目录结构
分主文件目录和用户文件目录
不同用户的文件运行重名 - 多级目录结构
结构像一个树,目录是内节点,非目录文件是子节点
相对路径和绝对路径、 - 无环图目录结构
可以用不同的文件名指向同一个文件
实现共享文件。
索引结点
为了减少目录文件的大小,PCB里面只储存文件名和一个索引结点的指针。索引结点里面储存了除文件名外其他的信息
文件的物理结构
文件的逻辑地址空间被分成了一个一个文件的块
连续分配
每个文件在磁盘上占据一组连续的块
文件目录中记录文件名和起始块号(其实就是地址)
优点:
- 支持顺序访问和随机访问
- 连续分配的文件在顺序读写时速度最快
缺点:
- 文件拓展不方便
- 存储空间利用率低,容易产生碎片
链接分配
采取离散分配的方式,可以为文件分配离散的磁盘块。分为显式链接和隐式链接
隐式链接
目录文件中记录了起始和结束块号。每个目录项中保存了指向下一个块的指针。
只支持顺序访问,不支持随机访问
文件拓展方便
显式链接
目录文件中记录文件名和起始块号等信息。用一个文件分配表FAT记录所有的块的下一个块。每个磁盘只需要一张FAT
方便拓展,不会产生碎片,支持随机访问,访问效率高。
需要一定的存储空间来存放FAT
索引分配
允许文件离散地分配在磁盘块中,系统会为每个文件创建一张索引表,索引表中记录了文件的各个逻辑块对应的物理块。索引表存放的磁盘叫索引块,文件数据存放的磁盘块叫数据块。目录文件里面储存了文件名和索引块的地址。
支持随机访问,容易拓展
如果索引表太大,可以用隐式链接等方法链接多个索引表(超长情况下搜索花费也很大)或者多层索引(这个比较快)或者混合索引(一个文件索引表中既包含直接地址索引,也包含一级间接索引和多级间接索引)
文件储存空间管理
存储空间划分与初始化
磁盘分区:将物理磁盘划分为一个个文件卷
每一个文件卷分为目录区和文件区
存储空间管理
- 空闲表法:将所有连续存储空间的第一个磁盘块号储存起来,并记录该储存空间有多少个磁盘块。磁盘块分配也是由首次适应、最近适应等算法进行分配。回收磁盘块时需要更新空闲盘块表的数据。
- 空闲链表法
- 空闲盘块链:操作系统储存链头和链尾的磁盘块的指针,每个磁盘块有一个指针指向下一个磁盘块。分配空间时按照链表的顺序一个个磁盘块分配
- 空闲盘区链:操作系统储存链头和链尾指针,每个盘区头部有指针指向下一个盘区的头部。分配跟空闲表法一样
- 位示图法
每个二进制位对应一个盘快。0表示空闲,1表示已分配 - 成组链接法
文件卷的目录区中储存一个超级块,当系统启动时需要将超级块读入内存,并且保证内存与外存的超级块数据一致。超级快储存了下一组空闲盘块数以及每一个空闲块号。每一个盘快号又储存下一个空闲盘块。
文件的基础操作
- 创建文件
调用create系统调用
传入参数:所需外存大小,路径,文件名
create系统调用时,操作系统在外存中找到文件所需要的空间,根据文件存放路径找到对应的目录文件,在该目录文件下创建该文件的目录项 - 删除文件
调用delete系统调用
传入参数:路径,文件名
delete系统调用时,操作系统根据路径找到目录文件,从目录中找到对应的目录项,根据目录项记录的存放位置,文件大小等回收磁盘块,再从目录表中删除对应文件的目录项 - 打开文件
调用open系统调用
传入参数:路径,文件名,对应的操作类型
open系统调用时,操作系统按照路径找到目录文件从中找到目录项,检测用户是否有权限,如果有就将目录项负责到内存中的打开文件表中,将对应表目的编号返回给用户,之后用户使用打开文件表的编号来指明要求操作的文件 - 读文件
调用read系统调用
read系统调用需要指明打开的文件以及读入的数据和内存中的存放位置。 - 写文件
write系统调用
跟读文件差不多
文件共享
基于索引结点(硬连接)
索引结点(前面文件目录里面有介绍)中设置一个count,表示链接到本结点上的用户目录项数,当用户删除该数据时只删除相应用户里面的信息并且使count–。若count==0才将索引结点删掉
基于符号链(软连接)
跟索引结点有关联,创建的索引结点指针指向一个索引结点,索引结点指向的文件里面记录了另外一个文件的路径,根据路径再找到相应的文件。就不直接指向数据,而是间接指向一个指向数据的文件。类似快捷方式
文件保护
口令保护
设置口令,保存和验证的开销都很小,但口令存储在文件内部,不够安全
密码保护
密码加密(不是日常理解的密码,上面的口令更接近常用的密码)
将原始数据按照一定的算法跟密码进行计算,使得保存的数据跟源数据不一样。读取时输入密码再按照算法跟加密后的数据进行运算得到源数据
保密性强,但编码译码需要一定的时间
访问控制
每个文件的FCB中增加一个文件控制列表,记录各个用户对本文件的权限
磁盘的结构
磁盘磁道扇区
磁盘:由磁性物质组成,用来记录二进制数据
磁道:磁盘被划分成一个个同心弧(圈),每个轨道就是一个磁道
扇区:磁道被划分为一个个弧,每个扇区就是一个数据块。越靠近圆心的扇区数据就越密集
读写数据
将磁头移动到相应的磁道,磁盘旋转移动到相应的扇区
磁盘调度算法
调度:将磁头移动到相应的磁盘块进行数据处理操作,对于多个请求,设计磁头移动的顺序为调度。
先来先服务FCFS
按照到来的顺序移动磁头
公平,但是性能差,寻道时间长
最短寻找优先SSTF
选择离当前磁道最近的磁道,贪心思想,未必最优
性能较好,但是有可能造成饥饿
扫描算法
磁头只有移动到最外层才能往内移动,只有移动到最内层才能往外移动
性能较好,不会产生饥饿,但响应频率不平均,而且有时候不需要完全移动到最外或者最内,到最外或最内的那个请求即可。
LOOK调度算法
解决扫描算法磁头只有到最外最内才能改变方向的缺点
内容:如果移动方向上已经没有请求了那么就可以改变方向
循环扫描算法
解决扫描算法响应不平均的缺点
只有一个方向的移动才能处理请求,到了末端后移动到开头重新扫描
C- LOOK调度算法
结合上面两个算法就是了
一些减少时延的算法
交替编号
如果要读取同一个磁道上相邻的扇区,因为磁盘一直在旋转,所以无法无缝连接地读下去,而是需要等磁盘再转一圈后才能准备好读取。交替编号的思想就是把逻辑上相邻的数据在磁道上交替编号(也就是中间夹着其他的扇区),给磁头充足的时间去准备读取下一个磁块,这样就能在更少的圈内实现数据读取。
错误命名
各个磁盘扇区的编号不一样。本质上还是给磁头充足的反应去准备读取
磁盘管理
磁盘初始化
- 低级格式化,将磁盘的各个磁道划分为扇区
- 磁盘分区,每个分区由若干个柱面组成
- 逻辑格式化,创建文件系统
引导块
计算机开机时需要执行一系列初始化程序,完整的初始化程序储存在磁盘的固定位置,自举装入程序写在ROM中只执行一小部分的初始化,然后启动磁盘中完整的初始化程序
坏块管理
逻辑格式化时对于坏块进行标记(简单磁盘)
维护坏块链表(复杂的磁盘)