操作系统原理读书笔记之文件系统

磁盘空间管理

有三种管理方式,对应三种数据结构
  1. 位图,每一位对应一个物理块,未使用上0,被使用是1,分配的时候需要遍历位图找到不为1的位然后分配
  2. 空闲块表,将所有空闲块记录在一个表中,每个表项纪录起始块号和空闲的块数,有点类似于内存空间管理策略里的不等长划分。这种方式适用于大文件连续存储,且读操作大于写操作的文件管理系统
  3. 空闲块链表,顾名思义每个物理块保存指向下一个物理块的指针,将所有的空闲块都串起来,缺点也是显而易见的,分配物理块由于下一个物理块不相邻,需要做大量随机查找,硬盘寻道变得很耗时。这种方式的改进型就是下面要介绍的成组链接法

成组链接法

如图,专用块是空闲块集合的头,称作专用块,专用块就是一张表,里面保存了20条记录,第项纪录了专用块里可分配的空闲块个数,分配块是从801开始,假如需要分配30个空闲块,这时就要读820这个空闲块指向的下一组空闲块,820里存放了第二组的空闲块个数和第二组的所有空闲块块号,可以将820这个块看成一个表,依此类推,编号800的空闲块存放第三组的信息。注意600这个块,第二行记录为0,表示接下去没有空闲块组了。
在分配的时候,假如要分配820这个块,而820存放了下一组的空闲块组信息,在分配前需要把下一组空闲块组信息拷贝到专用块里,就是将820里存放的内容拷贝到专用块里,然后再把820分配出去

unix就是采用了成组链接法管理磁盘空间的
操作系统原理读书笔记之文件系统


文件控制块及目录

文件控制块FCB和进程控制块大同小异,是管理文件的数据结构,保存一些管理文件所需的信息
目录文件的每个目录项存放文件名和FCB,目录是FCB的有序集合,现代文件系统的目录都是树形结构
重点:
在UNIX中,FCB采用目录项分解法,将FCB分为符号目录项和基本目录项。符号目录项存放文件名和文件号(即i节点的地址),基本目录项就是i节点,因此
UNIX目录的目录项存放的就是符号目录项

目录项分解法可以减少访盘次数,很简单,假如一个目录直接存放FCB,这个目录下的文件或子目录较多,占用10个物理块
改进后仅需要占用2个物理块,查询速度肯定提高,改进后在查到符号目录项后还需要去查基本目录项(i节点)



文件的物理结构

需要解决两个问题:
  1. 假设文件被划分成n个物理块,在磁盘上是如何存放的
  2. 文件的地址在FCB中如何记录

顺序结构

文件存放在若干连续的物理块中,这种结构下,FCB需要存文件的起始地址和长度。
优点:寻道快,顺序读取速度较快
缺点:这种方式文件的动态增长比较困难,需要预留(不确定预留多少)或者重新分配移动这两种方式解决,而且顺序结构容易造成大量碎片

链接结构

文件存放在若干不连续的物理块中,用指针相连,FCB只需要存第一块的块号即可。链接结构对比与顺序结构,
优点:提高了磁盘空间利用率,也可以对文件的动态插入删除
缺点:存取速度慢,假如要访问文件的第n个物理块(翻页),需要从头遍历;另外如果指针出现问题,会造成文件无法正常读取,可靠性很差;寻道次数和寻道时间都会增加;指针占用一部分空间破坏了数据块原有的大小,会造成数据块处理很复杂


windows FAT文件分配表

FAT文件管理系统就是链接结构的变形,他将指针的管理统一放在一张表里,叫文件分配表,每一行记录物理块块号和指向下一个物理块的块号,这样就将指针的管理集中起来,直接在内存中操作,且将物理块分配的问题也一起解决了,表项存放下一个物理块块号的字段有以下值:0表示空闲块;-1表示文件结尾;大于0表示下一个物理块块号;一个特殊的值如0xFFFF表示文件结尾;还有用于表示坏簇(windows以簇为磁盘最小单位,1簇通常是2的整数次幂个磁盘块)。文件的起始块号存放在FCB中。


索引结构

文件依然存放在若干不连续物理块中,系统为每个文件建立一个专门的索引表,将物理块号放在索引表中
FCB记录索引表所存放的物理块块号,如果索引表大小固定,则其本身就存放在FCB中,不需要单独的物理块存放(例如UNIX)
优点:索引表既能顺序存取,又能随机存取,可以充分利用磁盘空间
缺点:需要较多的寻道次数和寻道时间,索引表的加载到内存本身需要耗费时间,而且占用磁盘空间

假如一个文件很大,一张索引表不够存放其占用的所有物理块块号,需要扩展索引表,多个索引表的组织方式有三种:
  1. 链接方式:一个物理块存放一张索引表,多个索引表用指针链接。这样的话链接索引表的指针还需要另外的数据结构去管理
  2. 多级索引方式:将索引表的地址放在另一张索引表表项中。*索引表存放刺激索引表的地址,如果文件太小会造成空间的浪费
  3. 直接索引和间接索引方式相结合,UNIX文件系统采用的就是这种索引结构


UNIX的三级索引结构

主索引文件有15个索引项,直接存放在FCB中,每项两个字节(一个物理块号是两个字节)
前12项存放文件的直接物理块块号(直接寻址),如果文件大于12块,利用第13项指向一个物理块,该物理块存放的是一级索引表,假设物理块大小是512字节,则可以存放256个物理块号
对于更大的文件还可以利用第14和15项作为二级和三级索引表

