操作系统(14)----文件系统的结构

目录

一.文件系统的层次结构

1.用户接口:

2.文件目录系统:

3.存取控制模块:

4.逻辑文件系统与文件信息缓冲区:

5.物理文件系统:

二.文件系统的全局结构

1.文件系统在外存中的结构

(1)物理格式化:

(2)逻辑格式化:

2.文件系统在内存中的结构

(1)用户区:

•文件描述符

(2)内核区:

•目录的缓存

•系统打开文件表

•进程(用户)打开文件表

三.虚拟文件系统

四.文件系统挂载


一.文件系统的层次结构

用户系统的层次结构如下图所示,下面一 一介绍:

1.用户接口:

文件系统需要向上层的用户提供一些简单易用的功能接口。这层就是用于处理用户发出的系统调用请求(Read、Write、Open、Close 等系统调用)。

2.文件目录系统:

用户是通过文件路径来访问文件的因此这一层需妄根据用户给出的文件路径找到相应的FCB或索引结点。所有和目录、目录项相关的管理工作都在本层完成,如:管理活跃的文件目录表、管理打开文件表等。

3.存取控制模块:

为了保证文件数据的安全,还需要验证用户是否有访问权限。这一层主要完成了文件保护相关功能。

4.逻辑文件系统与文件信息缓冲区:

用户指明想要访问文件记录号这一层需要将记录号转换为对应的逻辑地址。如果采用索引文件的逻辑结构,那么会为文件的各个记录建立一个索引表,那么为了查询这些记录对应的逻辑地址,就需要查询文件的索引表,在查询文件的索引表之前就需要将索引表放到文件信息缓冲区中。

5.物理文件系统:

这一层需要把上一层提供的文件逻辑地址转换为实际的物理地址。物理文件系统又分为辅助分配模块和设备管理模块:

辅助分配模块:负责文件存储空间的管理,即负责分配和回收存储空间。

设备管理模块:直接与硬件交互,负责和硬件直接相关的一些管理工作。如:分配设备、分配设备缓冲区、磁盘调度、启动设备、释放设备等。

用一个例子来辅助记忆文件系统的层次结构:

假设某用户请求删除文件“D:/工作目录/学生信息.xlsx"的最后100条记录:
1.用户需要通过操作系统提供的接口发出上述请求----用户接口

2.由于用户提供的是文件的存放路径,因此需要操作系统一层一层地查找目录,找到对应的目录项----文件目录系统
3.不同的用户对文件有不同的操作权限,因此为了保证安全,需要检查用户是否有访问权限----存取控制模块(存取控制验证层)
4.验证了用户的访问权限之后,需要把用户提供的“记录号”转变为对应的逻辑地址----逻辑文件系统与文件信息缓冲区
5.知道了目标记录对应的逻辑地址后,还需要转换成实际的物理地址---物理文件系统

6.要删除这条记录,必定要对磁盘设备发出请求----设备管理程序模块

7.删除这些记录后,会有一些盘块空闲,因此要将这些空闲盘块回收----辅助分配模块

二.文件系统的全局结构

1.文件系统在外存中的结构
(1)物理格式化:

物理格式化,即低级格式化----划分扇区,检测坏扇区,并用备用扇区替换坏扇区。坏扇区对操作系统是透明的,操作系统不知道坏扇区的存在。

(2)逻辑格式化:

逻辑格式化后,磁盘分区(分卷Volume),完成各分区的文件系统初始化注:逻辑格式化后,灰色部分就有实际数据了,白色部分还没有数据。

每个磁盘的大小,范围都由分区表记录,每个分区可以建立独立的文件系统,例如下图中,C盘中建立了UNIX文件系统:

引导块:负责开机时初始化操作系统。

超级块:负责快速找到若干个空闲磁盘块。

空闲空间管理(如:位示图):判断某一磁盘块是否空闲。

i结点区:i表示索引结点,每个文件都有一个与之对应的索引结点,每个索引结点都放在i结点区,这个区域就是超大的数组,数组的每一个元素都代表一个索引结点。

由于索引结点在这片区域连续存放,并且每一个索引结点大小都相同,所以我们可以通过索引结点的下标,找到特定的索引结点。

