操作系统(四)文件管理

文章目录

  • 文件系统系统基础
    • 基本概念
    • 打开一个文件的步骤
    • 目录管理
      • 文件控制块 FCB
      • 索引结点
      • 目录结构
      • 目录实现(目录检索方式)
    • 文件共享
      • 基于Inode的共享方式(硬链接)
      • 利用符号链实现文件共享(软链接)
    • 文件保护
  • 文件的逻辑结构(文件组织)
    • 顺序文件(线性查找)
    • 索引文件(二分查找)
    • 索引顺序文件(先二分再线性)
    • 哈希(Hash)文件(哈希查找)
  • 文件的物理结构(存储结构、分配方式)
    • 连续分配
    • 链接分配
      • 隐式链接
      • 显式链接
    • 索引分配(Inode)
  • 文件存储空间管理(管理空闲磁盘块)
    • 空闲表法
    • 空闲链表法
    • 位示图法
    • 成组链接法
  • 磁盘组织与管理
    • 磁盘构造
    • 磁盘调度
    • 调度算法(减少寻道时间)
    • 减少延迟时间
    • 磁盘管理

文件系统系统基础

基本概念

进程作为计算机资源调度和分配的单位,文件作为计算机(用户)进行 I/O 的基本单位,进程调度对用户是透明的,I/O 是用户主动进行的,文件管理本质上就是一种I/O管理

文件本质上就是一种数据结构,只不过种类众多,具有不同的逻辑结构、物理结构

数据项

  • 基本数据项
  • 组合数据项:若干个基本数据项组成的, 简称组项

记录:一组相关数据项的集合

文件

  • 有结构文件
    • 由若干个相关记录组成,记录式文件
    • 需要用专门的软件才能正常打开的文件
  • 无结构文件
    • 字符流,流式文件
    • 以字节为单位,纯文本文件、源程序文件

易混淆的定义

文件描述符/索引

  • 它是一个索引值,指向进程记录表中的某一项
  • 存储在进程的PCB中
  • 打开文件,调用 open() 后返回一个文件描述符 fd,作为文件指针操作文件

文件指针

  • 上次读写位置,属于进程打开文件表

打开文件表

  • OS对所有打开的文件维护一个系统级别的打开文件描述表
  • 每个进程自己也有一个进程级别的打开文件描述表
  • 首次打开一个文件时,会在系统和进程打开表中都创建一个新的条目,当别的进程再次打开该文件时,只是增加一个指向(系统表 Count+1)

工作目录

  • 即当前目录,当一个文件系统含有许多级时,每访问一个文件,都要使用从树根开始直到树叶(数据文件)为止的、包括各中间节点(目录)名的全路径名。这是相当麻烦的事,同时由于一个进程运行时所访问的文件大多仅局限于某个范围,因而非常不便。基于这一点,可为每个进程设置一个“当前目录” ,又称为“工作目录”

目录文件

  • 目录也是一种文件,称为目录文件
  • 其实没有什么“目录”与“文件”之分,全都是”文件“,目录就是一种记录式文件

文件目录

  • 把 FCB 的有序集合称为文件目录

文件目录项/FCB

  • 一个 FCB 就是一个文件目录项
  • 一个 FCB 唯一的对应着一个文件,存放在外存,文件被打开时,调入内存

打开一个文件的步骤

调用系统调用 open(“a”) ,如果是首次打开该文件(未被其它进程打开过)

  1. 根据文件名 a,在系统文件打开表中查找,因为是首次打开,所以找不到
  2. 查看含有文件 a 的目录文件是否在内存中
    • 如果不在,将目录表装入到内存中【打开文件操作中,找到文件所在的目录并装入内存是最主要的步骤,因为最终目的是要把文件 a 的 FCB 装入内存,但文件 a 的 FCB 在这个目录文件中】
  3. 根据目录表中文件 a 对应项找到 FCB 在磁盘中的位置
  4. 将文件 a 的 FCB 装入到内存中的 Active Inode(活跃文件目录表)中
  5. 在系统文件打开表中为文件 a 增加新的一个表项,将表项的指针指向 Active Inode 中文件 a 的 FCB
  6. 在进程的文件打开表中分配新的一项,将该表项的指针指向系统文件打开表中文件 a 对应的表项
  7. 在 PCB 中,为文件 a 分配一个文件描述符 fd,作为进程文件打开表项的指针,文件打开完成

