《操作系统概念精要》之文件系统篇(二)- 文件系统实现

文件系统结构

文件系统本身通过由许多不同层组成,每层的设计利用更低层的功能,创造新的功能。


文件系统结构.png

I/O控制层(I/O control):包括设备驱动和中断处理程序,以在主内存和磁盘系统之间进行信息交流。
基本文件系统(basic file system): 本层需要发送通用命令给设备驱动层,并且还要管理内存缓冲区保存各种文件系统,目录和数据块的缓存
文件组织模块(file-organization module): 知道文件及其逻辑块以及物理块。由于知道所用的文件系统的类型和文件位置,文件组织可以将逻辑块地址转换成物理地址以供基本文件系统传输。
逻辑文件系统(logical file system): 管理元数据信息。元数据包括文件系统的所有结构,而不包括实际数据,逻辑文件系统管理目录结构,以便根据给定的文件名称为文件组织模块提供所需的信息。

文件系统实现

概述

稳健性系统的实现需要采用多个磁盘和内存的结构。虽然这些结构因操作系统和文件系统而异,但是还是有些通用原则的。
在磁盘上,文件系统包括以下信息:

  • 引导控制块:指示如何启动存储在哪里的操作系统,如果磁盘不包含操作系统,那么这部分为空,一般为启动分区的第一个扇区。 Unix上称为引导块, Windows系统称为分区引导扇区
  • 卷控制块: 包括卷(分区)的详细信息,如分区的数量和块的大小,空闲块的数量和指针,空闲的文件控制块(FCB)和FCB指针。Unix称为超级块,Windows称为主控文件表
  • 文件系统的目录结构和用于组织文件。Unix中 包含 文件名和相关的inode的号码。
  • 每个文件的FCB 包括该文件的许多信息。它有一个唯一的标识号。以便与目录条目相关联。

在内存中的信息:

  • 内存的安装表: 包含每个安装卷的信息。
  • 内存中的目录结构的缓存含有最近访问的目录的信息。
  • 整个系统的打开文件表。
  • 每个进程的打开文件表。
  • 缓冲区保存的文件系统的块。

文件的创建过程
为了创建新的文件,应用程序调用逻辑文件系统。逻辑文件系统直到目录结构的格式。它会分配一个FCB。然后将相应的目录读到内存,然后使用新的文件名和FCB进行更新,将它写会磁盘。

文件的读写过程

  • 打开文件的实际操作:
    一旦文件被创建,他就可以进行I/O操作。不过他首先应该被打开,系统调用open()将文件名传递到逻辑文件系统。系统首先搜索整个系统的打开文件表,以便确定这个文件是否被其他进程使用。
    如果是,则在进程的打开文件表中创建一个条目,并让他指向现有的系统的打开文件表,进程的打开文件表的计数加1。
    如果没有,则根据给定的文件名来搜索目录结构。(部分的目录结构通常缓存在内存中,以加快目录操作。)找到文件后,它的FCB 会被复制到内存的整个系统的开发文件表中。该表不但存储FCB,还跟踪打开文件进程的数量。接下来,在整个进程的打开文件表中,会创建一个条目,指向整个系统打开文件条目的一个指针,以及其他域。这些域可能包含文件系统的当前位置的指针和打开文件的访问模式。随后,进程的打开文件表的计数加1。
  • open() 文件最终返回一个文件指针。以后所有的操作都用这个指针,UNIX 中称为文件描述符, windows 称为文件句柄
  • 进程关闭文件时,它的单个进程的条目会被删除,并且系统的打开文件表中这个文件的打开计数会被减1。当文件计数为0时,他把文件的元数据写入此案。然后系统的打开文件表中删除此文件的条目。

分区与安装

磁盘布局可以有多种,具体取决于操作系统。一个磁盘可以分成多个区,或者一个卷跨越多个磁盘的多个分区。后者就是RAID的形式。

