OS—文件系统

news2024/11/25 13:18:53

目录

  • 一. 文件系统结构
    • I/O 控制层
    • 基本文件系统
    • 文件组织模块
    • 逻辑文件系统
  • 二. 文件系统布局
    • 文件系统在磁盘中的结构
      • 主引导记录(MasterBoot Record,MBR)
      • 引导块(boot block)
      • 超级块(super block)
      • 文件系统中空闲块的信息
    • 文件系统在内存中的结构
  • 三. 外存空间管理
    • 空闲表法
    • 空闲链表法
      • 空闲盘块链
      • 空闲盘区链
    • 位示图法
    • *成组链接法
  • 四. 虚拟文件系统(VFS)
    • 超级块对象
    • 索引节点对象
    • 目录项对象
    • 文件对象
  • 五. 文件系统挂载

一. 文件系统结构

文件系统(Filesystem)提供高效和便捷的磁盘访问,以便允许存储、定位、提取数据。
文件系统有两个不同的设计问题:第一个问题是,定义文件系统的用户接口,它涉及定义文件及其属性、所允许的文件操作、如何组织文件的目录结构。第二个问题是,创建算法和数据结构,以便映射逻辑文件系统到物理外存设备。
联想截图_20240730104522.png

I/O 控制层

  • 包括设备驱动程序和中断处理程序,在内存和磁盘系统之间传输信息。

设备驱动程序将输入的命令翻译成底层硬件的特定指令,硬件控制器利用这些指令使I/0 设备与系统交互。设备驱动程序告诉1/0控制器对设备的什么位置采取什么动作。

基本文件系统

  • 向对应的设备驱动程序发送通用命令,以读取和写入磁盘的物理块。

每个物理块由磁盘地址标识。该层也管理内存缓冲区,并保存各种文件系统、目录和数据块的缓存。

在进行磁盘块传输前,分配合适的缓冲区,并对缓冲区进行管理。

文件组织模块

  • 文件组织模块可以将文件的逻辑块地址转换为物理块地址,每个文件的逻辑块从0到N编号,它与数据的物理块不匹配,因此需要通过转换来定位。

文件组织模块还包括空闲空间管理器,以跟踪未分配的块,根据需求提供给文件组织模块。

逻辑文件系统

  • 用于管理文件系统中的元数据信息。
    • 元数据包括文件系统的所有结构,而不包括实际数据(或文件内容)。

逻辑文件系统管理目录结构,以便根据给定文件名为文件组织模块提供所需要的信息。它通过文件控制块来维护文件结构。逻辑文件系统还负责文件保护

二. 文件系统布局

文件系统在磁盘中的结构

  • 文件系统存放在磁盘上,多数磁盘划分为一个或多个分区,每个分区中有一个独立的文件系统
  • 文件系统可能包括如下信息:启动存储在那里的操作系统的方式、总的块数、空闲块的数量 和位置、目录结构以及各个具体文件等。图4.20所示为一个可能的文件系统布局。 简单描述如下:

主引导记录(MasterBoot Record,MBR)

主引导记录,位于磁盘的0号扇区,用来引导计算机,MBR 的后面是分区表,该表给出每个分区的起始和结束地址
表中的一个分区被标记为活动 分区。当计算机启动时,BIOS读入并执行MBR。MBR做的第一件事是确定活动分区, 读入它的第一块,即引导块

引导块(boot block)

MBR执行引导块中的程序后,该程序负责启动该分区中的操作系统。每个分区都是统一从一个引导块开始,即使它不含有一个可启动的操作系统,也不 排除以后会在该分区安装一个操作系统。Windows系统称之为分区引导扇区。 除了从引导块开始,磁盘分区的布局是随着文件系统的不同而变化的。文件系统经常包 含有如图4.20所列的一些项目。
联想截图_20240730104646.png

超级块(super block)

超级块(super block),包含文件系统的所有关键信息,在计算机启动时,或者在该文件 系统首次使用时,超级块会被读入内存。超级块中的典型信息包括分区的块的数量、块 的大小、空闲块的数量和指针、空闲的FCB数量和FCB指针等。

文件系统中空闲块的信息

文件系统中空闲块的信息,可以用位示图或指针链接的形式给出。后面也许跟的是一组 i节点,每个文件对应一个节点,i节点说明了文件的方方面面。接着可能是根目录,它 存放文件系统目录树的根部。最后,磁盘的其他部分存放了其他所有的目录和文件。