如果是再次打开该文件

  1. 根据文件名 a,在系统文件打开表中查找,因为是已经打开过,所以能找到
  2. 在进程文件打开表中为文件 a 分配一个表项,然后将该表项的指针指向系统文件打开表中文件 a 对应的一项
操作系统(四)文件管理_第1张图片

目录管理

目录本身就是一种记录式文件

文件控制块 FCB

为了实现“按名存取”,包含文件名,文件物理位置,文件逻辑结构,文件的物理结构,存取控制信息,文件的建立日期和时间等

索引结点

引入

检索文件只需要文件名,可以给目录文件瘦身,除了文件名的所有信息都移动到索引节点中,文件目录项只留下文件名和指向索引结点的指针(物理块号),这个“瘦身”效果,比我们想象中要高得多,以索引文件(物理结构也是索引结构)为例,本来FCB中需要存储文件的整张索引表,这可能会占据多个磁盘块

一个磁盘块能存储更多的目录项了,检索效率自然就提高了

磁盘与内存索引结点

存放在磁盘上的索引结点。每个文件有惟一的一个磁盘索引结点。

如果文件首次打开,要将磁盘索引结点拷贝到内存的中,便于以后使用,需要多次读取磁盘(每一级路径都需要读一次磁盘,不考虑中间路径是否有索引结点已经在内存中的情况),最终把磁盘索引节点拷贝到内存中,对于已打开文件,读盘次数和使用FCB是一致的

目录结构

基本功能(要求)

  • 实现“按名存取”
  • 提高对目录的检索速度
  • 文件共享
  • 允许文件重名

单级目录

整个文件系统中只建立一张目录表,每个文件占一个目录项

实现

  • 实现了“按名存取”

问题

  • 查找速度慢
  • 不允许重名
  • 不便于实现文件共享

两级目录

为每个用户建立一个单独的用户文件目录 UFD,系统中建立一个主文件目录 MFD,记录每个用户目录文件

实现

  • 提高了检索目录的速度
  • 在不同的用户目录中,可以使用相同的文件名

问题

  • 缺乏灵活性,不能对文件分类
  • 各用户是完全无关的,不便于共享文件

多级(树形)目录结构

从根目录到任何数据文件,都只有一条惟一的通路(路径)

当前目录

为每个进程设置一个“当前目录” ,又称为“工作目录” ,进程对各文件的访问都是相对于当前目录进行的(即相对路径)

实现

  • 层次结构更加清晰

问题

  • 在多级目录中查找一个文件,需要按路径名逐级访问中间节点,多次访问磁盘,无疑将影响查询速度
  • 不便于实现共享

无环图目录结构

在树形目录的基础上增加了一些指向同一结点的有向边,即一个文件“同时存在”与两个文件夹(更便于实现共享)

目录实现(目录检索方式)

线性检索法

使用线性表存储文件名和数据块指针,创建新文件时,首先搜索目录表以确定没有同名的文件存在,然后在目录表后增加一个目录项。删除文件则根据给定的文件名搜索目录表,接着释放分配给它的空间。

存在问题

  • 费时(应该也可以让目录表按关键字排序,然后使用二分查找)
  • 顺序结构不便于删除

Hash 方法

系统利用用户提供的文件名并将它变换为文件目录的索引值,能显著地提高检索速度

存在问题

  • hash 冲突
  • 哈希表长固定
  • 不符合Cache的设计理念(自己的理解)

文件共享

基于Inode的共享方式(硬链接)

不同文件目录中目录项的索引节点指针指向同一个索引节点,硬链接可视为两个指向同一地址指针,删除一个指针不会对另一个指针造成影响,其实质是允许一个文件拥有多个有效路径名,以防止“误删”源数据

利用符号链实现文件共享(软链接)

类似windows的快捷方式,其实质是存储实际文件的路径名,实现共享