分区可以使原始的,什么文件系统都没有,什么都没有的时候就是原始磁盘。UNIX的交换分区就是一个原始磁盘, 有些数据库也使用原始磁盘,并且格式数据,以满足他们的要求。

引导的信息可以存储在各自分区中,而且可以有自己的格式,不一定和要加载的文件系统的保存结构一样。因此在这个阶段,还没有加载操作系统,更不会有文件系统。因此引导信息通常是一系列的块,可作为映像加载到内存。映像一般的执行从预先定义的位置执行。这个引导的信息里面应该包含应该以怎样的结构来解析接下来的文件系统信息,从而找到内核,并进行执行。
许多系统可以有多个引导程序,因为可以安装双系统。

根分区,包括操作系统内核其他文件系统,在启动时安装,其他卷可以在引导时自动安装以后安装。

虚拟文件系统

现代操作系统必须同时支持多中类型的文件系统,但是操作系统如何才能实现将多个类型的文件系统集成到目录结构中呢?用户如何在多个文件系统中无缝的迁移?

在大多数的操作系统中,都支持了在不同文件类型可通过相同的类型来实现。它也包括网络文件系统类型。
数据结构和程序用于隔离基本系统调用的功能和实现细节。因此,文件系统的实现由三个主要层组成。

  • 第一次为文件系统接口层。基于系统调用open, read, write 和close。
  • 虚拟文件系统层(VFS)。他提供两个功能:
    1. 通过定义一个清晰的VFS接口,将文件系统的通用操作和实现分开。VFS提供多个通用接口,允许透明的访问本地安装的不同类型的文件系统。
    2. 它提供了一种机制,唯一表示网络上的文件。VFS 基于称为虚拟节点的文件表示结构, 虚拟节点包含一个数字指示符,唯一表示网络上的一个文件。UNIX中采用inode。内核为每个活动节点保存一个vnode结构。
虚拟文件系统.png

VFS根据文件系统的类型调用特定的操作以便处理本地请求。通过NFS协议程序来处理远程请求。

目录的实现

数据结构的选择

  1. 线性列表:不合适。频繁的搜索称为问题。
  2. 哈希表:哈希表根据文件名获取一个值,并返回线性列表内的一个元素指针。减少了目录搜索的时间。当发生冲突的时候可以使用链式哈希结构。

分配方法

创建文件时,如何在空闲的磁盘上为一个新文件分配空间?
一般由是那种方法: 连续,链接和索引。

连续分配
连续分配表示每个文件在磁盘上占有一组连续的块。磁盘地址为一组线性结构。
问题:在给每个分配的时候,容易在中间产生碎片。 还有无法估算一个文件有多大, 估算的很小,没有办法扩展。

链接分配
解决了连续分配的所有问题,每个文件都是磁盘块的链表。文件的磁盘块可能分布在磁盘的任何地方,通过链表来进行连接。
问题:只能顺序的访问文件,要找到第i个块,必须从头开始。还有每次磁盘块的最后4个字节需要保存下一个磁盘的地址。而且如果链断了,就全部完了。

索引分配
索引分配通过将所有指针放在一起,称为索引块。
每个文件都有自己的索引块。这是一个磁盘块地址的数组。索引块的第一个条目指向文件的第i块。目录包含索索引块的地址。

索引分配.png

空闲空间管理

由于磁盘空间有限,如果可能,需要将删除文件的空间重新用于新文件。为了跟踪空闲磁盘空间。系统需要维护一个空闲空间列表。空闲空间列表记录了所有空闲磁盘空间。

位图
空闲空间列表按 位图(bitmap)来实现。每个块用一个位来表示。块是空闲的,位为1;如果块是分配的,位为0。

链表
空闲空间将所有的空闲磁盘块用链表连接起来。


空闲列表方法的一个改进是,在第一个空闲块中存储n个空闲块的地址
这些块的前n-1个确实为空。
最后一块包含另外n个空闲块的地址。

你可能感兴趣的:(《操作系统概念精要》之文件系统篇(二)- 文件系统实现)