文件系统在内存中的结构

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

  • 内存中的安装表(mount table),包含每个已安装文件系统分区的有关信息
  • 内存中的目录结构的缓存,包含最近访问目录的信息
  • 整个系统的打开文件表,包含每个打开文件的FCB副本、打开计数及其他信息
  • 每个进程的打开文件表,包含进程打开文件的文件描述符(Windows称之为文件句柄) 和指向整个系统的打开文件表中对应表项的指针

三. 外存空间管理

一个存储设备可以按整体用于文件系统,也可以细分。例如,一个磁盘可以划分为2个分区, 每个分区都可以有单独的文件系统。包含文件系统的分区通常称为卷(volume)。可以是磁盘的一 部分,也可以是整个磁盘还可以是多个磁盘组成RAID集,如图4.21所示。
联想截图_20240731102711.png
在一个卷中,存放文件数据的空间(文件区)FCB的空间(目录区)是分离的。
由于存在很多种类的文件表示和存放格式,所以现代操作系统中一般都有很多不同的文件管理模块,通过它们可以访问不同格式的卷中的文件。卷在提供文件服务前,必须由对应的文件程序进行初始 化,划分好目录区和文件区,建立空闲空间管理表格及存放卷信息的超级块。
文件存储设备分成许多大小相同的物理块,并
以块为单位交换信息
,因此,文件存储设备的 管理实质上是对空闲块的组织和管理,它包括空闲块的组织、分配与回收等问题。

空闲表法

空闲表法属于连续分配方式,它与内存的动态分区分配类似,为每个文件分配一块连续的 存储空间。系统为外存上的所有空闲区建立一张空闲表,每个空闲区对应一个空闲表项,其中 包括表项序号、该空闲区的第一个空闲盘块号、该空闲区的空闲盘块数等信息。再将所有空闲 区按其起始盘块号递增的次序排列,如表4.2所示。
联想截图_20240731103156.png

  • 盘块的分配

空闲盘区的分配与内存的动态分配类似,也是采用首次适应算法、最佳适应算法等

例如, 在系统为某新创建的文件分配空闲盘块时,先顺序地检索空闲盘块表的各表项,直至找到第一个 其大小能满足要求的空闲区,再将该盘区分配给用户,同时修改空闲盘块表。

  • 盘块的回收

在对用户所释放的存储空间进行回收时,也采用类似于内存回收的方法,即要考虑回收区是 否与空闲盘块表中插入点的前区和后区相邻接,对相邻接者应予以合并。
空闲表法的优点是具有较高的分配速度,可减少访问磁盘的I/O频率。对于较小的文件(1~ 5个盘块),可以采用连续分配方式为文件分配几个相邻的盘块。

空闲链表法

空闲链表法是指将所有空闲盘区拉成一条空闲链,可分为以下两种。

空闲盘块链

  • 空闲盘块链是指将磁盘上的所有空闲空间以盘块为单位拉成一条链。每个盘块都有指向 下一个空闲盘块的指针。

联想截图_20240731110135.png

  • 优点:分配和回收一个盘块的过程非常简单。
  • 缺点:在为一个文件分配盘块时 可能要重复操作多次,效率较低;又因它是以盘块为单位的,空闲盘块链会很长。

空闲盘区链

  • 空闲盘区链是指将磁盘上的所有空闲盘区拉成一条链,每个盘区包含若干相邻的盘块。每个 盘区含有下一个空闲盘区的指针和本盘区的盘块数。联想截图_20240731110205.png
  • 优点:分配与回收的效率较高,且空闲盘区 链较短。
  • 缺点:分配与回收的过程比较复杂。

位示图法

联想截图_20240731110512.png联想截图_20240731110532.png

  • 优点:很容易在位示图中找到一个或一组相邻接的空闲盘块。由于位示图很小, 占用空间少,因此可将它保存在内存中,从而节省许多磁盘启动的开销。
  • 缺点:位示图大小会随着磁盘容量的增加而增大,因此常用于小型计算机。

*成组链接法

空闲表法和空闲链表法都不适用于大型文件系统,因为这会使空闲表或空闲链表太大。

UNIX系统中采用的是成组链接法,它结合了上述两种方法的思想而克服“表太长”的缺点。

  • 成组链接法的思想:将空闲盘块分成若干组,如100个盘块作为一组,每组的第一个盘块记录下一组的空闲盘块总数和空闲盘块号。