软连接和硬链接比较

  1. 软链接可以跨文件系统,硬链接不可以
  2. 软链接可以对目录进行链接,硬链接不可以
  3. 软链接以文件的路径名的形式存在。硬链接以文件副本的形式存在(不论是硬链接或软链接都不会将原本的数据复制一份,只会占用非常少量的磁盘空间)
  4. 软链接会直接把原文件的引用计数值复制过来(原来的文件删除也不会改变这个引用计数值,其实这个计数器值对它来说没什么用,它“感受不到”原文件被删除了),硬链接共享计数器值
  5. 软链接可以对一个不存在的文件名进行链接,硬链接必须要有源文件

文件保护

文件的逻辑结构(文件组织)

文件是如何组织的,认为无结构文件(流式文件)不存在逻辑结构,只讨论有结构文件,不同的逻辑结构,本质上就是为了采用不同的查找方式

顺序文件(线性查找)

定长记录

  • 串结构
    • 各记录之间的顺序与关键字无关
    • 只能线性查找
  • 顺序结构
    • 文件中的所有记录按关键字(词)排列
    • 可以快速检索(折半查找)

可变长记录

  • 只能是串结构

优缺点

  • 能够批量存取
  • 定长记录可以随机存取,但非定长记录和定长记录的串结构文件查找困难
  • 增删记录困难(串结构相对简单)

索引文件(二分查找)

根据某个关键字建立一张索引表,解决可变长度记录的文件查找困难的问题,可以根据不同数据项建立多张索引表

优缺点

  • 查找速度快
  • 索引表本身是一个定长记录的顺序文件,可以折半查找
  • 修改文件,需要修改索引表
  • 索引表占据一定存储空间

索引顺序文件(先二分再线性)

索引和顺序的结合,速度很快,索引表也不至于太大

可建立多级索引表

哈希(Hash)文件(哈希查找)

直接文件或散列文件。给定记录的键值或通过散列函数转换的键值直接决定记录的物理地址。这种映射结构不同于顺序文件或索引文件,没有顺序的特性。散列文件有很高的存取速度,但是会引起冲突,即不同关键字的散列函数值相同。

文件的物理结构(存储结构、分配方式)

如何给文件分配物理块

连续分配

为每一个文件分配一组相邻接的盘块

优点

  • 支持顺序访问和随机访问

  • 连续分配的文件在顺序访问时速度最快

问题

  • 不方便文件扩展(增添)
  • 存储空间利用率低,会产生磁盘碎片(可以通过类似处理内存碎片的办法“紧凑”,但是是比较耗时的)
  • 适合长度固定的文件(比方说,接收一个不知道大小的网络文件,这时就很烦了,该给多大的空间呢?)

链接分配

将文件装到多个离散的盘块中

优点

  • 不会产生磁盘碎片,显著地提高了外存空间的利用率

  • 可动态分配盘块,无需事先知道文件的大小

隐式链接

问题

  • 只能顺序访问,随机访问极其低效(如果要访问第100个磁盘块,则须启动 100 次磁盘去实现读盘块的操作)

  • 可靠性较低,只通过链接指针来将一大批离散的盘块链接起来,只要其中的任何一个指针出现问题,都会导致整个链的断开。

显式链接

显式链接是指把用于链接文件各物理块的指针,从每个物理块的块末尾中提取出来,显式地存放在内存的一张链接表中。该表在整个磁盘中仅设置一张,称为文件分配表 FAT

一个磁盘一张FAT,开机时装入内存,且常驻内存,支持随机访问(只需要访问一次磁盘,前面的都是在内存里的FAT表中查的)

文件的第一个盘块号放在自己的 FCB 中

问题

  • 链接分配方式虽然解决了连续分配方式所存在的问题,但不能支持高效的直接存取,FAT 需占用较大的内存空间

  • 显示链接的可靠性依然是不可保证的

索引分配(Inode)

【根据两次统考题上的描述,将索引分配的索引块称之为“索引节点 Inode” ,我觉得跟目录管理提到的“索引节点”是同一种技术,不过目录管理中指的是采用Inode时的文件目录项,这里是采用Inode时的物理分配方式,因为采用索引结构时,FCB会非常大,因为需要存整张索引表,有必要进行“瘦身“】

为每个文件分配一个索引块 Inode,文件的FCB记录指向Inode的指针,Inode中记录一张索引表,将文件所对应的盘块号集中地放在一起,Inode中第i个条目指向文件的第i个块的物理块号

两次访外存,得到数据,先把索引块读入内存,再查索引块得到物理地址,取出数据

