【操作系统概念】第11章:文件系统实现

0.前言

正如第10章所述,文件系统提供了机制,以在线存储和访问文件内容,包括数据和程序。文件系统永久驻留在外存上,而外存设计成永久容纳大量数据。本章主要关注大多数常用外存即磁盘上的文件存储与访问问题。我们讨论各种方法,用于组织文件使用、分配磁盘空间、恢复空闲空间、跟踪数据位置以及操作系统其他部分与外存的接口等。本章也将讨论性能问题。

本章目标:

  1. 描述本地文件系统和目录结构的实现细节
  2. 描述远程文件系统的实现
  3. 讨论块分配和空闲块的算法和平衡

11.1 文件系统结构

磁盘提供大量的外存空间来维持文件系统。磁盘的下述两个特点使得其成为存储多个文件的方便介质。
①可以原地重写;
②可以直接访问磁盘上的任意一块信息。

为了提供对磁盘的高效且便捷的访问,操作系统通过文件系统来轻松地存储、定位、提取数据。文件系统有两个设计问题。
①定义文件系统对用户的接口
②创建数据结构和算法来将逻辑文件系统映射到物理外存设备上
另外,与内存管理的部分方式相同,磁盘同样是以块为单位进行转移的。每块为一个或多个扇区
在这里插入图片描述

  • IO控制为最底层,提供设备驱动程序和中断处理程序。实现内存和磁盘之间的信息传输
  • 基本文件系统发送命令,对磁盘上的物理块进行读写。 每个块通过磁盘地址标识(驱动器,柱面,磁道,扇区)
  • 文件组织模块将逻辑地址转换为物理地址,管理文件的逻辑块。同时含有空闲空间管理器,跟踪未分配的块,并根据要求提供给文件组织模块。
  • 逻辑文件系统管理元数据,管理目录结构,提供给文件组织模块必要的信息。以及通过文件控制块(file control block,FCB)维护文件结构

11.2 文件系统实现

11.2.1 虚拟文件系统

在这里插入图片描述
现代操作系统必须支持多个文件系统类型,因此操作系统必须把多个文件系统整合为一个目录结构。

  • 一个简单但不是很好的方法是为每个文件系统编写目录和文件程序。但这不面向对象。

因此可以将文件系统分为三个层次。

  1. 文件系统接口:包括open(),read(),write(),close()调用及文件描述符。
  2. 虚拟文件系统层(VFS层):区分本地文件和远程文件,并根据文件系统类型进一步区分不同本地文件。
    VFS定义了一个清晰的VFS接口,将文件系统的通用操作和具体实现分开。
    提供网络上唯一标识一个文件的机制。(基于vnode的文件表示结构)
  3. 各个类型的本地文件系统:通过VFS结合在一起,并由文件系统接口调用。
    VFS根据文件系统类型调用特定文件类型操作以处理本地请求,通过调用NFS协议程序来处理远程请求。

VFS层有两个目的:

  • VFS层通过定义一个清晰的VFS接口,以将文件系统的通用操作和具体实现分开。多个VFS接口的实现可以共存在同一台机器上,他允许访问已安装在本地的多个类型的文件系统。
  • VFS提供了在网络上唯一标识一个文件的机制。VFS基于称为vnode的文件表示结构。UNIX内核中为每个活动节点(文件或目录)保存一个vnode结构

11.3 分配方法

磁盘是直接访问的,非常灵活,其可以存储多个文件,所以一个问题是如何为这些文件分配空间,以便有效的访问和索引这些文件。

主要的分配方法有连续、链接、索引,每种方法有其优缺点。

常见的一个系统只支持一种分配方法,但也有系统支持多种分配方法

11.3.1 连续分配

连续分配(contiguous allocation) 要求每个文件在磁盘上占有一系列连续的块。
在这里插入图片描述
优点:

在访问块b后访问块b+1通常不需要移动磁头,当需要移动时(读到当前磁道末),只需要移动一个磁道。因此访问连续分配文件需要的寻道数最小。性能较好。
访问容易,连续分配支持顺序访问和直接访问

缺点:

如何为新文件找到空间,这是一个动态存储分配问题(第八章提到过),相关的算法会产生外部碎片问题