这样,由各组的第一个盘块可以链接成一条链。第一组的空闲盘块总数和空闲盘块号保存在内存的专用栈中,称为空闲盘块号栈。假设系统空闲区为第201~7999号盘块,则第一组的盘块号为201~300……次末组的盘块号为7801~7900,最末一组的盘块号为7901~7999。最末一组只有99个盘块,它们的块号记录在前一组的7900号盘块中,该块中存放的第一个盘块号是“0”,以作为空闲盘块链的结束标志,如图4.23所示。

联想截图_20240731131640.png
简而言之,每组(除了最后一组)的第一块作为索引块,然后将这些索引块链接起来

  • 盘块的分配

根据空闲盘块号栈的指针,将与之对应的盘块分配给用户,同时移动指针。若该指针指向的 是栈底的盘块号,则由于该盘块号对应的盘块中保存的是下一组空闲盘块号,因此要将该盘块的 内容读入栈中,作为新的空闲盘块号栈的内容,并将原栈底盘块号对应的盘块分配出去(其中有 用的数据已读入栈中)。最后,将栈中的空闲盘块数减1。

例如,在图4.23中,分配盘块时,先依次分配201~299号盘块,当需要分配300号盘块时, 首先将300号盘块的内容读入空闲盘块号栈,然后分配300号盘块。

  • 盘块的回收

将回收的盘块号存入空闲盘块号栈的顶部,同时移动指针,并将栈中的空闲盘块数加1。当 栈中的空闲盘块数已达100时,表示栈已满,将现有栈中的100个空闲盘块号存入新回收的盘块, 并将新回收的盘块号作为新栈底,再将栈中的空闲盘块数置为1。
表示空闲空间的位向量表或空闲盘块号栈,以及卷中的目录区、文件区划分信息都要存放在 磁盘中,一般放在卷头位置,在UNIX系统中称为超级块。在对卷中的文件进行操作前,超级块 要预先读入内存,并且经常保持主存超级块与磁盘卷中超级块的一致性。

四. 虚拟文件系统(VFS)

 虚拟文件系统(VFS)**屏蔽了不同文件系统的差异和操作细节,向上为用户提供了文件操作 的统一调用接口**

如图4.24所示。当用户程序访问文件时,通过VFS提供的统一调用函数(如 open()等)来操作不同文件系统的文件,而无须考虑具体的文件系统和实际的存储介质。
联想截图_20240731105638.png
为了实现虚拟文 件系统,系统抽象了四种对象类型。每个对象都包含数据和函数指针,这些函数指针指向操作这 些数据的文件系统的实现函数。这四种对象类型如下。

超级块对象

表示一个已安装(或称挂载)的特定文件系统。超级块对象对应于磁盘上特定扇区的文件系 统超级块,用于存储已安装文件系统的元信息。其操作方法包含一系列可在超级块对象上调用的 操作函数,主要有分配inode、销毁inode、读inode、写inode等。

索引节点对象

表示一个特定的文件。索引节点和文件是一对一的关系。只有当文件被访问时,才在内存中 创建索引节点对象,每个索引节点对象都会复制磁盘索引节点包含的一些数据。索引节点对象还 提供许多操作函数,如创建新索引节点、创建硬链接、创建新目录等。

目录项对象

表示一个特定的目录项。目录项对象是一个路径的组成部分,它包含指向关联索引节点的指 针,还包含指向父目录和指向子目录的指针。不同于前面两个对象,目录项对象在磁盘上没有对 应的数据结构,而是VFS在遍历路径的过程中,将它们逐个解析成目录项对象的。

文件对象

表示一个与进程相关的已打开文件。可以通过调用open()打开一个文件,通过调用close() 关闭一个文件。文件对象和物理文件的关系类似于进程和程序的关系。文件对象仅是进程视 角上代表已打开的文件,它反过来指向其索引节点。文件对象包含与该文件相关联的目录项 对象,包含该文件的文件系统、文件指针等,还包含在该文件对象上的一系列操作函数。 当进程发起一个面向文件的系统调用时,内核调用VFS中的一个函数,该函数调用目标文件 系统中的相应函数,将文件系统请求转换到面向设备的指令。以在用户空间调用write()为例,它 在VFS中通过sys_write()函数处理,sys_write()找到具体文件系统提供的写方法,将控制权交给 该文件系统,最后由该文件系统与物理介质交互并写入数据,如图4.25所示。
联想截图_20240731104615.png

