操作系统:文件系统的实现

2025-04-02

一、文件系统结构

磁盘的逻辑单元为块,内存和磁盘之间的I/O传输以块为单位执行。

磁盘的特点

1可以原地重写,可以从磁盘上读一块儿,修改该块,并将它写回到原来的位置

可以直接访问磁盘上的任意一块。因此,可以方便地按顺序或随机访问文件

文件系统需要提供高效快捷磁盘访问,以便轻松存储、定位、提取数据。即存储文件、访问文件

文件系统有两个不同的设计问题

访问问题:如何定义文件系统对用户的接口

存储问题:创建数据结构和算法,把逻辑文件系统映射到物理外存设备

文件系统本身通常由许多不同层组成。每层实际利用更低层功能,创建新的功能,以用于更高层的服务。

图片

设备驱动程序可以作为翻译器,他的输入作为高级指令,输出由底层的、硬件特定指令组成。

基础文件系统只需向适当设备驱动程序发送命令。

逻辑文件系统通过文件控制块维护文件结构。

文件控制块(FCB)包含有关文件的信息,包括所有者、权限、文件内容的位置等。

大多数操作系统支持多种不同的文件系统,举例:

二、文件系统实现1.概述

在磁盘上,文件系统包括的信息有

如何启动存储在那里操作系统

总的块数

空闲块的数目和位置

目录结构

各个具体文件 等

上述许多结构会在之后详细讲述。这里简述如下:

内存中的信息用于管理文件系统并通过缓存来提高性能,这些数据在安装文件装系统时被加载,在文件系统操作期间被更新,在卸载是被卸载。这些结构类型包括:

每个进程的打开文件表:包括一个指向系统的打开文件表中合适条目的指针和其他信息

整个系统的打开文件表:包括每个打开文件的FCB副本和其他信息

创建一个新文件

应用程序调用逻辑文件系统。逻辑文件系统指导目录结构的格式,它会分配一个新的FCB

系统将相应的目录信息读入内存

更新目录结构和FCB

将结果写回磁盘

一旦文件被创建,就能用于I/O,不过,首先他要被打开。系统调用open()将文件名传到逻辑文件系统,系统调用open():

首先搜索整个系统的打开文件表,查看是否已经被打开,如果是,则在该进程的打开文件表创建一个条目,并指向现有整个系统的打开文件表。

否则,根据文件名搜索目录结构

找到后,它的FCB会复制到内存的整个系统的开放文件表中(该表还存放着打开该文件的进程数量) ,接下来,在该进程的打开文件表创建一个条目,并指向现有整个系统的打开文件表。

Open() 返回值:文件描述符是一个非负整数。它是一进程打开文件表的索引值,指向系统范围内打开文件表相应条目

图片

图片

2.虚拟文件系统

操作系统如何才能将多个类型的文件系统集成到目录结构中?用户如何在访问文件系统空间时,可以无缝地在文件系统类型间迁移?大多数操作系统采用面向对象的技术来简化、组织、模块化实现。

数据结构和程序用于隔离基本的操作系统调用的功能与实现细节。因此,文件系统的实现有三个主要层构成。

第一层为文件系统接口。

第二层为虚拟文件系统(VFS),把文件系统的通用操作和具体实现分开,虚拟文件系统提供了在唯一标识一个文件的机制。VFS基于vnode 的文件表示结构,它包含了一个数值标识符来唯一表示网络上的一个文件。

VFS能区分不同本地文件系统

VFS能区分本地文件系统和远程文件系统

图片

图片

三、目录实现1.线性列表

采用文件名称和数据块指针的线性列表

2.哈希表

哈希表根据文件名得到一个值,并返回一个指向线性列表中元素的指针

四、磁盘空间的分配方法1.连续分配

每个文件在磁盘上占有一组连续的块。文件的连续分配可以用文件第一块的磁盘地址和连续块的数量(即长度)来定义

图片

连续分配支持顺序访问和直接访问

问题:当文件需要扩展,文件大小变大时会无法扩展

解决:找更大的连续空间,复制过去

基于扩展的连续分配方案用以下参数来定义文件

开始地址

块儿数

指向下一个扩展块儿的指针(扩展块儿可以是多个)

定义格式:

文件【开始地址,块儿数,指向下一个扩展块的指针】

2.链接分配

每个文件是磁盘块儿的链表,磁盘块分布在磁盘的任何地方,文件有起始块和结束块来定义

定义格式:【起始块,结束块】

同时,每个磁盘块都有指向下一个磁盘块的地址。

图片

优点:没有磁盘空间浪费

缺点:

不支持文件的直接访问

下一篇:没有了
上一篇:入选Gartner和Forrester报告的阿里云AnalyticDB是如何实现PB级数据分析毫秒级响应
相关文章
返回顶部小火箭