【操作系统】文件系统的实现

文章目录

  • 文件系统的层次结构
  • 文件系统的实现
    • 目录实现
      • 线性列表
      • 哈希表
    • 文件的实现
      • 连续分配
      • 链接分配
      • 索引分配
    • 文件存储空间管理
      • 空闲表法与空闲链表法
      • 成组链接法
      • 位示图法

文件系统的层次结构

文件系统从上往下分为了五层,分别是用户调用接口、文件目录系统、存取控制模块、逻辑文件系统与文件信息缓冲区、物理文件系统。

在这里插入图片描述

文件系统的实现

目录实现

在操作系统中,目录实现主要有两种方式:

  • 线性列表
  • 哈希表

线性列表

线性列表是一种常见的数据结构,有链表和数组两种。我们将FCB(文件控制块)中的信息简化为文件名与文件索引节点指针后,文件的目录结构如下:

链表:
在这里插入图片描述

数组:
在这里插入图片描述

哈希表

哈希表依赖于哈希算法,是一种散列算法,文件名进行哈希计算后得到一个值,将这个值作为索引。相较于线性列表,哈希表的方式使得文件名与索引之间建立了一种映射关系,查询效率更高。

在这里插入图片描述

文件的实现

文件最终是保存在磁盘上,磁盘的存储单位通常以一个固定大小作为分区(比如4K)。这样整个磁盘就被分为了很多个大小一致的盘块。

在这里插入图片描述
在这个前提下,文件在磁盘进行存储时,就有三种分配方式:

  • 连续分配;
  • 链接分配;
  • 索引分配;

连续分配

连续分配的概念很简单,就是文件在分配到磁盘时,所分配的盘区是连续的。在保存文件存储地址时,只需要保存起始块号以及所占用的块号数量或者结束块号即可。

这种方式实现简单,访问速度块。但是不方便扩展(比如一个文件分了0、1、2后还需要继续追加文件内容,3号块已被占用,就导致无法扩展),同时还有有大量的磁盘碎片。

在这里插入图片描述

链接分配

链接分配,其实就是采用了链表这一数据结构来实现文件的存储。 因此我们需要额外的开销来保存每个盘块的下一个盘块信息。

如果下一个盘块的信息保存在盘块内,称之为隐式链接

在这里插入图片描述
但是对于脆弱的机械磁盘而言,一旦收到轻微损伤,导致某一盘块中的链接信息丢失,将会导致整个链表断开,从而丢失文件。针对这个问题,提出了显式链接

显示链接将链表的下一盘块信息提取出来进行专门的维护,即:FAT文件分配表。在FAT中,如果下一块号为**-1**,表示该号块是链表的最后一个块号-2表示当前块号是空闲状态

在这里插入图片描述
链接分配意味着操作系统需要将FAT表加载至内存,如果磁盘很大,盘块很多,其实还要占用较大的内存空间。为了优化这个问题,就提出了索引分配方式。

索引分配

索引分配,存放的是文件名对应的索引块号,而不是其实块号。根据索引块号找到对应的盘块,该存储索引数据的盘块保存着文件的索引表,由逻辑块号和物理块号组成。

在这里插入图片描述
以上图为例,文件的索引表是一个数组,数组的每个值是一个整数,占4B。由于每个盘块大小为4K,因此一个盘块最多能存放1024个索引。即一个索引块最多关联1024个盘块,也就是4M。

4M对于文件而言,实在太小了,毕竟很多文件动辄几百兆甚至上G。因此一个文件必须多个盘块作为索引表的存储载体。

结合文件的分配方式,可以采用链接分配方式,即多个索引表的盘块使用链表结构进行连接。

相较于链接方式,与操作系统内存分配方式类似,可以采用多级思想,即使用多级的索引结构。如果使用二级索引,则最多可以存储1024个一级索引1024个二级索引4K=4G文件。

在这里插入图片描述
当然,上图展示的二级索引基础上还可以优化,比如将二级索引表中的热点数据直接存放于一级索引表中,可以提升文件读取效率。这种方式称为混合索引

文件存储空间管理

文件分配方式针对的是已分配的文件以及对应的磁盘空间。而文件存储空间管理,针对空闲的磁盘空间的管理。

物理磁盘通常会在逻辑上分成多个区域(比如卷C、卷D),而每个分区中又会分为目录区、文件区。目录区所存储的是数据结构(如FCB);文件区存放的是文件的数据。

