操作系统(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.mzph.cn/news/683476.shtml

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

相关文章

Mermaid绘制UML图教程

Mermaid 是一种轻量级的图形描述语言,用于绘制流程图、时序图、甘特图等各种图表。它采用简单的文本语法,使得用户能够快速绘制各种复杂图表,而无需深入学习图形绘制工具。 一、安装Mermaid Mermaid 可以在浏览器中直接使用,也可…

剑指offer——数值的整数次方

目录 1. 题目描述2. 一般思路2.1 有问题的思路2.2 全面但不高效的思路2.3 面试小提示 3. 全面又高效的思路 1. 题目描述 题目:实现函数 double Power(double base,int exponent),求base 的exponent 次方。不得使用库函数,同时不需要考虑大数问题 2. 一般…

第13讲创建图文投票

创建图文投票实现 图文投票和文字投票基本一样&#xff0c;就是在投票选项里面&#xff0c;多了一个选项图片&#xff1b;、 <view class"option_item" v-for"(item,index) in options" :key"item.id"><view class"option_input&…

AIGC盛行,带你轻松调用开发

文章目录 前言一、&#x1f4d6;AIGC简介二、&#x1f4e3;开通体验开通模型获取API-KEY 三、&#x1f4dd;基于java实现调用1.设置API-KEY2.体验大语言模型多轮对话演示补充流式输出 3.体验通义千问VL使用官方提供照片本地文件多轮对话流式输出 总结 前言 本篇文章基于java和…

C++的进阶泛型编程学习(1):函数模板的基本概念和机制

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、模板1.1 模板的概念1.1.1 形象的解释&#xff1a;模板就是通用的模具&#xff0c;目的是提高通用性1.1.1 模板的特点&#xff1a;1.1.2 综述模板的作用 1.2…

揭秘Angular世界的奥秘:全面提升你的前端开发技能!

介绍&#xff1a;Angular是一个由Google维护的开源JavaScript框架&#xff0c;专为构建Web应用程序而设计&#xff0c;特别适合开发大型单页应用&#xff08;SPA&#xff09;。以下是对Angular的详细介绍&#xff1a; 技术栈&#xff1a;Angular使用HTML作为模板语言&#xff0…

作业2.15

1.head head 文件名 默认回显文件的前十行 head -n 文件名 回显文件的前n行 2.tail tail 文件名 默认回显文件的后10行 tail -n 文件名 回显文件的后n行 3. | 管道符 指令1 | 指令2 | 指令3 | 管道符左侧指令的输出用作管道符右侧指令的输入 4.file 查看文件的信息 file 文件…

怎么查看python的安装路径

要查看Python的安装路径&#xff0c;你可以使用以下几种方法&#xff1a; 方法1&#xff1a;使用命令行&#xff08;适用于所有操作系统&#xff09; 打开命令行界面&#xff08;在Windows上是命令提示符或PowerShell&#xff0c;在macOS和Linux上是终端&#xff09;。输入以…

耳机壳UV树脂制作私模定制耳塞需要注意什么问题?

制作私模定制耳塞需要注意以下问题&#xff1a; 耳模制作&#xff1a;获取准确的耳模是制作私模定制耳塞的关键步骤。需要使用合适的材料和方法&#xff0c;确保耳模的准确性和稳定性。材料选择&#xff1a;选择合适的UV树脂和其它相关材料&#xff0c;确保它们的质量和性能符…

2024.2.15每日一题

LeetCode 二叉树的层序遍历 II 107. 二叉树的层序遍历 II - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&am…

滑动窗口(三)

Leetcode30. 串联所有单词的子串 题目 Leetcode30. 串联所有单词的子串 解法(滑动窗口) 利用substr函数截取出来的s中截取出一段一段的单词&#xff0c;然后和words中比较是否相等。 hash1<string, int>用来存储words中单词出现的次数left right指针每次移动的步数为wo…

c++stoi函数解释

别问我为什么不继续发恶魔轮盘了&#xff0c;我的代码被我的堂弟给删了&#xff0c;全部变成小猪佩奇动画片了 std::stoi是C标准库中的一个函数&#xff0c;用于将字符串转换为整数类型。它的全名是std::string to int&#xff0c;所以stoi就是string to int的缩写。 它的函数…

【图论经典题目讲解】CF715B - Complete The Graph

C F 715 B − C o m p l e t e T h e G r a p h \mathrm{CF715B - Complete\ The\ Graph} CF715B−Complete The Graph D e s c r i p t i o n \mathrm{Description} Description 给定一张 n n n 个点&#xff0c; m m m 条边的无向图&#xff0c;点的编号为 0 ∼ n − 1 0\…

SpringCloud-Hystrix:服务熔断与服务降级

8. Hystrix&#xff1a;服务熔断 分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系&#xff0c;每个依赖关系在某些时候将不可避免失败&#xff01; 8.1 服务雪崩 多个微服务之间调用的时候&#xff0c;假设微服务A调用微服务B和微服务C&#xff0c;微服…

深度学习疆界:探索基本原理与算法,揭秘应用力量,展望未来发展与智能交互的新纪元

目录 什么是深度学习 深度学习的基本原理和算法 深度学习的应用实例 深度学习的挑战和未来发展方向 挑战 未来发展方向 深度学习与机器学习的关系 深度学习与人类的智能交互 什么是深度学习 深度学习是一种基于神经网络的机器学习方法&#xff0c;旨在模仿人类大脑分析…

2024.02.14作业

1. 请编程实现二维数组的杨辉三角 #include <stdio.h> #include <stdlib.h> #include <string.h>int main() {int n;scanf("%d", &n);int a[n][n];memset(a, 0, sizeof(a));a[0][0] 1;for (int i 1; i < n; i){for (int j 0; j < i …

云原生之容器编排-Docker Swarm

1. 前言 上一篇我们讲到Docker Compose可以定义和运行多容器应用程序&#xff0c;用一个YAML配置文件来声明式管理服务&#xff0c;在一台安装了Docker engine的Linux系统上可以很好的工作&#xff0c;但是现实中不可能只有一台Linux系统&#xff0c;一台Linux系统不可能有足够…

单片机学习笔记---LCD1602功能函数代码

目录 LCD1602.c 模拟写指令的时序 模拟写数据的时序 初始化 显示字符 显示字符串 显示数字 显示有符号的数字 显示16进制数字 显示二进制数 LCD1602.h main.c 上一篇讲了LCD1602的工作原理&#xff0c;这一节开始代码演示&#xff01; 新创建工程&#xff1a;LCD1…

黑马程序员——移动Web——day02

目录 空间转换 空间转换简介平移视距旋转左手法则rotate3d-了解立体呈现案例-3d导航缩放动画 动画实现步骤animation复合属性animation拆分写法案例-走马灯精灵动画多组动画综合案例-全名出游 背景云彩位置和动画文字动画 1.空间转换 空间转换简介 空间&#xff1a;是从坐标…

P1000 超级玛丽游戏(洛谷)

题目背景 本题是洛谷的试机题目&#xff0c;可以帮助了解洛谷的使用。 建议完成本题目后继续尝试 P1001、P1008。 另外强烈推荐新用户必读贴 题目描述 超级玛丽是一个非常经典的游戏。请你用字符画的形式输出超级玛丽中的一个场景。 ********************####....#.#..###…