根目录:完成逻辑格式化后,根目录会被建立,以根目录出发,在其下建立新文件。

2.文件系统在内存中的结构
(1)用户区:
•文件描述符

通过文件描述符,用户可以对文件进行相应操作。

(2)内核区:
•目录的缓存

最近访问的目录的数据会被暂时缓存在内存中,例如,最近查找了下图中的目录M,那么就需要将目录M读入主存,接下来如果又想访问目录M,就不需要从外存读入,直接在目录缓存寻找,那么就能加快目录检索速度。

•系统打开文件表

整个系统只有一张,记录了整个系统存放的所有文件。

•进程(用户)打开文件表

每个进程都有一个打开文件表,这个打开文件表被保存在每个进程的PCB中。记录了每个进程当前打开了哪些文件。

我们来看一下,当用户想要对某文件进行相应操作,内存和外存如何配合工作:

例如我们现在想要打开目录M中的文件A:

① open(..../M/A,只读);根据路径一级一级读入目录

② 找到目标文件的FCB,复制到系统打开文件表,同时将其“打开计数”设为1

③ 在进程打开文件表中新建一个条目,记录打开方式,并不会记录A文件的FCB,只会通过索引指向系统打开文件表对应的条目,进而得到FCB

④ 接下来,返回文件描述符,通过这一文件描述符就可以对文件A进行打开操作

如果想要对文件A进行读操作系统调用,就只需要传入文件描述符fd,同时指明要读多少字节,读的范围:read(fd,xxx,xxx),接着找到对应的进程打开文件表,根据索引信息,找到系统打开文件表,通过系统打开文件表找到文件A对应的FCB,操作系统就可以确定文件A在外存中的存放位置。如下图所示:

三.虚拟文件系统

不同的外存对应的文件系统类型可能不同,在不同的文件系统中,开发者定义的同一操作的函数接口可能并不相同,对于普通文件系统而言,若用户想要从文件系统打开某一文件,那么需要根据文件系统不同,调用不同函数接口,操作困难。所以引入一个统一的函数接口很有必要,这就引入了虚拟文件系统。

虚拟文件系统:

① 向上层用户进程提供统一标准的系统调用接口,屏蔽底层具体文件系统的实现差异。用户进程在打开文件时,只需要根据虚拟文件系统指定的标准,调用函数接口即可。

那么虚拟文件系统如何调用不同文件系统中的文件呢?

② VFS要求下层的文件系统必须实现某些规定的函数功能,如:open/read/write。一个新的文件系统想要在某操作系统上被使用,就必须满足该操作系统VFS的要求。如果不满足VFS的要求,那么操作系统就不支持这一文件系统。

③每打开一个文件,VFS就在主存中新建一个vnode,用统一的数据结构表示文件,无论该文件存储在哪个文件系统。

不同文件系统的目录项格式是不一样的,即不同的文件系统,表示文件数据结构各不相同。打开文件后,其在内存中的表示就不同。

例如:VFS访问来自UFS文件系统的文件与FAT文件系统的文件时,读入的文件信息不同,这样虚拟文件系统在内存中就必须使用不同的数据结构来表示来自不同文件系统的文件。所以在虚拟文件系统中使用open打开文件系统调用后,虚拟文件系统就会给这个文件在主存中新建vnode(v结点),这个v结点中包含文件的各种信息,这样虚拟文件系统就可以用v结点数据结构表示任何一个文件系统的文件。

注:vnode只存在于主存中,而inode既会被调入主存,也会在外存中存储。

例如,如果将要访问的文件在UFS文件系统中,找到文件的目录项后,会把文件的inode从外存调入内存,inode信息会被复制到内存的vnode中。

vnode中有一数据结构信息----函数功能指针

函数功能指针用于指向不同文件系统中的函数功能列表,再执行具体函数, 这样就能实现从上至下一层层的调用。

打开文件后,创建vnode,并将文件信息复制到vnode中,vnode的功能指针指向具体文件系统的函数功能。

四.文件系统挂载

文件系统挂载(mounting),即文件系统安装/装载----如何将一个文件系统挂载到操作系统中?

