【北邮 操作系统】第十二章 文件系统实现

article/2025/6/7 12:44:24

一、文件的物理结构

1.1 文件块、磁盘块

  1. 类似于内存分页,磁盘中的存储单元也会被分为一个个“块/磁盘块/物理块”。很多操作系统中,磁盘块的大小与内存块、页面的大小相同

  2. 内存与磁盘之间的数据交换(即读/写操作、磁盘I/0)都是以“块”为单位进行的。即每次读入一块,或每次写出一块

  3. 在内存管理中,进程的逻辑地址空间被分为一个一个页面,同样的,在外存管理中,为了方便对文件数据的管理,文件的逻辑地址空间也被分为了一个一个的文件块,于是文件的逻辑地址也可以表示为(逻辑块号,块内地址)的形式。

  4. 用户通过逻辑地址来操作自己的文件,操作系统要负责实现从逻辑地址到物理地址的映射

1.2 连续分配

连续分配方式要求每个文件在磁盘上占有一组连续的块

  1. 用户通过逻辑地址来操作自己的文件,(逻辑块号,块内地址)→(物理块号,块内地址)。只需转换块号就行,块内地址保持不变。

  2. 文件目录中记录存放的起始块号和长度(总共占用几个块)

  3. 用户给出要访问的逻辑块号,操作系统找到该文件对应的目录项(FCB),物理块号=起始块号+逻辑块号,当然,还需要检查用户提供的逻辑块号是否合法(逻辑块号之长度就不合法)

  4. 可以直接算出逻辑块号对应的物理块号,因此连续分配支持顺序访问直接访问(即随机访问)

  5. 优点:连续分配的文件在顺序读/写时速度最快,支持顺序访问直接访问(即随机访问)

  6. 缺点:物理上采用连续分配的文件不方便拓展;物理上采用连续分配,存储空间利用率低,会产生难以利用的磁盘碎片。可以用紧凑来处理碎片,但是需要耗费很大的时间代价。

1.3 链接分配

链接分配采取离散分配的方式,可以为文件分配离散的磁盘块。分为隐式链接显式链接两种。

1.3.1 隐式链接

  1. 链接分配采取离散分配的方式,可以为文件分配离散的磁盘块。分为隐式链接和显式链接两种。

  2. 如何实现文件的逻辑地址到物理块号的转变:

    1) 用户给出要访问的逻辑块号i,操作系统找到该文件对应的目录项(FCB)

    2) 从目录项中找到起始块号(即0号块),将0号逻辑块读入内存,由此知道1号逻辑块存放的物理块号,于是读入1号逻辑块,再找到2号逻辑块的存放位置..….以此类推。

    3) 因此,读入i号逻辑块,总共需要i+1次磁盘I/0

  3. 缺点:采用链式分配(隐式链接)方式的文件,只支持顺序访问,不支持随机访问,查找效率低。另外,指向下一个盘块的指针也需要耗费少量的存储空间。

  4. 优点:采用隐式链接的链接分配方式很方便文件拓展。另外,所有的空闲磁盘块都可以被利用,不会有碎片问题,外存利用率高

1.3.2 显示链接

  1. FAT:把用于链接文件各物理块的指针显式地存放在一张表中。即文件分配表(FAT, File Allocation Table )

  2. 假设某个新创建的文件“aaa”依次存放在磁盘块2->5->0->1;假设某个新创建的文件“bbb”依次存放在磁盘块4->23->3

  3. 注意:一个磁盘仅设置一张FAT。开机时,将FAT读入内存,并常驻内存。FAT的各个表项在物理上连续存储,且每一个表项长度相同,因此“物理块号”字段可以是隐含的。

  4. 如何实现文件的逻辑地址到物理块号的转变:

    1) 用户给出要访问的逻辑块号i,操作系统找到该文件对应的目录项(FCB).

    2) 从目录项中找到起始块号,若i>0,则查询内存中的文件分配表FAT,往后找到i号逻辑块对应的物理块号

    3) 逻辑块号转换成物理块号的过程不需要读磁盘操作

  5. 优点:很方便文件拓展,不会有碎片问题,外存利用率高,并且支持随机访问。相比于隐式链接来说,地址转换时不需要访问磁盘,因此文件的访问效率更高

  6. 缺点:文件分配表的需要占用一定的存储空间。

