文件管理
操作系统需要向上提供最基本功能:
- 创建文件(create系统调用)
- 删除文件(delete系统调用)
- 读文件(read系统调用)
- 写文件(write系统调用)
- 打开文件(open系统调用)
- 关闭文件(close系统调用)
属性
文件名:由创建文件的用户决定文件名,主要是方便用户找到文件,同一目录下不允许有重名文件
标识符:一个系统内的各文件标识符唯一,对用户来说毫无可读性,因此标识符只是操作系统用于区分各个文件的一种内部标志
类型:知名文件的类型
内存:文件存放的路径(让用户使用)、在外存中的地址(操作系统使用,对用户不可见)
大小:指明文件大小
保护信息:对文件进行保护的访问控制信息
其他:创建时间、上次修改时间、文件所有者信息
文件逻辑结构
无结构文件
无结构文件:由一系列二进制或字符串组成
有结构文件
有一组相似的记录组成:记录 - 数据项
根据各条记录的长度是否相等,又可分为定长记录和可变长记录两种
-
顺序文件
是否排序:
串结构:记录之间的顺序与关键字无关
顺序结构:记录之间的顺序按关键字顺序排列
是否随机存取:
链式存储:无论是定长/可变长记录,都无法实现随机存取,每次只能从第一个记录开始往后依次查找
顺序储存:
-
可变长记录:无法实现随机存取,每次只能从第一个记录开始往后依次查找
-
定长记录(可实现随机存取):
1)采用串结构:无法快速找到某关键字对应的记录
2)采用顺序结构:可以快速找到某关键字对应的记录
-
-
索引文件
建立一张索引表以加快文件检索速度,每条记录对应一个索引项
索引表本身是定长记录的顺序文件,因此可以支持随机存取
-
索引顺序文件
索引顺序文件是索引文件和顺序文件思想的结合。索引顺序文件中,同样会为文件建立一张索引表,但是并不是每个记录对应一个索引表项,而是一组记录对应一个索引表项
文件目录
文件控制块
目录文件中的一条记录就是一个文件控制块(FCB)
FCB的有序集合称为”文件目录“,一个FCB就是一个文件目录项
FCB实现文件名和文件之间的映射,使用户(用户程序)可以实现”按名存取”
FCB中包含:
- 文件的基本信息(文件名、物理地址、逻辑结构、物理结构等)
- 文件的存取控制信息(是否可读可写,禁止访问的用户名单等)
- 文件的使用信息(文件建立时间、修改时间等)
目录结构
-
单级目录:按名存取,不允许文件重名
-
两级目录: 主文件目录(记录用户名和相应用户文件目录的存放位置)、
用户文件目录(由该用户的文件FCB组成)
-
多级目录结构(树形目录结构)
很方便对文件进行分类,层次结构清晰,但是不利于文件的共享
-
无环图目录结构:在树形目录结构的基础上,增加一些指向同一结点的有向边,使整个目录成为一个有向无环图,更方便的实现多个用户间的文件共享
索引结点
本质上是对FCB的改进
文件物理结构
- 对非空闲磁盘块的管理(存放了文件数据的磁盘块)
- 对空闲磁盘块的管理
文件分配方式
映射:文件块号 -> 物理地址
-
连续分配
每个文件在磁盘上占有一组连续的块
物理块号 = 起始块号 + 逻辑块号
- 链接分配
1)隐式链接
2)显示链接
- 索引分配
1)链接方案:如果索引表太大,一个索引块装不下,那么可以将多个索引块链接起来存放
2)多层索引:建立多层索引,原理类似于多级页表(各层索引表大小不能超过一个磁盘块)
3)混合索引:多种索引方式的结合。eg:一个文件的顶级索引表中,既包含直接地址索引(直接指向数据块),又包含一级间接索引(指向单层索引表),还包括两级简介索引(指向两层索引表)
文件储存空间管理
储存空间的划分与初始化
划分:将物理磁盘划分为一个个文件卷(逻辑卷、逻辑盘)
初始化:将各个文件卷划分为目录区、文件区
文件卷
就是磁盘划分的区,也称为逻辑卷、逻辑盘
目录区与文件区
目录区:主要存放文件目录信息(FCB)、用于磁盘储存空间管理的信息
文件区:用于存放文件数据
管理方法
-
空闲表法
适用于连续分配方式
-
空闲链表法
1)空闲盘符链:以盘块为单位组成一条空闲链
2)空闲盘区链:以盘区为单位组成一条空闲链
- 位示图法
-
成组链接法
超级块:文件卷的目录区中专门用一个磁盘块作为“超级块”,当系统启动时需要将超级块读入内存,并且要保持内存与外存中的“超级块”数据一致。实质就是起了一个链表表头的作用。
文件基本操作
进程的”打开文件表“(每个进程有一张)
系统的“打开文件表“(整个系统只有一张)
创建文件
- 在外存中找到文件所需的空间
- 在目录中创建该文件对应的目录项
删除文件
- 找到文件对应的目录项
- 回收文件占有的磁盘块
- 从目录表中删除文件对应的目录项
打开文件
并不是直接把文件数据读入内存
- 从目录中找到文件名对应的文件项,并检查该用户是否有指定的操作权限
- 将目录项复制到内存中的打开文件表中,并将对应表中的编号返回给用户。之后用户使用打开文件表的编号来指明要操作的文件
关闭文件
- 将进程打开的文件表相应表项删除
- 回收分配给该文件的内存空间等资源
- 系统打开文件表的打开计数器count-1,若count=0,则删除对应表项
读文件
真正的将数据读入内存
在支持”打开文件“操作的系统中,只需要调用打开文件操作,提供文件在打开文件索引表中的索引号即可
- 指明是哪个文件
- 读入多少数据
- 指明读入的数据存放在内存的什么位置
写文件
流程与读文件类似
文件共享
硬链接
基于索引结点的共享方式
软链接
基于符号链的共享反射方式
文件保护
口令保护
口令一般存放在文件对应的FCB或索引结点中。用户访问文件前需要先输入“口令”,操作系统会将用户提供的口令与FCB中储存的口令进行对比,如果正确,则允许该用户访问文件
优点:保存口令的空间开销不多,验证口令得到时间开销也很小
缺点:正确的“口令”存放在系统内部,不够安全
加密保护
使用某个“密码”对文件进行加密,在访问文件时需要提供正确的“密码”才能对文件进行正确的解密
优点:保密性强,不需要再系统中储存“密码”
缺点“编码/译码(加密/解密)需要花费一定时间
访问控制
在每个文件的FCB(或者索引结点)中增加一个访问控制列表(access-control list,ACL),该表中记录了各个用户可以对该文件执行哪些操作
用户过多时,可以采用精简的访问列表,给用户分组
文件系统层次结构
磁盘的结构
基本概念
磁盘:表面由一些磁性物质组成,可以用这些磁性物质来记录二进制数据
磁道:磁盘的盘面被划分为一个个刺刀,这样的一个”圈“就是一个磁道
扇区:一个磁道又被划分成一个个扇区,每个扇区就是一个”磁盘块“,每个扇区存放的数据量相同
读写数据
需要把”磁头“移动到想要读/写的扇区所在的磁道,磁盘会转起来,让目标扇区从磁头下面划过,才能完成对扇区的读/写操作
物理地址
可以用(柱面号,盘面号,扇区号)来定位任意一个”磁盘块“
分类
磁头是否可以移动:活动头磁盘、固定头磁盘
盘片是否可以更换:可换盘磁盘、固定盘磁盘
磁盘调度算法
一次磁盘读/写需要的时间
寻找时间(寻道时间)Ts:在读/写数据前,将磁头移动到指定磁道所花的时间
- 启动磁头臂耗时s
- 移动磁道耗时:每跨越一个磁道耗时为m,总共需要跨越n条磁道,耗时m*n
Ts=s+m*n
延迟时间Tr:通过旋转磁盘,使磁头定位到目标扇区所需要的时间。设磁盘转速为r,则平均所需的延迟时间Tr=(1/2)*(1/r)=1/2r
传输时间Tt:从磁盘读出或向磁盘写入数据所经历的时间,假设磁盘转速为r,每个磁道可存N字节的数据,此次读/写的字节数为b
Tt=(1/r)*(b/N)=b/(rN)
总的平均存取时间Ta=Ts+Tr+Tt,延迟时间、传输时间难以优化,主要是优化寻道时间
磁盘调度算法
先来先服务算法
根据进程请求访问磁盘的先后顺序进行调度
优点:公平
缺点:如果又大量进程进竞争使用磁盘,请求访问的磁道很分散,则寻道时间长
最短寻找时间优先
优先处理的磁道是与当前磁头最短的磁道,可以保证每次的寻道时间最短,但是不能保证总的寻道时间最短(即贪心算法的思想,只是选择眼前最优,但是未必总体最优)
优点:性能较好,平均寻道时间短
缺点:可能产生”饥饿“现象
扫描算法(SCAN算法)
只有磁头移动到最外层磁道的时候才能向内移动,移动到最内侧磁道的时候才能向外移动
优点:性能较好,平均寻道时间较短,不会产生饥饿现象
缺点:只有到达最边上的磁道时才能改变磁头移动方向;算法对于各个位置磁道的响应频率不平均
LOOK算法
在扫描算法的基础上改善:如果在磁盘移动方向上已经没有别的请求,就可以立即改变磁头移动方向,边移动边观察
循环扫描算法(C-SCAN算法)
C-LOOK调度算法
磁盘管理
磁盘初始化
-
进行低级格式化(物理格式化),将磁盘的各个磁道划分为扇区。一个扇区通常可分为头、数据区域、尾三个部分组成。管理扇区所需的各种数据结构一般存放在头、尾两个部分。包括扇区校验码(如奇偶校验、CRC循环冗余校验码等,校验码用于校验扇区中的数据是否发生错误)
-
将磁盘分区,每个分区由若干柱面组成
-
进行逻辑格式化,创建文件系统,包括创建文件系统的根目录、初始化储存空间管理所用的数据结构(如位示图、空闲分区表)
引导块
计算机开机时,需要进行一系列初始化的工作,这些初始化工作是通过初始化程序(自举程序)完成的。初始化程序可以放在ROM(只读存储器)中。ROM中数据在出厂时就写入了,并且以后不能再修改。ROM一般是出厂时就集成在主板上的
为了解决自举程序更新问题,目前采用的解决方案:ROM中只存放很小的”自举装入程序“,完整的自举程序放在磁盘的启动块(即引导块/启动分区上),启动块位于磁盘的固定位置
坏块的管理
坏了、无法正常使用的扇区就是“坏块”。这属于硬件故障,操作系统是无法修复的。应该将坏块标记出来,以免错误的使用到它