文件系统挂载要做的事:
① 在VFS中注册新挂载的文件系统。内存中的挂载表(mount table) 包含每个文件系统的相关信息,包括文件系统类型、容量大小等。
②新挂载的文件系统,要向VFS提供一个函数地址列表


③将新文件系统加到挂载点(mount point),也就是将新文件系统挂载在某个父目录下。例如:

•在windows文件系统中,若插入一个移动硬盘,那么就会出现一个与C,D盘同级的目录,例如下图U盘(E:)

•而在linux文件系统中,则会在系统根目录下建立一个Volumes文件夹,在这目录下存放新挂载的文件系统,这就是挂载点。

只有确定了新文件系统挂载的位置,才可以访问新的文件系统。

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

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

相关文章

第六篇:MySQL图形化管理工具

经过前五篇的学习,对于数据库这门技术的理解,我们已经在心中建立了一个城堡大致的雏形,通过命令行窗口(cmd)快速上手了【SQL语法-DDL-数据定义语言】等相关命令 道阻且长,数据库技术这一宝藏中还有数不清的…

云安全的基本概念(基本目标与指导方针)

目录 一、云安全概念概述 1.1 概述 二、云安全的基本目标 2.1 安全策略开发模型 2.1.1 信息安全三元组 2.1.1.1 保密性(Confidentiality) 2.1.1.2 完整性(Integrity) 2.1.1.3 可用性(Availability) 2.1.2 信息安全三元组的局限性 2.2 其他信息安全属性 2.2.1 真实性 …

HarmonyOS鸿蒙学习基础篇 - 自定义组件(一)

前言 在ArkUI中,UI显示的内容均为组件,由框架直接提供的称为系统组件,由开发者定义的称为自定义组件。在进行 UI 界面开发时,通常不是简单的将系统组件进行组合使用,而是需要考虑代码可复用性、业务逻辑与UI分离&#…

[Angular 基础] - 自定义事件 自定义属性

[Angular 基础] - 自定义事件 & 自定义属性 之前的笔记: [Angular 基础] - Angular 渲染过程 & 组件的创建 [Angular 基础] - 数据绑定(databinding) [Angular 基础] - 指令(directives) 以上是能够实现渲染静态页面的基础 之前的内容主要学习了怎么通过…

项目访问量激增该如何应对

✨✨ 欢迎大家来到喔的嘛呀的博客✨✨ 🎈🎈希望这篇博客对大家能有帮助🎈🎈 目录 引言 一. 优化数据库 1.1 索引优化 1.2 查询优化 1.3 数据库设计优化 1.4 事务优化 1.5 硬件优化 1.6 数据库配置优化 二. 增加服务器资源…

收藏:不错的讲座《拆解成功领导者的三重底层思维逻辑》