1.4 索引分配

索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块(索引表的功能类似于内存管理中的页表--建立逻辑页面到物理页之间的映射关系)。索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块

  1. 假设某个新创建的文件“aaa”的数据依次存放在磁盘块2->5->13->9。7号磁盘块作为“aaa”的索引块,索引块中保存了索引表的内容。

  2. 注意:在显式链接的链式分配方式中,文件分配表FAT是一个磁盘对应一张。而索引分配方式中,索引表是一个文件对应一张。

  3. 可以用固定的长度表示物理块号(如:假设磁盘总容量为1TB=2^40B,磁盘块大小为1KB,则共有 2^30个磁盘块,则可用4B表示磁盘块号),因此,索引表中的“逻辑块号”可以是隐含的。

  4. 如何实现文件的逻辑地址到物理块号的转变:

    1) 用户给出要访问的逻辑块号i,操作系统找到该文件对应的目录项(FCB)

    2) 从目录项中可知索引表存放位置,将索引表从外存读入内存,并查找索引表即可知i号逻辑块在外存中的存放位置。

  5. 可见,索引分配方式可以支持随机访问文件拓展也很容易实现(只需要给文件分配一个空闲块,并增加一个索引表项即可),但是索引表需要占用一定的存储空间

若每个磁盘块1KB,一个索引表项4B,则一个磁盘块只能存放 256 个索引项,如果一个文件的大小超过了256块,那么一个磁盘块是装不下文件的整张索引表的,如何解决这个问题?

解:①链接方案②多层索引③混合索引

【1.链接方案】

如果索引表太大,一个索引块装不下,那么可以将多个索引块链接起来存放。

假设磁盘块大小为1KB,一个索引表项占4B,则一个磁盘块只能存放256个索引项。

若一个文件大小为 256*256KB =65,536 KB=64MB

该文件共有256x256个块,也就对应256x256个索引项,也就需要256个索引块来存储,这些索引块用链接方案连起来。

若想要访问文件的最后一个逻辑块就必须找到最后一个索引块(第256个索引块),而各个索引块之间是用指针链接起来的,因此必须先顺序地读入前255个索引块。

这显然是很低效的。如何解决呢? :scream:

【2.多层索引】

建立多层索引(原理类似于多级页表)。使第一层索引块指向第二层的索引块。还可根据文件大小的要求再建立第三层、第四层索引块。

假设磁盘块大小为1KB,一个索引表项占4B,则一个磁盘块只能存放256个索引项。

若某文件采用两层索引,则该文件的最大长度可以到2562561KB=65,536KB=64MB

可根据逻辑块号算出应该查找索引表中的哪个表项。

如:要访问1026号逻辑块,则1026/256=4,1026%256=2

因此可以先将一级索引表调入内存,查询4号表项,将其对应的二级索引表调入内存,再查询二级索引表的2号表项即可知道 1026号逻辑块存放的磁盘块号了。

访问目标数据块,需要3次磁盘I/O,

若采用三层索引,则文件的最大长度为256x256x256x1KB=16GB

类似的,访问目标数据块,需要4次磁盘I/0

采用K层索引结构,且顶级索引表未调入内存,则访问一个数据块只需要K+1次读磁盘操作

【3.混合索引】

多种索引分配方式的结合。例如,一个文件的顶级索引表中,既包含直接地址索引(直接指向数据块),又包含一级间接索引(指向单层索引表)、还包含两级间接索引(指向两层索引表)。

优点:对于小文件来说,访问一个数据块所需的读磁盘次数更少。

二、文件存储空间管理

2.1 存储空间的划分与初始化

安装 Windows操作系统的时候,一个必经步骤是 -- 为磁盘分区(C:盘、D: 盘、E:盘等)

  1. 存储空间的划分: 将物理磁盘划分为一个个文件卷(逻辑卷、逻辑盘)

  2. 存储空间的初始化: 将各个文件卷划分为目录区、文件区

  3. 目录区主要存放文件目录信息(FCB)、用于磁盘存储空间管理的信息

  4. 文件区用于存放文件数据

  5. 有的系统支持超大型文件,可支持由多个物理磁盘组成一个文件卷

