文件的分类:

  • 普通文件:包含了用户的信息,一般为 ASCII 或二进制文件;
  • 目录文件:管理文件系统的系统文件;
  • 特殊文件(设备文件):包括了字符设备文件、块设备文件等;

文件的逻辑结构:

  • 流式文件:无结构,对文件内的信息不再划分单位,它是依次的一串字符流构成的文件。
  • 记录式文件:有结构,文件由若干个记录组成,可以按照记录进行读、写、查找等操作。

存储介质与物理块

典型的存储介质

磁盘(包括固态盘 SSD)、磁带、光盘、U盘….

物理块(块 block、簇 cluster)

  • 信息存储、传输、分配的独立单位;
  • 存储设备划分为大小相等的物理块,统一编号;

磁盘访问

一次访问请求:读/写,磁盘地址(设备号、柱面号、磁头号、扇区号),内存地址(源/目)
由三个动作组成:

  • 寻道:磁头移动定位到指定磁道;
  • 旋转延迟:等待指定扇区从磁头下旋转经过;
  • 数据传输:数据在磁盘与内存之间的实际传输;

文件控制块:FCB

FCB:File Control Block

为管理文件而设置的数据结构,保存管理文件所需的所有有关信息(文件属性或元数据)
常用属性:

  • 文件名;
  • 文件号;
  • 文件大小;
  • 文件地址;
  • 各种标志(只读、隐藏、系统、归档);
  • …..

文件目录

  • 文件目录:同一管理每个文件的元数据,以支持文件名到文件物理地址的转换;
  • 目录文件:将文件目录以文件的形式存放在磁盘上;
  • 目录项:构成文件目录的基本单元,可以是 FCB,目录是 FCB 的有序集合;

image.png

文件的物理结构

文件的物理结构指的是文件在存储介质上的存放方式。

连续结构

文件信息存放在若干连续的物理块中。
image.png

  • 优点:连续结构实现简单,支持顺序存取和随机存取,所需要的磁盘寻道次数和寻道时间也最少。
  • 缺点:文件不能动态增长,不利于文件的插入和删除,且会产生很多的外部碎片。

链接结构

一个文件的信息存放在若干不连续的物理块中,各块之间通过指针连接,前一个物理块指向下一个物理块。
image.png

  • 优点:提高了磁盘空间利用率,不存在外部碎片问题,利于文件的动态扩充。
  • 缺点:存取速度慢,不适合随机存取,需要更多的寻道次数和寻道时间,链接指针可能出错并且占用一定的空间。

索引结构

一个文件的信息存放在若干不连续物理块中,系统为每个文件建立一个专用数据结构-索引表,并将这些物理块的块号存放在该索引表中,其中的第 i 个条目指向了文件的第 i 块。
image.png

  • 优点:既能顺序存取,又能随机存取。满足了文件动态增长、插入删除的要求,能充分利用磁盘空间。
  • 缺点:需要较多的寻道次数和寻道时间。索引表本身也需要很多系统开销(内存、磁盘空间、存取时间)。

* 多级索引结构(综合模式)

综合模式:直接索引 + 间接索引
image.png
UNIX 文件系统采用的综合模式:

  • 每个文件的主索引表有 15 个索引项,每项 2 个字节。
  • 前 12 项直接存放文件的物理块号。
  • 如果文件大于 12 块,则利用第 13 项指向一个物理块作为一级索引表,假设扇区大小为 512 字节,物理块等于扇区块大小,那么一级索引表可以存放256个物理块号。
  • 对于更大的文件还可利用第 14 和第 15 项作为二级和三级索引表。

image.png

文件目录检索

  • 目录检索:用户给出文件名,按照文件名查找目录项/FCB。
  • 文件寻址:根据目录项/FCB中文件物理地址等信息,计算出文件中任意记录或字符在存储介质上的地址。

image.png

目录项分解

通过目录项分解可以加快文件目录检索的速度。目录项分解将 FCB 分解为两部分:

  • 符号目录项:文件名,文件号;
  • 基本目录项:除文件名外的所有字段;

目录文件改进后减少了访盘次数,提高了文件检索速度。

磁盘调度算法

当有多个访盘请求等待时,采用一定的策略,对这些请求的服务顺序调整安排,从而降低平均磁盘服务时间,达到公平、高效。

公平:一个 I/O 请求在有限时间内满足
高效:减少设备机械运动带来的时间开销

FCFS:先来先服务

按照访问请求到达的先后次序服务

  • 优点:简单、公平。
  • 缺点:效率不高,相邻两次请求可能会造成最内到最外的柱面寻道,使磁头反复移动,增加了服务时间,对机械也不利。

image.png

SSTF:最短寻道时间优先

SSTF:Shortest Seek Time First

优先选择距当前磁头最近的访问请求进行服务,主要考虑寻道优先。
虽然改善了磁盘平均服务时间,但是也会造成某些访问请求长期等待得不到服务,也就是饥饿现象。
image.png

SCAN:扫描算法

扫描算法又称为电梯算法,当设备无访问请求时,磁头不动;当由访问请求时,磁头按一个方向移动,在移动的过程中对遇到访问请求进行服务,然后判断该方向上是否还有访问请求,如果有则继续扫描;否则改变移动方向,并为经过的访问请求服务,如此反复。
因为考虑了移动方向,因此所有的磁盘请求都会被满足,解决了 SSTF 的饥饿问题。
image.png

CSCAN:单向扫描算法

SCAN 算法存在这样的问题:当磁头刚从里向外移动过某一磁道时,恰有一进程请求访问此磁道,这时该进程必须等待,待磁头从里向外,然后再从外向里扫描完所有要访问的磁道后,才处理该进程的请求,致使该进程的请求被严重地推迟。

为了减少这种延迟,CSCAN 算法规定磁头只做单向移动。例如,磁头只自里向外移动,当磁头移到最外的被访问磁道时,磁头立即返回到最里的欲访磁道,即将最小磁道号紧接着最大磁道号构成循环,进行扫描。

旋转调度算法

旋转调度算法根据延迟时间来决定执行次序的调度,请求访问分为一下三种情况:

  • 若干等待访问者请求访问同一磁头上的不同扇区;
  • 若干等待访问者请求访问不同磁头上的不同编号的扇区;
  • 若干等待访问者请求访问不同磁头上具有相同的扇区;

对于前两种情况:总是让首先到达读写磁头位置下的扇区先进行传送操作。
对于第三种情况:这些扇区同时到达读写磁头位置下,可任意选择一个读写磁头进行传送操作。

参考

  1. 北京大学操作系统原理(Operating Systems)
  2. Modern operating systems