在B 站看到个不错的讲座《拆解成功领导者的三重底层思维逻辑》,地址:第145期-拆解成功领导者的三重底层思维逻辑_哔哩哔哩_bilibili 演讲内容文章摘要在这里:《直播精华 | 拆解成功领导者的思维逻辑》(直播精华 | 拆解成功领导者的…

c语言操作符(上)

目录 ​编辑 原码、反码、补码 1、正数 2、负数 3、二进制计算1-1 移位操作符 1、<<左移操作符 2、>>右移操作符 位操作符&、|、^、~ 1、&按位与 2、|按位或 3、^按位异或 特点 4、~按位取反 原码、反码、补码 1、正数 原码 反码 补码相同…

专业140+总分420+浙江大学842信号系统与数字电路考研经验电子信息与通信,真题,大纲,参考书。

今年考研已经结束&#xff0c;初试专业课842信号系统与数字电路140&#xff0c;总分420&#xff0c;很幸运实现了自己的目标&#xff0c;被浙大录取&#xff0c;这在高考是想都不敢想的学校&#xff0c;在考研时实现了&#xff0c;所以大家也要有信心&#xff0c;通过自己努力实…

【c语言】字符串常见函数 下

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;c语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&a…

CVE-2023-41892 漏洞复现

CVE-2023-41892 开题&#xff0c;是一个RCE Thanks for installing Craft CMS! You’re looking at the index.twig template file located in your templates/ folder. Once you’re ready to start building out your site’s front end, you can replace this with someth…

【Web】CVE-2021-31805 s2-062漏洞复现学习

目录 Struts2介绍 漏洞概况 OGNL与Struts2 简单原理 漏洞复现 正向rce 反弹shell payload分析 Struts2介绍 Struts 2 是一个流行的用于构建 Java Web 应用程序的开源 Web 应用程序框架。它是 Apache 软件基金会下的一个顶级项目&#xff0c;是 Struts 框架的升级版本。…

LabVIEW智能温度监控系统

LabVIEW智能温度监控系统 介绍了一个基于LabVIEW的智能温度监控系统&#xff0c;实现对工业环境中温度的实时监控与调控。通过集成传感器技术和LabVIEW软件平台&#xff0c;系统能够自动检测环境温度&#xff0c;及时响应温度变化&#xff0c;并通过图形用户界面(GUI)为用户提…

CFS三层靶机

参考博客&#xff1a; CFS三层内网靶场渗透记录【详细指南】 - FreeBuf网络安全行业门户 CFS三层靶机搭建及其内网渗透【附靶场环境】 | TeamsSix CFS三层网络环境靶场实战 - PANDA墨森 - 博客园 (cnblogs.com) CFS三层靶机实战--内网横向渗透 - 知乎 (zhihu.com) CFS靶机…

C语言——枚举类型

&#x1f4dd;前言&#xff1a; 在之前的文章中我们已经讲解了自定义类型中的结构体类型和联合体类型&#xff0c;现在我们再充分学习一下C语言中的枚举类型&#xff1a; 1&#xff0c;什么是枚举类型 2&#xff0c;枚举类型的定义和变量的声明 3&#xff0c;对变量进行赋值 &a…

【C++】类和对象(四)

前言&#xff1a;在类和对象中&#xff0c;我们走过了十分漫长的道路&#xff0c;今天我们将进一步学习类和对象&#xff0c;类和对象这块荆棘地很长&#xff0c;各位一起加油呀。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:高质量&a…

docker (一)-简介

1.什么是docker Docker 是一个开源的应用容器引擎&#xff0c;由于docker影响巨大&#xff0c;今天也用"Docker" 指代容器化技术。 2.docker的优势 一键部署&#xff0c;开箱即用 容器使用基于image镜像的部署模式&#xff0c;image中包含了运行应用程序所需的一…

auto关键字详讲

目录 1.问题思考 2.auto关键字介绍 3. 早期auto的缺陷&#xff1a; 4.什么叫自动存储器&#xff1f; 5. c标准auto关键字 5.1auto的使用细节 5.2 auto什么时候不能推导变量的类型呢&#xff1f; 5.3基于范围的for循环 5.3.1范围for的用法 5.3.2 范围for的使用条件 6.…

软考27-上午题-查找

一、基本概念 1-1、查找表&#xff1a; 同一类型的数据元素构成的集合。 对查找表常用的操作&#xff1a; 从查找表中查询某个特定的元素&#xff1b;检索某个特定的元素的各种属性。 通常只进行这两种操作的查找表&#xff1a;静态查找表 1-1-2、静态查找表&#xff1a; 顺…

快速搭建PyTorch环境:Miniconda一步到位

快速搭建PyTorch环境&#xff1a;Miniconda一步到位 &#x1f335;文章目录&#x1f335; &#x1f333;一、为何选择Miniconda搭建PyTorch环境&#xff1f;&#x1f333;&#x1f333;二、Miniconda安装指南&#xff1a;轻松上手&#x1f333;&#x1f333;三、PyTorch与Minic…

新年开始更新自己!八大出生缺陷惠民项目!漫漫回程路——“早”读

时间不等人呢&#xff01; 引言代码第一篇 人民日报 【夜读】新的一年&#xff0c;从更新自己开始第二篇&#xff08;跳&#xff09;人民日报 来啦 新闻早班车要闻社会政策 结尾 引言 天还是那个天 但是今天是一个不一样的日子 是我爷爷的忌日 所以按习俗 我们早早就开始拜 然后…