2.2 存储空间管理

2.2.1 空闲表法

  1. 如何分配磁盘块: 与内存管理中的动态分区分配很类似,为一个文件分配连续的存储空间。同样可采用首次适应、最佳适应、最坏适应等算法来决定要为文件分配哪个区间。

  2. 如何回收磁盘块:与内存管理中的动态分区分配很类似,当回收某个存储区时需要有四种情况 -- ①回收区的前后都没有相邻空闲区; ②回收区的前后都是空闲区; ③回收区前面是空闲区; ④回收区后面是空闲区。总之,回收时需要注意表项的合并问题

2.2.2 空闲链表法

  1. 空闲盘块链:

    操作系统保存着链头、链尾指针

    如何分配: 若某文件申请K个盘块,则从链头开始依次摘下K个盘块分配,并修改空闲链的链头指针。

    如何回收: 回收的盘块依次挂到链尾,并修改空闲链的链尾指针。

    适用于离散分配的物理结构。为文件分配多个盘块时可能要重复多次操作

  2. 空闲盘区链:

    操作系统保存着链头、链尾指针。

    如何分配: 若某文件申请K个盘块,则可以采用首次适应、最佳适应等算法,从链头开始检索,按照算法规则找到一个大小符合要求的空闲盘区分配给文件。若没有合适的连续空闲块,也可以将不同盘区的盘块同时分配给一个文件,注意分配后可能要修改相应的链指针、盘区大小等数据。

    如何回收: 若回收区和某个空闲盘区相邻,则需要将回收区合并到空闲盘区中。若回收区没有和任何空闲区相邻,将回收区作为单独的一个空闲盘区挂到链尾。

    离散分配、连续分配都适用。为一个文件分配多个盘块时效率更高

2.2.3 位示图法

  1. 位示图: 每个二进制位对应一个盘块。在本例中,“0”代表盘块空闲“1”代表盘块已分配。位示图一般用连续的“字”来表示,如本例中个字的字长是16位,字中的每一位对应一个盘块。因此可以用(字号,位号)对应一个盘块号。当然有的题目中也描述为(行号,列号)

  2. 重要重要重要: 要能自己推出盘块号与(字号,位号)相互转换的公式。

    (字号,位号)=(i,j)的二进制位对应的盘块号b=ni+j;

    b号盘块对应的字号i=b/n,位号j=b%n

  3. 如何分配:

    若文件需要K个块,

    ①顺序扫描位示图,找到K个相邻或不相邻的“0”;

    ②根据字号、位号算出对应的盘块号,将相应盘块分配给文件;

    ③将相应位设置为“1”

  4. 如何回收:

    ①根据回收的盘块号计算出对应的字号、位号;

    ②将相应二进制位设为“0”

2.2.4 成组链表法(难理解)

空闲表法、空闲链表法不适用于大型文件系统,因为空闲表或空闲链表可能过大。UNIX系统中采用了成组链接法对磁盘空闲块进行管理。

  1. 文件卷的目录区中专门用一个磁盘块作为“超级块”,当系统启动时需要将超级块读入内存。并且要保证内存与外存中的“超级块”数据一致。

  2. 如何分配:

    Eg:需要1个空闲块

    ①检查第一个分组的块数是否足够。1<100,因此是足够的。

    ②分配第一个分组中的1个空闲块,并修改相应 数据

    Eg:需要100个空闲块

    ①检查第一个分组的块数是否足够。100=100,是足够的。

    ②分配第一个分组中的100个空闲块。但是由于300号块内存放了再下一组的信息,因此300号块的数据需要复制到超级块中。

  3. 如何回收:

    Eg:假设每个分组最多为100个空闲块,此时第一个分组已有99个块,还要再回收一块

    将回收的空闲块查到第一个分组中

    Eg:假设每个分组最多为100个空闲块,此时第一个分组已有100个块,还要再回收一块。

    新回收的空闲块作为新的分组,将超级块中的内容复制到新回收的块中,超级块中的内容做一下修改,指向新回收的分组,超级块中 只有一个空闲块


http://www.hkcw.cn/article/LfMbcBRBkd.shtml

相关文章

VS2022下C++ Boost库安装与使用使用