外部碎片的一个解决方案是合并(compact),即将小的空闲空间合并起来,而将其他存储的数据变成连续数据。显而易见这种方式的主要开销是时间,因为需要很多的IO操作。不能扩展
另一方面,这种方式还需要确定一个文件占用多少空间。文件的大小有时候可能比较好确定,但通常比较难以确定。

11.3.2 链接分配

在这里插入图片描述
采用链接分配(linked allocation),每个文件是磁盘块的链表。目录包括文件第一块的指针和最后一块的指针。每一块都有指向下一块的指针。

采用链接分配,每一个目录条目都有一个指向文件首块的指针。这些指针一开始均为nil(代表空指针,表示空文件)。

  • 在写文件时就可以通过空闲空间管理系统找到一个空闲块。
  • 在读文件时,通过块到块的指针就可以简答的读块。

优点:
没有外部碎片,空闲空间的任何一块都可以满足要求。
创建文件时,不需要说明文件大小。
不需要合并磁盘空间
可以说链接分配解决了连续分配的所有问题。

缺点:
只能用于顺序访问,要找到中间位置,必须跟随指针一块一块的移动。
指针需要空间。
可靠性较低。如果硬盘损坏,若损坏的是指针,那么这可能导致链接到错误的位置。

第一个问题的一个解决方案是采用链接分配方式的变种:文件分配表(FAT),具体参考P365
在这里插入图片描述
第二个问题的一个解决方式是将块合并为族,指针按族分配而不是按块分配,一个族包含多个块。这样就减少了指针的使用。但这样的问题就是会增加内部碎片。

第三个问题的解决方式是增加双向链表或在每个块中存文件名和相对块数,不过这也将导致开销增大。

11.3. 3 索引分配

链接分配解决了外部碎片和大小的声明问题,但如果不使用FAT,那么就没有办法有效的支持直接访问。

索引分配(index allocation) 把所有的指针存放在一起,通过索引块解决这一问题。

索引块是一个磁盘块地址的数组。

每个文件都有索引块,其第i块指向文件的第i个块。目录条目包含索引块的地址。要读第i块只需要通过索引块的第i个条目的指针查找和读取即可。

创建文件时,索引块所有指针都设置为nil,开始写第i块时,即从空闲空间管理系统中获取一块,并将指针设置为该地址。

**优点:**没有外部碎片,并且支持直接访问。因为磁盘上任何一个位置都可以通过索引获取。
缺点: 浪费空间。索引块的开销比指针要大很多。

针对缺点的解决方案:

  1. 链接方案:一个索引块通常为一个磁盘块,因此,它本身能直接读写。为了处理大文件,可以将多个索引块链接起来
  2. 多层索引:用第一层索引块指向一组第二层的索引块,第二层索引块再指向文件块,这是链接表示的一种变种。
  3. 组合方案:将索引块的头15个指针存在文件的inode中。这其中的前12个指针指向直接块。其他的3个指针指向间接块。第一个间接块为一级间接块的地址,第二个间接块为二级间接块的指针,第三个间接块为三级间接块指针

11.5 空闲空间管理

系统需要维护一个空闲空间链表(free-space list),该链表记录了所有的空闲磁盘空间,并在创建文件时,能够从该链表搜索并返回一段空闲空间。
虽然名字称为链表,但实现形式不一定表现为链表。这一点要注意

11.5.1 位图/位向量

采用位图(bit map)或位向量(bit vector),每块用一位表示,分配表示1,未分配表示0
优点:查找空闲块和n个连续空闲块相对简单和高效。

缺点:除非将整个位图都放在内存中方便及时查询,否则其效率就不是很高。这对于小型磁盘是完全可以的,但对大型磁盘,就需要相对较多的内存。

11.5.2 链表

将空闲磁盘块用链表连接起来,并将指向第一个空闲磁盘块的指针保存在磁盘的特殊位置,并同时放置到内存中。
在这里插入图片描述
这种方案的效率不高,因为遍历一遍链表需要大量的IO,但通常分配空闲空间不需要遍历,只需要将第一块分配即可。

11.5.3 组

组是对链表的一个改进,组将n个空闲块的地址存在第一个空闲块中。这n个空闲块的最后一个包含了另外n个空闲块的地址。
采用这种方式,大量的空闲块可以很快的找到。

  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵远疴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值