在这里插入图片描述
文件的存储空间管理有以下几种方式:

  • 空闲表法;
  • 空闲链表法;
  • 成组链接法;
  • 位示图法;

空闲表法与空闲链表法

空闲表法就是将磁盘中那些空闲的盘块信息记录在空闲盘块表中。如果使用数组结构就是空闲表法,如果使用链接结构就是空闲链表法。

在这里插入图片描述
对于空闲链表法,如果把每个空闲盘块链接起来,称为“空闲盘块链”;如果结合空闲表法,将空闲表法的空闲盘块表的每项数据通过链表保存,称为“空闲盘块链”。

在这里插入图片描述
但是这两种方式在面对大量盘块时,链表过长,这些数据结构要加载到内存中导致占用内存空间大且效率不高

成组链接法

成组链接发,使用链表以及栈的数据结构。每个空闲盘号栈存放了固定数量的空闲盘号数据。

  • 超级块:通常可能从目录区的第一个盘块开始,存储了第一个空闲盘号栈信息;
  • 每个空闲盘号栈的第一个元素是特殊的,它不仅存放了自己的盘号,也存储着下一个空闲盘号栈的信息(相当于指针);
  • 倒数第二个空闲盘号栈的栈底是特殊的,保存特殊值0或者-1,表示后面一个空闲盘号栈式最后一个;

系统启动时,会将第一组连续的空闲扇区(根据超级块)加载入内存中,在进行盘块分配时依次出栈,到栈底时根据栈底盘号元素中保存的数据链接到下一空闲盘号栈。

盘号回收的时候,在一个已有的空闲盘号栈装满后,新构造一个空闲盘号栈,然后将其添加到整个链的最前面。

整个流程的示意图如下:

在这里插入图片描述

位示图法

位示图法就是构建一个二维表,每个坐标表示一个盘块,用0表示对于盘块空闲,1表示对应盘块已分配。

其说明如下图:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/159874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SWT/Jface(1): 表格的创建和渲染

前言 使用JFace创建表格还是比较方便的, 如果仅仅是创建空表格的话, 以下2步即可完成: 创建TableViewer对象, 指定样式, 比如是否支持多行选择, 有无边框, 是否支持滚动条等创建TableColumn对象: 包括列展示名称, 宽度和样式等, 最终绑定到table对象 实例 创建表格 //注意…

设计模式-学习总结

学习总结 本文仅供自我学习使用 我是一个小白设计模式一.创建型模式1.单例模式(1).饿汉式(2).懒汉式,双检锁(3).静态内部类(4).枚举 2.原型模式3.工厂模式(1).简单工厂模式 4.抽象工厂模式5.建造者模式 二.结构型模式6.适配器模式7.组合模式8.装饰器模式9.外观模式1…

【AI】行业消息精选和分析(11月22日)

今日动态 👓 Video-LLaVA:视觉语言模型革新: - 图像和视频信息转换为文字格式。 - 多模态理解能力,适用于自动问答系统等。 📈 百度文心一言用户数达7000万: 🔊 RealtimeTTS:实时文本…

SpringBoot : ch06 整合 web (一)

前言 SpringBoot作为一款优秀的框架,不仅提供了快速开发的能力,同时也提供了丰富的文档和示例,让开发者更加容易上手。在本博客中,我们将介绍如何使用SpringBoot来整合Web应用程序的相关技术,并通过实例代码来演示如何…

《微信小程序案例大全》大学生期末大作业可以直接使用!!

前言 在大学生活中,期末大作业是锻炼和展示自己所学知识的重要时刻。微信小程序作为一种快速、便捷的应用开发方式,成为了大学生开发实践的热门选择。本文将为大家推荐一系列可以直接使用的微信小程序案例,包括仿真社交、图书管理、学习工具…

接口自动化测试实战经验分享,测试用例也能自动生成

作为测试,你可能会对以下场景感到似曾相识:开发改好的 BUG 反复横跳;版本兼容逻辑多,修复一个 BUG 触发了更多 BUG;上线时系统监控毫无异常,过段时间用户投诉某个页面无数据;改动祖传代码时如履…

CentOS 7 使用pugixml 库

安装 pugixml Git下载地址:https://github.com/zeux/pugixml 步骤1:首先,你需要下载pugixml 的源代码。你可以从Github或者源代码官方网站下载。并上传至/usr/local/source_code/ 步骤2:下载完成后,需要将源代码解压…

