文件系统基础
文件的概念
记录是一组相关的数据项的集合,用于描述一个对象在某方面的属性。
在有结构文件中,文件由一组相似的记录组成,称为记录式文件。无结构文件被视为一个字符流,又称为流式文件。
文件的属性:名称、标识符、类型、位置、大小、保护、时间
所有文件的信息都保存在目录结构中,而目录结构保存在外存上。
文件的基本操作
- 创建文件
- Create系统调用提供三个参数:所需外存空间大小、文件存放路径、文件名
- 在外存中找到文件所需的空间
- 根据文件存放路径找到该目录对应的目录文件,创建目录项
- 在外存中找到文件所需的空间
- Create系统调用提供三个参数:所需外存空间大小、文件存放路径、文件名
- 写文件
- 读文件
- 文件重定位
- 删除文件
- Delete系统调用提供两个参数:文件存放路径、文件名
- 找文件名对应的目录项
- 根据目录项纪录的存放位置、文件大小等,回收文件占用的磁盘块
- 删除目录项
- 根据目录项纪录的存放位置、文件大小等,回收文件占用的磁盘块
- 找文件名对应的目录项
- Delete系统调用提供两个参数:文件存放路径、文件名
- 截断文件 允许文件所有属性不变,并删除文件内容
文件的打开与关闭
- 打开文件
- open系统调用提供参数:文件存放路径、文件名、要对文件的操作类型
- 根据路径找目录,再找对应的目录项,并检查用户是否有指定的操作权限
- 将目录项复制到内存的打开文件表中,并将对应表目编号返回给用户,用户使用编号来指明要操作的文件
- 每个进程都有一个打开文件表。系统有一个总的打开文件表,只有一张
- 关闭文件
- close系统调用
- 将进程的打开文件表项删除
- 回收内存空间资源
- 系统打开文件表的相应表项打开计数器减一,若计数器为0,删除对应表项
文件的逻辑结构
无结构文件
文件内部的数据就是一系列二进制流或字符串流组成,又称流式文件
有结构文件
由一组相似的记录组成又称记录式文件
分为定长记录和可变长记录两种
顺序文件
文件中记录一个接一个的顺序排列,记录可以是定长或可变长的,在物理上可以顺序存储或链式存储
- 串结构 记录之间的顺序与关键字无关
- 顺序结构 记录之间的顺序按关键字顺序排列
索引文件
- 为每一个文件建立一张索引表,索引表本身是定长记录的顺序文件
- 可以用不同的数据项建立多个索引表
- 缺点:每个记录都对应一个索引表项,索引表可能会很大,降低了存储空间的利用率
索引顺序文件
- 给记录分组,每一组记录对应一个索引表项。
- 顺序文件和索引文件的结合
多级索引顺序文件
- 为进一步提高检索效率,可为顺序文件建立多级索引表。又是套娃
目录结构
文件控制块 FCB
FCB的有序集合称为文件目录,一个FCB就是一个文件目录项。FCB包含了文件的基本信息,其中最基本的文件名、文件存放的物理地址
对文件目录的操作
- 搜索 使用一个文件时,系统需要根据文件名搜索目录,找到对应的目录项
- 创建文件 创建一个新文件时,需要在对应的目录增加一个数据项
- 删除文件 删除文件也需要删除对应的目录项
- 显示目录 用户可以请求显示目录的内容,如目录的所有文件及属性
- 修改目录 某些文件的属性保存在目录中,属性变化时需要修改相应目录项
目录结构
单级目录结构
整个系统只建立一张目录表。整个系统不允许重名情况
两级目录结构
缺乏灵活性,不能对文件分类
多级目录结构
从当前目录出发为相对路径
无环图目录结构
优点:实现了文件共享,但使学习通管理变得更加复杂
在树形目录结构基础上增加了一些指向同一节点的有向边
索引节点
索引节点是FCB的改进,将除了文件名以外的所有信息都存储一个结点中,FCB中只存储文件名和索引节点指针。目录项占用空间变小,每个磁盘块中存储的目录项变多,需要的磁盘块减少,检索文件时磁盘I/O次数减少,提升了文件检索速度
存放在外存中的索引节点为磁盘索引节点,放入内存后为内存索引节点。相比之下内存索引节点中需要增加文件是否被修改,有几个进程正在访问文件等信息。
文件共享
基于索引节点的共享方式(硬链接)
利用符号链实现文件共享(软链接)
文件保护
- 口令保护
- 加密保护
- 使用某个密码对文件进行加密,磁盘中存储加密后的二进制数据,访问文件时提供正确的密码才能对文件进行解密
- 保密性强,不需要在系统中存储密码。但加密解密需要花费一定时间
- 访问控制 为每个文佳的FCB添加一个访问控制表,表中记录各个用户可以对文件进行哪些操作
文件系统实现
文件系统层次结构
目录实现
线性列表
哈希表
文件实现
文件分配方式
连续分配
要求每个文件在磁盘上占有一组连续的块。
文件目录中记录存放的起始块号和长度。
优点:支持顺序访问和直接访问,连续分配的文件在顺序访问时速度最快
缺点:不方便文件拓展,存储空间利用率低,会产生磁盘碎片
链接分配
采取离散分配的方式,可以为文件分配离散的磁盘块,分为隐式链接和显式链接
- 隐式链接
每个盘块都有指向下一个盘块的指针。
目录包括文件第一块的指针和最后一块的指针。
只支持顺序访问,不支持随机访问。
- 显示链接
把用于链接文件各物理块的湿疹显示的存放在一张表中。即文件分配表 FAT。类似于数据结构中的静态链表。
支持顺序、随机访问。
逻辑块号转换成物理块号的过程不需要读磁盘操作。 ¥¥¥
索引分配
允许文件离散的分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块。索引表存放的磁盘快称为索引快。文件数据存放的磁盘快称为数据块。
采用索引分配方式目录中每个记录要记录文件的索引快是几号磁盘块。
索引表太大,一个磁盘块装不下的解决方案
- 链接方案 将多个索引快链接起来存放 低效
- 多层索引 类似于多层页表若采用多层索引 各层索引表的大小不能超过一个磁盘块
- 采用K层索引结构,且顶级索引表未调入内存,则访问一个数据块需要K+1次读磁盘操作
- 混合索引 多种索引分配方式的混合.一个文件的顶级索引表中,既包含直接地址索引,又包含一级间接索引,还包含两级间接索引
- 对于小文件来说,访问一个数据块所需的读磁盘次数相对于多层索引来说减少了
文件存储空间管理
存储空间的划分与初始化
文件卷分为目录区和文件区
一个物理磁盘可以划分为多个文件卷(C盘,D盘等),一个文件卷也可由多个物理磁盘组成
几种管理方法
- 空闲表法 记录每一个连续空闲区间的第一个空闲盘块号和空闲盘块数
- 空闲链表法
- 空闲盘块链
- 空闲盘区链 为一个文件分配多个盘块时效率更高
- 位示图法 每个二进制位对应一个盘块
- 成组链接法 适合大型文件系统 理解即可
磁盘组织与管理
磁盘的结构
所有盘面中相对位置相同的磁道组成柱面
可用(柱面号、盘面号、扇区号来定位任意一个磁盘块
磁盘调度算法
一次磁盘读写操作需要的时间
寻道时间 $ T_{s}=s+m*n $
延迟时间 $ T_{8}=1/2r$
传输时间 :从磁盘读出或向磁盘写入数据所经历的时间
$ T_{t}=b/(rN)$
操作系统唯一可以影响的是寻道时间
先来先服务算法(FCFS)
根据进程访问请求访问磁盘的先后顺序进行调度
优点:公平,如果请求访问的磁道比较集中的话,算法性能还过得去
缺点:如果有大量进城竞争使用磁盘,请求访问的磁道很分散,则性能很差,近似随机调度。
最短寻找时间优先(SSTF)
优先处理的磁道是与当前磁头最近的磁道,可以保证每次的寻到时间最短,但不能保证总的寻道时间最短,类似贪心算法。
优点:性能较好,平均寻道时间短
缺点:可能产生饥饿现象
SSTF算法产生饥饿的原因是磁头可能在一个小区域内来回来去的移动。
扫描算法(SCAN)
只有磁头移动到最外侧磁道才能往内移动,移动到最内侧磁道才能往外移动。也叫电梯算法。
优点:性能较好,平均寻道时间较短,不会产生饥饿现象
缺点:只有到达最边上的磁道时才能改变磁头移动方向,还可以进一步优化、对于各个位置磁道的响应频率不均匀
LOOK调度算法
对扫描算法的第一个缺点作了优化,如果在磁头移动方向上已经没有别的请求,就可以立即改变磁头移动方向。使寻道时间进一步缩短
循环扫描算法(C-SCAN)
对SCAN算法第二个缺点的优化,规定只有磁头超某个特定方向移动时才处理磁道访问请求,而返回时直接快速移动至起始端而不处理任何请求。
优点:比起SCAN,对各个位置的响应频率很平均
缺点:与SCAN的第一个缺点一致,且平均寻道时间比SCAN更长
C-LOOK 调度算法
LOOK与C-SCAN的结合体
如果磁头移动方向上已经没有磁道访问请求了,就可以让磁头直接返回,并且磁头只需返回到有磁道访问请求的位置即可。
不得不说,这几种算法这么无聊的吗 emm…
减少磁盘延迟时间的方法
交替编号
因为在读取磁盘的过程中,磁盘是一直转动的,而磁头读入一个扇入后,会有一小段处理处理时间,不能连续不间断的读取。因此采用交替编号的策略,让逻辑上相邻的扇区在物理上有一定的间隔,可以使读取连续的逻辑扇区所需要的延迟时间鞥小。
错位命名
原理:与交替编号的原理相同,减低延迟时间
具体做法:让相邻盘面的扇区编号错位
磁盘地址结构的设计
采用柱面号在前,读取地址连续的磁盘快时,采用(柱面号,盘面号,扇区号)的地址结构可以减少磁头移动消耗的时间。
磁盘的管理
磁盘初始化
- 进行低级格式化(物理格式化),将磁盘的各个磁道划分为扇区,一个扇区通常由头、数据区域、尾组成
- 将磁盘分区,每个分区由若干柱面组成
- 进行逻辑格式化,创建文件系统,包括创建文件系统的根目录、初始化存储空间管理所用的数据结构
引导块
计算机开机需要进行一系列初始化工作,这些工作是通过执行初始化程序(自举程序)完成的。在ROM 中存放很小的自举装入程序,完整的自举程序存放在磁盘中某个固定的位置。开机时先运行自举装入程序,找到自举程序的位置,在将完整的自举程序读入内存,完成初始化。
自举程序存放在磁盘的启动块(即引导块/启动分区)上,拥有启动分区的磁盘称为系统磁盘
坏块
简单的磁盘:逻辑格式化时将坏块标记出来
复杂的磁盘:磁盘控制器维护一个坏块链,并管理备用扇区