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

news2024/11/24 14:31:51

目录

一.文件系统的层次结构

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.coloradmin.cn/o/1445519.html

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

相关文章

游泳可以戴的耳机有哪些,游泳耳机哪个牌子好性价比高

在游泳训练中,尤其是在进行长距离游泳、控制节奏和进行长时间游泳燃脂时,很容易感到单调乏味。为了帮助自己完成每一个来回,许多游泳运动员除了依赖能量棒和功能饮料外,还会选择通过音乐提高注意力和兴奋度。研究表明,…

《21天精通IPv4 to IPv6》第14天:第二周综合回顾——如何落地IPv6?

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

fatal error: rtiostream_utils.h: No such file or directory, rtiostream.h

fatal error: rtiostream_utils.h: No such file or directory 我的设置:

Linux中pipe管道操作

管道的读写操作: 读操作: ​​​有数据:read正常读,返回读出的字节数无数据:1 写段全部关闭:read解除阻塞,返回0,相当于文件读到了尾部 2 写段没有全部关闭&#xf…

【学网攻】 第(25)节 -- 帧中继(多对一)

系列文章目录 目录 系列文章目录 文章目录 前言 一、帧中继是什么? 二、实验 1.引入 实验目标理解帧中继在广域网中的原理及功能; 实验背景 技术原理 实验步骤 实验设备 实验拓扑图​编辑 实验配置 实验验证 文章目录 【学网攻】 第(1)节…

手把手教你开发Python桌面应用-PyQt6图书管理系统-图书信息修改实现

锋哥原创的PyQt6图书管理系统视频教程: PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

C++ //练习 5.19 编写一段程序,使用do while循环重复地执行下述任务:首先提示用户输入两个string对象,然后挑出较短的那个并输出它。

C Primer(第5版) 练习 5.19 练习 5.19 编写一段程序,使用do while循环重复地执行下述任务:首先提示用户输入两个string对象,然后挑出较短的那个并输出它。 环境:Linux Ubuntu(云服务器&#x…

CTFSHOW web 89-100

这边建议去我的gitbook或者github看观感更好(图片更完整) github:https://github.com/kakaandhanhan/cybersecurity_knowledge_book-gitbook.22kaka.fun gitbook:http://22kaka.fun 🏈 CTFSHOW PHP特性 (1)WEB 89 ①代码解释 <?php/* # -*- coding: utf-8 -*- # @…

第8讲个人中心页面搭建实现

个人中心页面搭建实现 <template><view class"user_center"><!-- 用户信息开始 --><view class"user_info_wrap"><!--获取头像--><button class"user_image"></button> <view class"user_n…

Java多线程:常见的锁策略

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、乐观锁 vs 悲观锁1、乐观锁2、悲观锁 二、重量级锁 vs 轻量级锁1、重量级锁2、轻量级锁3、理解用户态 vs 内核态 三、自旋锁…

LibreOffice Calc 取消首字母自动大写 (Capitalize first letter of every sentence)

LibreOffice Calc 取消首字母自动大写 [Capitalize first letter of every sentence] 1. Tools -> AutoCorrect Options2. AutoCorrect -> Options -> Capitalize first letter of every sentenceReferences 1. Tools -> AutoCorrect Options 2. AutoCorrect ->…

SpringCloud-高级篇(二十一)

前面解决了消息的可靠性、消息的延迟问题&#xff0c;下面研究一下消息的堆积的问题&#xff1a; &#xff08;1&#xff09;消息堆积问题 消息产生堆积&#xff0c;上限后&#xff0c;最早的消息成为死信&#xff0c;有消息被丢弃&#xff0c;这对安全性较高的业务中是不行的…

Uniapp真机调试:手机端访问电脑端的后端接口解决

Uniapp真机调试&#xff1a;手机端访问电脑端的后端接口解决 1、前置操作 HBuilderX -> 运行 -> 运行到手机或模拟器 -> 运行到Android App基座 少了什么根据提示点击下载即可 使用数据线连接手机和电脑 手机端&#xff1a;打开开发者模式 -> USB调试打开手机端&…

小白速成法:剖析一个Android项目以快速上手

这是一个基于Tasmota的设备、用MQTT协议来通信控制的安卓应用程序。支持ON/OFF命令插座和基本的RGB LED控制。 源码点击此处 只需要关注SmartController-main\app\src的代码 项目解压之后如图 只需要关注“app”文件夹里的东西即可&#xff0c;“gradle”是配置文件&#xf…

【前端web入门第五天】03 清除默认样式与外边距问题【附综合案例产品卡片与新闻列表】

文章目录: 1.清除默认样式 1.1清除内外边距1.2清除列表圆点(项目符号) 3.外边距问题-合并现象4.外边距问题–塌陷问题5.行内元素垂直内外边距6.圆角与盒子阴影 6.1圆角 6.2 盒子模型-阴影(拓展) 综合案例一 产品卡片 综合案例二 新闻列表 1.清除默认样式 在实际设计开发中,要…

Pandas深度解析GroupBy函数的妙用技巧【第75篇—GroupBy函数】

Pandas深度解析GroupBy函数的妙用技巧 数据处理和分析中&#xff0c;Pandas是一款非常强大的Python库&#xff0c;提供了丰富的数据结构和功能&#xff0c;使得数据分析变得更加简便高效。其中&#xff0c;GroupBy函数是Pandas中一个重要且常用的功能&#xff0c;通过它我们可…

第四节课[XTuner微调]作业

文章目录 前言作业基础作业-XTuner InternLM-Chat 个人小助手认知微调实践 前言 XTuner 做在第三节课LangChain作业之前&#xff0c;因为第三节课没想好找哪个领域&#xff0c;等第三节课作业做了一起部署。 作业 基础作业-XTuner InternLM-Chat 个人小助手认知微调实践 然…

Ps:直接从图层生成文件(图像资源)

通过Ps菜单&#xff1a;文件/导出/将图层导出到文件 Layers to Files命令&#xff0c;我们可以快速地将当前文档中的每个图层导出为同一类型、相同大小和选项的独立文件。 Photoshop 还提供了一个功能&#xff0c;可以基于文档中的图层或图层组的名称&#xff0c;自动生成指定大…

渗透专用虚拟机(公开版)

0x01 工具介绍 okfafu渗透虚拟机公开版。解压密码&#xff1a;Mrl64Miku&#xff0c;压缩包大小&#xff1a;15.5G&#xff0c;解压后大小&#xff1a;16.5G。安装的软件已分类并在桌面中体现&#xff0c;也可以使用everything进行查找。包含一些常用的渗透工具以及一些基本工…

opencv图像像素的读写操作

void QuickDemo::pixel_visit_demo(Mat & image) {int w image.cols;//宽度int h image.rows;//高度int dims image.channels();//通道数 图像为灰度dims等于一 图像为彩色时dims等于三 for (int row 0; row < h; row) {for (int col 0; col < w; col) {if…