利用QRCode.js生成动态二维码页面

文章目录 QRCode.js简介HTML结构JavaScript生成动态二维码拓展功能1. 联系信息二维码2. Wi-Fi网络信息二维码 总结 🎉利用QRCode.js生成动态二维码页面 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:IT陈寒的博客🎈该系列文章专栏…

微信小程序开发者工具] ? Enable IDE Service (y/N) ESC[27DESC[27C

在HBuilder运行微信小程序开发者工具报错 如何解决 打开微信小程序开发者工具打开设置--->安全设置--->服务器端口选择打开就可以啦

《C++ Primer》第9章 顺序容器(三)

参考资料: 《C Primer》第5版《C Primer 习题集》第5版 9.5 额外的string操作(P320) 9.5.1 构造string的其他方法 const char *cp "hello, world!"; char arr[] { h,\0,i,\0 }; string s1(cp); // s1 "hello, world!…

C#中的var究竟是强类型还是弱类型?

前言 在C#中,var关键字是用来声明变量类型的,它是C# 3.0推出的新特征,它允许编译器根据初始化表达式推断变量类型,有点跟javascript类似,而javascript中的var是弱类型。它让C#变量声明更加简洁,但也导致了…

算法设计与分析复习--分支界限法

文章目录 上一篇分支界限法性质装载问题0-1背包问题单源最短路问题最大团问题下一篇 上一篇 算法设计与分析复习–回溯法(二) 分支界限法性质 分支界限法是按广度优先策略或最小耗费优先遍历问题的解空间树。 搜索解空间: 子集树排列树 …

APP自动化之Poco框架

今天给大家介绍一款自动化测试框架Poco,其脚本写法非常简洁、高效,其元素定位器效率更快,其本质基于python的第三方库,调试起来也会非常方便,能够很好的提升自动化测试效率,节省时间。 (一)背景…

如何实现数据通过表格批量导入数据库

文章目录 1. 准备工作2. 创建数据库表3. 编写导入脚本4. 优化和拓展4.1 批量插入的优势4.2 错误处理4.3 数据验证4.4 数据转换 5. 总结 🎉如何实现数据通过表格批量导入数据库 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:IT陈寒的博客&…

初学者必读书籍——两个月速成Python

想学Python的你是不是一直被它生涩难懂的劝退?作为一个自学入门的程序员,依靠这样几本书,两个月就学会了python。不卖关子,我学的就是”python编程三剑客“系列。那么接下来就让我给你介绍介绍吧。 1.《Python编程:从入…

OSG文字-osgText3D(5)

osgText3D 三维立体文字比二维平面文字显示效果更好,相对二维平面文字,它有非常好的立体显示效果。 在实际虚拟现实项目中,过多使用三维立体文字会降低染效率,加重渲染负担,相对平面二维文字,它占用的内存是…

掌握Katalon Studio 导入 swagger 接口文档,接口测试效率提升100%

katalon studio大家都已经不陌生了,是一款现在非常主流的自动化测试工具,包括了web、api、APP,甚至PC应用程序都可以使用它来完成自动化测试。 swagger是一款RESTFUL接口的文档在线自动生成软件,swagger是一个规范和完整的框架&a…

Python通过selenium调用IE11浏览器报错解决方法

前提 正常安装Python 工具,selenium 包可以正常导入。IE浏览器驱动 IEDriverServer.exe 已经正确放置到已经添加path目录的文件下。 报错现象: 解决方法 打开浏览器进入 internet 选项 切换到安全页签 ,去除“应用保护模式” 再次调用验证…

C语言——I /深入理解指针(一)

一、内存和地址 1byte(字节) 8bit(比特位) 1KB 1024byte 1MB 1024KB 1GB 1024MB 1TB 1024GB 1PB 1024TB一个比特位可以存放二进制的0/1的一位 ⽣活中我们把⻔牌号也叫地址,在计算机中我们把内存单元的编号也称为…

真菌基因组研究高分策略(一):比较基因组揭示真菌菌丝和多细胞的起源

真菌是陆地和水生生态系统的重要组分,在有机质循环和跨营养级养分流通等过程中发挥着重要作用。随着测序技术的发展,高通量测序揭示了真菌群落巨大的系统发育和功能多样性,高质量真菌基因组的组装已经成为研究菌丝和潜在基因的进化起源的有力…