优缺点

  • 可随机访问,易于增删

  • 索引表空间开销

大文件导致的索引表过长问题

  • 链接方案,将多个索引块链接起来
  • 多级索引
    • 同多级页表,每级索引表不允许超过一个磁盘块
    • n级索引表,需要n+1次访存,得到数据
    • 致命的缺点,即便是很小的文件,依然需要n+1次访存,而且一般计算机中小文件占据多数
  • 混合索引,解决多级索引的致命缺点

文件的物理结构与逻辑结构比较

逻辑结构,就是指在用户看来,用户能看到的,文件的数据是如何组织起来的,比方说word就是一个个文字,而excel就是一个个单元格。而“物理结构”指的是在操作系统看来,文件的数据是如何存放在外存中的。

物理结构,就是对于操作系统来说,这个文件是怎么存储在磁盘上。

逻辑结构与物理结构相适应才能在让用户满足的同时也让OS满足,假如一个逻辑结构为索引结构的文件,在物理结构上采用的是链式结构,那么它还是无法实现快速读取

文件存储空间管理(管理空闲磁盘块)

空闲表法

连续分配方式,与内存管理中动态分区分配的空闲分区表/链式一样的

分配与回收

与内存的动态分配类似,同样可以采用首次适应算法、循环首次适应等算法

注意

在内存分配中很少采用连续分配方式,然而在外存管理,磁盘的对换区为了追求更高的效率,采用连续分配,可减少访问磁盘的 I/O 频率,连续分配的区域 I/O 速度更快,一般存储文件还是会采用离散分配(当文件比较小时,采用连续分配效率也较高)

空闲链表法

空闲盘块链

离散分配方式,将磁盘上的所有空闲空间,以盘块为单位拉成一条链

分配与回收

从链首依次摘下适当数目的空闲盘块分配给用户,系统将回收的盘块依次插入空闲盘块链的末尾【分配和回收一个盘块的过程非常简单,但在为一个文件分配盘块时,可能要重复操作多次】

优点与问题

不需要额外的空间,但分配多少就得访问多少块


空闲盘区链

离散&连续分配方式,将磁盘上的所有空闲空间,以盘区(每个盘区可包含若干个盘块)为单位拉成一条链

分配与回收

分配盘区的方法与内存的动态分区分配类似,通常采用首次适应算法

位示图法

离散&连续分配,利用二进制的一位来表示磁盘中一个盘块的使用情况,磁盘上所有的盘块都有一个二进制位与之对应。当其值为“0”时,表示对应的盘块空闲;当其值为“1”时,表示对应的盘块已分配。

成组链接法

空闲表法和空闲链表法都不适用于大型文件系统,因为这会使空闲表或空闲链表太长,UNIX 系统采用成组链接法

基本思想

把顺序的n个空闲扇区地址保存在第一个空闲扇区内,其后一个空闲扇区内则保存另一顺序空闲扇区的地址,如此继续,直至所有空闲扇区均予以链接。系统只需要保存一个指向第一个空闲扇区的指针。

操作系统(四)文件管理_第2张图片

磁盘组织与管理

磁盘构造

磁头

每个盘面有一个磁头,所有磁头都是连接在一根磁柱上的,它们是共进退的

盘面

每个盘片有一个或者两个盘面,看读写磁头是单向还是双向的

磁道

每个盘面划分成一个个磁道(圈)

每个磁道存储的数据量是相同的,而最内侧磁道上的扇区面积最小,因此数据密度最大

柱面

所有盘面中相对位置相同的磁道组成柱面

扇区

一个磁道又被划分成一个个扇区

扇区是磁盘的最小管理单元(未分簇的操作系统)

扇区的数目是由最靠内的磁道能记录的扇区数决定的

操作系统(四)文件管理_第3张图片

磁盘容量

  • 记录密度,磁道一英寸的段中可以放入的位数,每个磁道存储的数据量是相同的,而最内侧磁道上的扇区面积最小,因此记录密度最大,扇区的数目是由最靠内的磁道能记录的扇区数决定的。为了保持每个磁道有固定的扇区数,越往外的磁道扇区隔得越开

  • 磁道密度,从盘片中心出发半径上一英寸的段内的磁道数

  • 面密度,记录密度与磁道密度的乘积

磁盘块