严格来说,VFS并不是一种实际的文件系统,它只存在于内存中,不存在于任 何外存空间中。VFS在系统启动时建立,在系统关闭时消亡

五. 文件系统挂载

如文件在使用前要打开那样,文件系统在进程使用之前必须先安装,也称挂载(Mounting)。 将设备中的文件系统挂载到某个目录后,就可通过这个目录来访问设备上的文件。

注意,这里的 设备指的是逻辑上的设备,如一个磁盘上的不同分区都可视为不同的设备。

Windows系统维护一个扩展的两级目录结构,用驱动器字母表示设备和卷。卷具有常规树结 构的目录,与驱动器号相关联,还含有指向已安装文件系统的指针。特定文件的路径形式为driver- letter:\path\tolfile,访问时,操作系统找到相应文件系统的指针,并遍历该设备的目录结构,以查 找指定的文件。
新版的Windows允许文件系统安装在目录树下的任意位置,就像UNIX一样。在 启动时,Windows操作系统自动发现所有设备,并且安装所有找到的文件系统。
UNIX使用系统的根文件系统,它是在系统启动时直接安装的,也是内核映像所在的文件系 统。除了根文件系统,所有其他文件系统都要先挂载到根文件系统中的某个目录后才能访问。其 他文件系统要么在系统初始化时自动安装,要么由用户挂载在已安装文件系统的目录下。安装文 件系统的这个目录称为安装点,同一个设备可以有多个安装点同一个安装点同时只能挂载一个 设备。将设备挂载到安装点之后,通过该目录就可以读取该设备中的数据。 假定将存放在磁盘/dev/fd0上的ext2文件系统通过mount命令安装到/flp:
mount -t ext2 /dev/fd0 /flp
如需卸载该文件系统,可以使用umount命令。

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

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

相关文章

关于CDN

CDN 代表内容分发网络(Content Delivery Network)它是一种通过将内容复制到多个地理位置分散的服务器上,从而加速网络内容传输的技术。CDN 的主要目的是提高用户访问速度、减少延迟和提升网站的可靠性。 具体来说,CDN 通过以下方…

飞创直线模组桁架机械手优势及应用领域

随着工业自动化和智能制造的发展,直线模组桁架机械手极大地减轻了人类的体力劳动负担,在危险性、重复性高的作业环境中展现出了非凡的替代能力,引领着工业生产向自动化、智能化方向迈进。 一、飞创直线模组桁架机械手优势 飞创直线模组桁架…

爬虫问题---ChromeDriver的安装和使用

一、安装 1.查看chrome的版本 在浏览器里面输入 chrome://version/ 回车查看浏览器版本 Chrome的版本要和ChromeDriver的版本对应,否则会出现版本问题。 2.ChromeDriver的版本选择 114之前的版本:https://chromedriver.storage.googleapis.com/index.ht…

mmdetection:用于目标检测、实例分割、全景分割和半监督目标检测的工具包

MMDetection 是一个基于 PyTorch 的开源目标检测工具箱,是 OpenMMLab 项目的一部分。该工具箱采用模块化设计,使用户能够通过组合不同组件轻松构建自定义的目标检测框架。 MMDetection 支持多种检测任务,包括目标检测、实例分割、全景分割和…

【ROS 最简单教程 002/300】ROS 集成开发环境安装: Noetic

💗 有遇到安装问题可以留言呀 ~ 当时踩了挺多坑,能帮忙解决的我会尽力 ! 1. 安装操作系统环境 Linux ❄️ VM / VirtualBox Ubuntu20.04 如果已有 linux 环境 (如双系统等),可跳过步骤 1 ~ 👉 保姆级图文安装教程指路…

Python_Flask学习笔记

1.配置 查询字符串的形式传参 app.route(/book/list) def book_list():page request.args.get(page,default1,typeint)return f"您获取的是{page}的图书列表!"if __name__ __main__:app.run()3.HTML模版渲染 from flask import Flask,render_templa…

大厂的堡垒机到底是啥?为什么需要它?

什么是堡垒机 堡垒机,即在一个特定的网络环境下,为了保障网络和数据不受来自外部和内部用户的入侵和破坏,而运用各种技术手段监控和记录运维人员对网络内的服务器、网络设备、安全设备、数据库等设备的操作行为,以便集中报警、及…

使用 Elastic Observability 中的 OpenTelemetry 进行基础设施监控