一.Boost概述 1.简介 Boost 是一个广泛使用的 C 库集合&#xff0c;提供了许多高质量、可移植、高效的工具和组件&#xff0c;被视为 C 标准库的延伸。自 1998 年成立以来&#xff0c;Boost 已成为 C 社区的核心资源&#xff0c;许多 Boost 库通过实践验证后被纳入 C 标准&am…

Unity-UI组件详解

今天我们来学习Unity的UI的详解&#xff0c;这部分的内容相对较少&#xff0c;对于程序员来说主要的工作是负责将各种格式的图片呈现在显示器上并允许操作这些图片。 本篇帖子的理论依据依然是官方开源的UGUI代码&#xff0c;网址为&#xff1a;GitHub - Unity-Technologies/u…

化工厂爆炸事件看制造业AI转型

一、事件警示&#xff1a;化工制造安全风险不容忽视 近日&#xff0c;某化学有限公司发生事故。涉事工厂主体工程建设有2座硝化装置区&#xff0c;1座加氢装置区&#xff0c;均属于危险工艺生产装置。硝化反应通常属于强放热反应&#xff0c;原料及产物具有爆炸危险性&#xf…

Ubuntu系统安装与配置NTP时间同步服务

Ubuntu系统安装与配置NTP时间同步服务 一、NTP服务介绍NTP服务简介工作原理系统环境准备检查当前时间状态二、方案选择:systemd-timesyncd vs ntpd三、使用systemd-timesyncd时间同步1. 方案介绍2. 配置优化3. 应用配置4. 验证状态5. 检查当前时间状态6. 查看当前实践四、使用…

【小红书】API接口,获取笔记核心数据

小红书笔记核心数据API接口详解 - 深圳小于科技提供专业数据服务 深圳小于科技&#xff08;官网&#xff1a;https://www.szlessthan.com&#xff09;推出的小红书笔记核心数据API接口&#xff0c;为开发者提供精准的笔记互动数据分析能力&#xff0c;助力内容运营与商业决策。…

ElasticStack技术之logstash介绍

一、什么是Logstash Logstash 是 Elastic Stack&#xff08;ELK Stack&#xff09;中的一个开源数据处理管道工具&#xff0c;主要用于收集、解析、过滤和传输数据。它支持多种输入源&#xff0c;如文件、网络、数据库等&#xff0c;能够灵活地对数据进行处理&#xff0c;比如…

InternLM2/LM2.5/ViT/VL1.5/VL2.0笔记: 核心点解析

00 前言 本文主要是记录一下关于多模态大模型InternLM/InternVL系列的一些要点的理解。还是那句话&#xff0c;好记性&#xff0c;不如烂笔头。本文当成个人笔记用&#xff0c;行文风格和先前写的LLaVA系列一致。本文的重点是讲解多模态模型InternVL 1.5&#xff0c;但是Intern…

帝可得 - 设备管理

一. 需求说明 设备管理主要涉及到三个功能模块&#xff0c;业务流程如下&#xff1a; 新增设备类型: 允许管理员定义新的售货机型号&#xff0c;包括其规格和容量。 新增设备: 在新的设备类型定义后&#xff0c;系统应允许添加新的售货机实例&#xff0c;并将它们分配到特定的…

建设指南 | Cloud Apps + AI Apps端到端智能应用开发平台

在“云AI”作为基础设施的时代&#xff0c;研发、运维、信息化等部门&#xff0c;通常会面临的棘手问题都有哪些&#xff1a; 算力资源难以统一调度和管理&#xff1b;AI算法研发环境搭建复杂&#xff1b;不同模型部署方式繁杂&#xff0c;统一监控难&#xff1b;AI应用开发效…

【灵动Mini-F5265-OB】vscode+gcc工程创建、下载、调试

【前言】 【灵动Mini-F5265-OB】在官方的例程中提供了mdk、IAR的开发环境&#xff0c;使用起来非常方便。有位大佬也提供了一个gcc的示例&#xff0c;但是我使用vscode的keil插件进行工程创建&#xff0c;但是提示pack是对不上的。所以我决定重新创建我的vscode来创建开发环境。…