那么那个经典的问题来了,UNIX中一个文件可达的最大物理块是多少,下图解释的清清楚楚

操作系统原理读书笔记之文件系统



文件系统的实现


文件卷的概念

是磁盘上的逻辑分区,由一个或多个物理块组成,物理块通常由2的整数次幂个扇区构成;

一个文件卷可以是整个磁盘、部分磁盘或跨盘;

同一个文件卷中使用同一份管理数据进行物理块的分配和空闲块的管理,不同文件卷中的数据相互独立;
一个文件卷上包括文件系统信息、一组文件(目录文件、用户文件)、未分配空间
格式化即在文件卷上建立文件系统



文件卷的布局

整个磁盘有一个主引导区,还有一个分区表,每个分区即文件卷,也有一个分区的引导区


UNIX的文件卷布局

超级数据块存放该卷的物理块数,块大小,空闲块数量和指针,空闲FCB数量和指针等信息
空闲区管理区存放即文章开头磁盘空间管理所述的三种数据结构之一:位图、空闲块表、空闲块链表(只存放专用表)
根目录单独拿出来有一个区域存放,剩下的就是文件和其他目录区了


WindowsFAT文件系统布局

分区的整体信息存放在分区引导区中
文件分配表2是文件分配表1的镜像

文件分配表上文有介绍过,目录的目录项里存放文件名和FCB,FAT的目录项有多种类型,在其中有一个字段表明是何种类型,例如"."目录项,".."目录项,短目录项,长目录项(文件名较长时,会分配更多空间存放文件名),卷标项(根目录),已删除目录项等
操作系统原理读书笔记之文件系统




内存中需要的数据结构

系统打开文件表
存放i节点信息,每打开一次该文件,引用计数加1,如果文件有修改,修改标记置1,关闭的时候需要将修改的内容写回磁盘
操作系统原理读书笔记之文件系统

用户打开文件表
存放以下内容,打开方式例如可读、可写,读写指针指向文件中的某一地址,其中系统打开文件表索引指向系统打开文件表的表项
操作系统原理读书笔记之文件系统


文件操作

创建文件

建立系统与文件的联系,实质是创建文件的FCB,首先检查文件名的合法性,检查是否有重名的文件,然后在目录中为新文件新增一条目录项并写入相关信息,下一步分配文件所需的磁盘空间

打开文件

根据文件名在目录中检索,并将该文件的目录项读入内存,
检查权限合法性,
然后检查系统打开文件表是否已经打开该文件,如果有记录那么在引用计数加1后即可,否则新增一行记录
同理,对用户打开文件表进行相应操作,
最后,通常操作系统会返回一个文件描述符(也叫文件句柄),后续对文件的操作都是通过文件描述符进行

指针定位seek操作

由fd查用户打开文件表,找到对应表项,将其中的读写指针设置为新的指针位置即可

读文件

read(文件描述符,读指针, 要读的长度,读出来的内容所指向的内存目的地地址)
根据文件描述符到系统打开文件表中取得FCB
检查用户是否拥有读权限
将文件的逻辑块号转换为物理块号,根据读指针的位置,要读的长度,计算起始块号、块数、块内位移
申请缓冲区
启动磁盘I/O操作,把磁盘中的内容读入缓冲区中,再传送到指定的内存地址



文件系统性能优化

块高速缓存

在内存中为设置一个缓冲区,保存磁盘中某些块的副本,在逻辑上这个缓冲区属于磁盘,在读请求时,先检查块高速缓存区是否存在需要的数据
块高速缓存的设计如下图,每个内存单元由双向链表链接,如果某一读请求需要多个内存单元,还会保存下一个内存单元的指针。
hash表是为了提高检索效率,检查块高速缓存中是否有读请求需要的数据,key为磁盘数据块块号,value值为块高速缓存指针

每当读请求在块高速缓存中检索到需要的数据块时,就将该内存块排到链表的队尾,队首的块优先被置换下内存
关于回写策略可以是每当有修改时就立刻回写到硬盘,也可以是积攒一定时间统一回写

操作系统原理读书笔记之文件系统

下图展示了用户进程、块高速缓存和磁盘之间的关系
操作系统原理读书笔记之文件系统

预加载

每次访问磁盘,多读入一些后面的磁盘块,多余的开销只有数据传输,没有寻道和磁臂旋转延迟时间

合理分配磁盘空间

例如尽可能的把顺序存取的块放在一起;
把数据块和i节点区放在同一柱面,减少磁臂的移动次数;
假如磁盘旋转周期为20毫秒,对一个磁盘块处理需要5毫秒,在处理过程中,磁盘旋转了一定角度,如果把下一个要读入的磁盘块安排在这个位置,会减少磁盘旋转带来的时间开销

优化磁盘调度算法

当有多个访盘请求时,对这些请求的顺序进行调整,使得磁臂的移动带来的时间开销

RAID磁盘阵列冗余技术

将多块磁盘按照一定要求构成一个独立的存储设备

RAID0条带化

数据分布在多个磁盘中,这样在读写时可以并行在多个磁盘上进行,充分利用总线带宽,提高读写效率

RAID1镜像

在RAID0基础上,为每个磁盘增加一个备份磁盘,此时磁盘利用率为50%,这样保证了数据安全性和可恢复性

RAID4奇偶校验

以数据块为单位,只拿出一块盘做奇偶校验,提高了磁盘利用率,同时也保证了可恢复性