作者:来自 Elastic ISHLEEN KAUR 将 OpenTelemetry 与 Elastic Observability 相结合,形成应用程序和基础设施监控解决方案。 在 Elastic,我们最近决定全面采用 OpenTelemetry 作为首要的数据收集框架。作为一名可观察性工程师,我…

YOLOv9最新最全代码复现(论文复现)

YOLOv9最新最全代码复现(论文复现) 本文所涉及所有资源均在传知代码平台可获取 文章目录 YOLOv9最新最全代码复现(论文复现)引言YOLOv9模型概述模型框架图环境搭建及训练推理环境配置数据集准备训练过程测试和评估实践应用 报错修…

【CVPR2024】Efficient LoFTR: 高效的 LoFTR:具有类似稀疏的速度的半密集局部特征匹配

Efficient LoFTR: 高效的 LoFTR:具有类似稀疏的速度的半密集局部特征匹配 Efficient LoFTR realtime_demo 0.摘要 \qquad 我们提出了一种新的方法来有效地产生跨图像的半密集匹配。以往的无探测器匹配器LoFTR在处理大视点变化和纹理差的场景下表现出了出色的匹配能力…

【零基础必看的前端教程】——JavaScript(八)函数

欢迎大家打开前端的新篇章——JavaScript,JavaScript与HTML、CSS合称为前端三大件,JavaScript是前端的重中之重,小洪将继续以零基础视角,带你循序渐进学习前端知识,一看就懂,小白也能转行做前端&#xff01…

创建个人公私钥对

Windows电脑 本地电脑打开命令输入框,如windows WINR–cmd打开cmd窗口输入ssh-keygen -t rsa -C “Remote dev” ,按三次回车,即可看到本地生成的公私钥进入用户目录,如windows为C:\Users\xxx(个人域账号).ssh,可看到…

在C++程序中新建并使用库

创建一个新的cpp文件后,定义一个函数 我们希望这个函数是可以被多个程序调用的,而不是直接输入在程序中进行编译。在C程序中,不是所有代码都会被编译成可执行文件,只有main函数所在的程序才可以生成可执行文件。而这个库是通过上一…

(第三期)书生大模型实战营——书生大模型全链路开源开放体系

任务及教程来自书生大模型实战营https://github.com/InternLM/Tutorial

负载均衡、软件平滑升级

安装nginx 1.26.1 平滑升级、负载均衡 安装依赖 gcc gcc-c pcre-devel openssl-devel 七层负载均衡配置: [rootf ~]# vim /usr/local/nginx/conf/nginx.conf 43 location / {44 # root html;45 # index index.html index…

在docker中安装MongoDB 5.0+

文章目录 1、查看物理机是否支持avx指令集:安装资料中的cpu-z_2.10-cn.exe,并打开2、查看虚拟机是否支持avx指令集:3、创建目录4、使用Docker来运行一个MongoDB数据库实例5、进入容器6、查看当前db版本7、查看当前db的链接机器地址8、帮助指令…

《昇思25天学习打卡营第24天》

接续上一天的学习任务,我们要继续进行下一步的操作 构造网络 当处理完数据后,就可以来进行网络的搭建了。按照DCGAN论文中的描述,所有模型权重均应从mean为0,sigma为0.02的正态分布中随机初始化。 接下来了解一下其他内容 生成…

程序一调用这个接口就会崩溃, 因为他的静态库添加是放在release文件下,而我用的debug模式

程序一调用这个接口就会崩溃 因为他的静态库添加是放在release文件下 而我用的debug模式 DESTDIR ../x64/ReleaseINCLUDEPATH ./../3rdparty/ZZDecode/include LIBS -lopengl32 \-lglu32 \-luser32 \./../3rdparty/ZZDecode/x64/release/ZZDecodeInterface.lib

华为仓颉语言测试申请

1. 申请网址 HarmonyOS NEXT仓颉语言开发者预览版 Beta招募- 华为开发者联盟 点击立即报名登录华为账号 勾选选项 , 点击同意 按要求填写信息即可 2. 申请通过后官方会通过邮件的方式发送相关下载途径 , 根据文档进行下载即可 package Cangmain(): Int64 {println("你…

Springboot使用Redis实现分布式锁

1、使用场景和实现方案: 使用场景:本地锁如Lock和Syncronized只能锁住本地进程,在分布式应用中,需要使用分布式锁来更好实现特定的业务。 实现方案:有多种,比如使用mysql、zookeeper、redis,各…