【AI论文】VF-Eval:评估多模态大型语言模型(MLLM)在生成人工智能生成内容(AIGC)视频反馈方面的能力

摘要&#xff1a;多模态大型语言模型&#xff08;MLLMs&#xff09;最近在视频问答领域得到了广泛研究。然而&#xff0c;现有的大多数评估都侧重于自然视频&#xff0c;而忽视了合成视频&#xff0c;例如人工智能生成的内容&#xff08;AIGC&#xff09;。与此同时&#xff0c…

Docker 镜像(或 Docker 容器)中查找文件命令

在 Docker 镜像&#xff08;或 Docker 容器&#xff09;中运行如下两个命令时&#xff1a; cd / find . -name generate.py它们的含义如下&#xff0c;我们来一行一行详细拆解&#xff0c;并结合例子讲解&#xff1a; ✅ 第一行&#xff1a;cd / ✅ 含义 cd 是“change dire…

DiskGenius专业版v6.0.1.1645:分区管理、数据恢复、备份还原,一应俱全!

各位小伙伴&#xff0c;大家好&#xff01;今天阿灿给大家带来一款超好用的分区工具&#xff0c;DiskGenius专业版。这款工具堪称电脑管理界的“瑞士军刀”&#xff0c;功能强大&#xff0c;现在出了新版本v6.0.1.1645&#xff0c;简繁中文单文件便携版&#xff0c;使用超方便。…

‌CDGP|数据治理的低效性:企业AI落地的另一大挑战

在数字化转型的浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;已成为推动企业创新发展的重要力量。然而&#xff0c;尽管AI技术具有巨大的潜力和优势&#xff0c;但许多企业在尝试落地AI项目时却面临着重重挑战。其中&#xff0c;数据治理的低效性尤为突出&#xff0c;…

linux学习第19、20天(父子进程)

ps ajx -->查看pid&#xff0c;ppid&#xff0c;gid&#xff0c;sid 父子进程 父子进程相同&#xff1a; 刚fork后&#xff0c;data段、text段、堆&#xff0c;栈、环境变量、全局变量、进程工作目录位置、信号处理方式 父子进程不同&#xff1a; 进程id、返回值、各自的…

AI写作革命:重塑创作未来

人工智能写作技术&#xff1a;革新创作方式的智能利器 人工智能写作技术&#xff08;AI写作技术&#xff09;是指利用自然语言处理&#xff08;NLP&#xff09;、机器学习&#xff08;ML&#xff09;等人工智能技术&#xff0c;辅助或自动化完成文本的创作、编辑与优化。这一技…

法律大语言模型(Legal LLM)技术架构

目录 摘要 1 法律AI大模型技术架构 1.1 核心架构分层 1.2 法律知识增强机制 2 关键技术突破与对比 2.1 法律专用组件创新 2.2 性能对比(合同审查场景) 3 开发部署实战指南 3.1 环境搭建流程 3.2 合同审查代码示例 4 行业应用与挑战 4.1 典型场景效能提升 4.2 关…

深入理解 C# Razor Pages:构建现代 Web 应用的利器

在现代 Web 开发中&#xff0c;选择合适的框架至关重要。ASP.NET Core 提供了多种开发模式&#xff0c;其中 Razor Pages 因其简单性、高效性和易用性&#xff0c;成为构建页面导向 Web 应用的首选方案。相比于传统的 MVC&#xff08;Model-View-Controller&#xff09;模式&am…

AgenticSeek 本地部署教程(Windows 系统)

#工作记录 Fosowl/agenticSeek&#xff1a;完全本地的 Manus AI。 部署排错参考资料在文末 或查找往期笔记。 AgenticSeek 本地部署教程&#xff08;Windows 系统&#xff09; 一、环境准备 1. 安装必备工具 Docker Desktop 下载地址&#xff1a;Docker Desktop 官网 安装后启…

后台管理系统八股

项⽬地址&#xff1a;https://github.com/Xiaodie-888/Frontend.git 前端 https://github.com/Xiaodie-888/backend.git 后端 技术栈&#xff1a;Vue3ViteTyprscriptPiniaElement-plusVue-RouterExpress.jsMySQL 核⼼⼯作与技术&#xff1a; 基础组件封装&#xff1a;基于 Ele…