文件系统就是操作系统的一部分,OS进行磁盘管理的最小单位是"块"(Linux下如Ext4等文件系统),分簇的操作系统,簇是OS进行磁盘管理的最小单位(Windows下如NTFS等文件系统)

一个磁盘块对应一个扇区,磁盘块是OS逻辑上的概念,扇区是实际存在的

扇区是磁盘最小的物理存储单元,但是由于操作系统无法对数目众多的扇区进行寻址,所以操作系统就将相邻的扇区组合在一起,从而形成簇然后在对簇进行管理,以簇为单位进行空间分配。【簇也是逻辑概念,同磁盘块地位相同】

磁盘调度

调度时间计算

  • 寻道时间

    受磁盘调度算法影响,一般会给出“相邻磁道平均移动时间”,拿总移动磁道数乘上即可

  • 延迟时间

    延迟时间如果没有明确指出或者说忽略,一般取磁盘转一周时间的一半

  • 传输时间

    需要传输b字节数据,磁盘转速为r转/秒,一个磁道可存储N字节

    1 r ⋅ b N \frac{1}{r}\cdot \frac{b}{N} r1Nb

调度算法(减少寻道时间)

先来先服务 FCFS

平均寻道时间较长

公平,不会饥饿


最短寻道时间优先 SSTF

贪心策略,每次的选取具有后效性,不能保证平均最少

可能导致饥饿


扫描算法(电梯调度) SCAN

SCAN:只有磁头移动到最外侧磁道的时候才能往内移动,移动到最内侧磁道的时候才能往外移动

LOOK:如果在磁头移动方向上已经没有别的请求,就可以立即改变磁头移动方向

响应频率不均匀(两侧两次响应的相隔时间短)

不会饥饿


循环扫描算法 CSCAN

磁头朝某个特定方向移动时才处理磁道访问请求,而返冋时直接快速移动至起始端而不处理仼何请求,解决响应频率不均匀的问题

减少延迟时间

磁道交替编号盘面错位命名

访问一个磁道后,为访问下一个磁道做准备

访问一个盘面后,为访问下一个盘面做准备

操作系统(四)文件管理_第4张图片

磁盘地址采用【柱面号,盘面号,扇区号】格式

对于一个需要多个磁道存储的文件,如果存在同一盘面的不同磁道上,读取时势必要移动磁头;如果存在同一柱面的不同磁道,就不需要移动磁头

磁盘管理

磁盘初始化

低级格式化涉及硬件,高级格式化涉及OS

低级格式化(物理格式化)

划分出柱面和磁道,再将磁道划分成扇区

在高级格式化之前,需要进行磁盘分区,将一个实体磁盘在逻辑上划分为数个磁盘

高级格式化

  • 清除硬盘上的数据

  • 生成引导区信息

  • 生成文件系统,包括创建文件系统的根目录、初始化存储空间管理所用的数据结构(如位示图、空闲分区表、FAT表)

  • 标注逻辑坏道


引导块

ROM中只存放很小的“自举装入程序”,完整的自举程序放在磁盘的启动块,启动块位于磁盘的固定位。启动分区所在的磁盘称为启动盘或系统盘。

为什么Windows更新/装软件会要求重启电脑?

覆盖/删除一个正在被打开的文件,Windows采取强制手段(不允许)

如果安装的软件涉及到一些系统文件的更新,一般系统文件都是正在运行/被打开的,那么自然就需要重启电脑,在系统内核加载前,去覆盖这些文件。(这个步骤,显然需要ROM中的程序来引导)

注册表文件(system.dat,user.dat)看来不属于上述情况,因为我们是可以通过regedit来修改的。


坏块

对于简单的磁盘,可以在逻辑格式化时(建立文件系统时)对整个磁盘进行坏块检査,标明哪些扇区是坏扇区,比如:在FAT表上标明。这种方式,坏块对操作系统不透明

对于复杂的磁盘,磁盘控制器(磁盘设备内部的一个硬件部件)会维护一个坏块链表。在磁盘出厂前进行低级格式化(物理格式化)时就将坏块链进行初始化。会保留一些“备用扇区”,用于替换坏块。这种方案称为扇区备用。这种方式,坏块对操作系统透明

你可能感兴趣的:(计算机考研,408,操作系统,文件管理,408,计算机考研)