【操作系统·考研】文件系统
1.概述
文件系统(File System)提供高效和便捷的磁盘访问,以便允许存储、定位、提取数据。
严格来说,VFS并不是一种实际的FS,它只存在于内存中,不存在与任何外存空间中。
VFS在系统启动时建立,在系统关闭时消亡。
2.结构
2.1 逻辑文件系统
用于管理元数据信息,元数据包括文件系统的所有结构,但不包括实际数据(文件的内容),
该模块负责管理目录结构,并根据文件名向文件组织模块提供所需要的信息。
该模块通过FCB来维护文件结构,同时还负责保护文件。
2.2 文件组织模块
组织文件及其逻辑块和物理块,该模块可将逻辑地址转换成物理地址。该模块还包括一个空闲空间管理器以跟踪未分配的块,根据需求提供给文件组织模块。
2.3 基本文件系统
向对应的设备驱动程序发送通用命令,以读取和写入磁盘的物理块,每个物理块由磁盘地址标识。
该层还负责管理内存缓冲区,并保存各种文件系统、目录和数据块的缓存,还负责给调入的磁盘块分配合适的缓冲区,并对缓冲区进行管理。
2.4 I/O控制
包括设备驱动程序和中断处理程序,在内存和磁盘系统之间传输信息。设备驱动程序将输入的命令翻译为对底层硬件的特定指令,用于告知I/O控制器对设备的什么位置采取什么操作,而硬件控制器则利用这些指令使I/O设备与系统进行交互。
3.布局
FS存放在磁盘上,多数磁盘被划分为一个或多个分区,每个分区都有一个独立的FS。
FS将包含以下信息:启动存储在那里的OS的方式、总的块数、空闲的块数和位置、目录结构和各个具体的文件等。
3.1 FS在磁盘中的结构
主引导记录(Master Boot Record,MBR)
:位于磁盘的0号扇区,用来引导计算机,MBR后面就是分区表,用于指明每个分区的起始地址和结束地址。分区表中会有一个分区被标记为活动分区,计算机启动时,会先通过BIOS读入MBR,然后MBR将确定哪个分区是活动分区,然后读入该分区的第一个块(引导块)。引导块(Boot Block)
:MBR将启动引导块中的程序,该程序负责启动该分区中的OS。(规定只要是磁盘分区,不管分区中有没有OS,分区都要以引导块开始,后续的分区布局可以随OS不同而不同)超级块(Super Block)
:包含FS的所有关键信息,包括分区的块的总数、块的大小、空闲的块数和指针、空闲的FCB数及其指针等。计算机启动时或该FS被首次使用时,超级块将被读入内存。对卷中的文件进行操作前,都先将超级块读入到内存中,同时还要经常保持内存中的超级块与磁盘中的超级块的一致性。空闲空间管理
:可以使用位图或指针链接的形式给出FS中空闲块的信息。i节点
:每个文件对应一个i节点,i节点描述了一个文件的方方面面。根目录
:它存放FS的目录树的根部。
3.2 FS在内存中的结构
安装表(Mount Table)
:包含每个已安装FS的分区的有关信息。内存中的目录结构的缓存
:包含最近访问目录的信息。对安装分区的目录,它可以包含一个指向分区表的指针。整个OS的打开文件表
:包含每个打开文件的FCB副本&其他信息。每个进程的打开文件表
:包含一个指向整个OS的打开文件表中适当条目的指针&其他信息。
打开一个文件的过程:
首先会拿着文件名去检索OS的打开文件表,若发现该文件已被其他进程打开过,则直接在本进程的打开文件表创建一个条目,并让其指向OS的文件打开表中的此文件对应的条目;若没有没打开过,则需要调用逻辑文件系统,逻辑文件系统知道目录的结构(目录结构通常缓存在内存中,以加快目录操作),它根据文件名找到文件后,便将对应的FCB复制到OS的打开文件表中,然后进程这边也需要在打开文件表中创建一个新条目,并让它指向OS的打开文件表的该文件FCB对应的条目。
关闭一个文件的过程:
先删除单个进程的打开文件表的条目,然后该文件对应的打开数量–,若减至0,则删除其在OS的打开文件表中对应的条目,若元数据有修改,还需要将其写回到磁盘的目录结构中去。
4.外存的空闲空间管理
4.1 概述
包含FS的磁盘分区称为卷(Volume)
,卷可以是磁盘的一部分、磁盘的全部、多个磁盘构成的RAID集。
在一个卷中,将被划分为存放FCB的目录区
和存放文件数据的文件区
。
卷在提供文件服务前,必须由对应的额文件程序进行初始化,划分好目录区和文件区,建立好空闲空间管理表格以及存放卷信息的超级块。
文件存储设备分层许多大小相同的物理块,并以块为单位交换信息。
4.2 分类
4.2.1 空闲表法
空闲表法属于连续分配的方式,系统为外存上的所有空闲区建立一张空闲表,每个空闲区对应一个空闲表项,所有空闲区表项将按其开始磁盘号升序排序。
空闲盘区的分配与内存分配类似,同样采用首次适应算法和最佳适应算法。
系统在对用户所释放的存储空间进行回收时,也采取与内存回收类似的办法,即也要考虑会收取与空闲盘块表的插入点前后区是否相邻接,若相邻接则合并空闲分区。
4.2.2 空闲链表法
空闲盘块链
:将磁盘上的所有空闲空间以盘块拉成一条链。当用户请求分配存储空间时,则从链首依次取下适当数目的空闲盘块给用户;当用户请求释放存储空间时,则将回收的盘块依次插入空闲盘块链的链尾。
该方式的优点就是分配和回收一个盘块非常简单,缺点是作为一个文件分配盘块时可能需要操作多次,此外,以盘块为单位的空闲盘块链往往很长。
空闲盘区链
:将磁盘上的所有空闲盘区(每个盘区可能包含多个盘块)拉成一条链。每个盘区除了需要指明本盘区的大小外,还需要指明下一个空闲盘区的位置(指针)。分配盘区按首次适应算法,回收盘区与内存回收一致。
该方式的优点就是操作效率高,空闲盘区链往往较短,缺点是分配和回收过程较复杂。
空闲表法和空闲链表法不适用于大型文件系统,因为这会使空闲表或空闲链表太大。
4.2.3 位示图法
用二进制的一位来表示磁盘中的一个盘块的使用情况,磁盘上的每一块物理块都有一个二进制位与之相对应,二进制位0
表示磁盘块空闲,1
表示磁盘块已被分配。
4.2.4 成组链接法
将n个空闲块保存在第一个成组链块中,其最后一个空闲盘块(作为组链块)用于保存另一组空闲盘块号,如此往复,直至将全部空闲盘块链接起来。
空闲盘块的分配
根据第一个成组链接的指针,将其指向的盘块分配给用户,然后指针下移,若不够分配则继续将该指针当前指向的盘块分配给用户,然后指针继续下移,当移动到最后一条记录时,此时指针将漂移到该条目指向的另一个成组链块的第一个条目,然后继续分配,指针继续下移,以此类推,直至满足用户的对空闲块的需求。
盘块的回收
成组链块的指针上移,然后记入回收的盘块号,若当前的成组链块的条目数已达n个,则将该成组链块的块号记入新的成组链块中去,然后指针继续上移,存入回收的盘块号,然后重复此过程,直至回收完毕。
5.虚拟文件系统(VFS)
5.1 概述
虚拟文件系统为用户程序提供了FS的统一接口,屏蔽了不同FS的差异和操作细节。用户程序可通过VFS提供的统一调用函数来操作不同的FS的文件,而无需考虑具体的FS和实际的存储介质。
5.2 VFS的四种抽象对象
VFS采用面向对象的思想,它抽象出一个通用的FS模型,定义通用FS支持的接口,新的FS只需要支持并实现这些接口即可。
5.2.1 超级块(Super Block)对象
超级块对象表示一个对应磁盘上特定扇区上的FS。
超级块对象用于存储已安装FS的元信息,元信息主要包括FS的基本属性信息、基本块的大小、FS所挂载的设备、操作方法(函数)指针(如分配inode、销毁inode、读inode、写inode、文件同步等)等。
struct super_block {struct list_head s_list; //super block链表的指针unsigned long s_blocksize; //数据块大小,以字节单位struct file_system_type *s_type; //文件系统类型,ext2/ext3struct list_head s_files; //所有的已经打开文件的链表...
};
5.2.2 索引(Inode)结点对象
索引结点对象表示一个特定的文件,索引节点存放关于一个文件
的全部信息以及许多操作接口(如创建新的索引结点、创建硬链接、创建新目录),索引结点对文件是唯一的。
只有当文件被访问时,才会在内存中创建索引结点对象,每个索引节点对象都是磁盘索引结点的一份拷贝,当索引结点被修改时,其对应的磁盘索引结点也必须被同步更新。
struct inode {struct list_head i_list; //inode链表指针struct list_head i_dentry; //dentry链表指针,与此inode有关的dentry连在一起unsigned long i_ino; //inode号atomic_t i_count; //引用计数umode_t i_mode; //文件类型和访问权限loff_t i_size; //文件大小time_t i_atime; //文件最后一次访问时间time_t i_mtime; //文件最后一次修改时间time_t i_ctime; //inode最后一次修改时间unsigned int i_blkbits; //块大小,字节单位unsigned long i_blksize; //块大小,bit单位unsigned long i_blocks; //文件所占块数struct inode_operations *i_op; //索引节点操作struct file_operations *i_fop; //文件操作struct super_block *i_sb; //inode所属文件系统的超级块指针...
};
5.2.3 目录项(Dentry)对象
由于VFS需要经常执行切换目录这种操作,因此为了提高效率便引入目录项对象的概念。目录项对象是一个路径的组成部分,它要么是目录名,要么是文件名。
目录项对象不仅包括指向关联索引结点的指针,还包括指向父目录和子目录的指针。
不同于前面的两个对象,目录项对象在磁盘上没有对应的数据结构,而是在VFS在遍历路径的过程中,将它们逐个解析成目录项对象的。
struct dentry{atomic_t d_count; //引用计数struct inode * d_inode; //与该dentry关联的inodestruct dentry * d_parent; //父目录的dentrystruct dentry_operations *d_op; //目录项操作struct super_block * d_sb; //dentry所属的文件系统的超级块...};
5.2.4 文件(File)对象
文件对象表示进程打开的一个文件,可以调用open()
调用打开一个文件,调用close()
关闭一个文件。
文件对象与物理文件的关系 ≈ 进程与程序的关系。由于多个进程可以打开和操作同一个文件,所以一份物理文件可以在内存中存在多个对应的文件对象,但对应的索引节点和目录项是唯一的。
文件对象包括与该文件相关联的目录项、FS、文件指针以及作用在该文件对象上的一系列操作函数等。
struct file{struct list_head f_list; //所有的打开的文件形成的链表,链接到 super_block中的s_files链表struct dentry *f_dentry; //该文件的dentrystruct vfsmount *f_vfsmnt; //该文件在这个文件系统中的装载点struct file_operations *f_op; //文件操作,当进程打开文件时,这个文件的 inode中的i_fop会初始化这个字段atomic_t f_count; //引用计数,当关闭一个fd时,并不是真 正的关闭文件,仅仅是将f_count减一,当f_count等于零时才真正关闭文件unsigned int f_flags; //打开文件时候指定的标识mode_t f_mode; //文件的访问模式loff_t f_pos; //目前文件的偏移struct fown_struct f_owner; //记录一个进程IDunsigned int f_uid, f_gid; //用户ID和组ID...
};
VFS还有一个重要作用,就是提供系统性能。它通过将最常使用的目录项对象放在目录项高速缓存的磁盘缓存中,以加速从文件路径名到最后一个路径分量的索引节点的转换过程。
5.3 分区
一个磁盘可以划分为多个分区,每个分区都可以用于创建单独的FS,每个分区还可以包含不同的FS。
分区可以是原始的,即没有FS,当没有合适的FS时,可以使用原始磁盘。如UNIX的交换空间就可以使用原始的磁盘格式,而不使用FS。
5.4 安装(挂载)
FS在进程使用前必须先安装。
Windows系统
Windows系统维护着一个拓展的两级目录结构,用驱动器字母表示设备和卷。卷具有常规树结构的目录,与驱动器号相关联,还有一个指向已安装的FS的指针。
新版本的Windows允许在目录树下的任意位置安装FS。
在计算机启动时,WindowsOS将自动发现所有设备,并安装所有找到的FS。
UNIX系统
UNIX系统的根文件系统,由内核在引导阶段直接安装,其他FS则由各自的初始化脚本安装或由用户安装在已安装FS的目录下。每个FS都有自己的根目录,这个目录也称为安装点,安装就是将磁盘分区挂载到该安装点下,进入该目录就可以读取该分区的数据,已安装FS属于该安装点目录的一个子FS。
UNIX本身就是一个固定的目录树,只要安装就有,但是如果不给它分配存储空间,就不能对它操作,因此应该首先给根目录分配空间,然后才能去操作这个目录树。
安装的实现就是在安装点目录inode的内存副本上添加一个标记,表明该目录就是安装点,还有一个指向安装表条目的指针用于表明哪个设备安装在哪里,此外,这个条目还包括该设备的FS超级块的一个指针。
相关文章:

【操作系统·考研】文件系统
1.概述 文件系统(File System)提供高效和便捷的磁盘访问,以便允许存储、定位、提取数据。 严格来说,VFS并不是一种实际的FS,它只存在于内存中,不存在与任何外存空间中。 VFS在系统启动时建立,在系统关闭时消亡。 2.结…...

中国传媒网CEO徐晓艺荣膺第九届金鸥奖“2023年度最佳创新人物”殊荣
2023年是不平凡的一年,风云变幻。大国经济有韧性,离不开顶层设计、宏观政策的指挥,也离不开千百万求新求变的企业和企业家们的辛勤耕耘。在经历了三年疫情严峻考验的当下,中国号巨轮迎风搏浪心如磐石,无惧险阻屹立潮头,这不仅是中国红的底色,也是中国企业家的坚守和倔强。2023年…...

ElementUI Form:Switch 开关
ElementUI安装与使用指南 Switch 开关 点击下载learnelementuispringboot项目源码 效果图 el-switch.vue (Switch 开关)页面效果图 项目里el-switch.vue代码 <script> export default {name: el_switch,data() {return {value: true,value1: …...

通俗易懂理解注意力机制(Attention Mechanism)
重要说明:本文从网上资料整理而来,仅记录博主学习相关知识点的过程,侵删。 一、参考资料 大话注意力机制(Attention Mechanism) 注意力机制(Attention Mechanism) 深度学习中的注意力机制 注意力机制 二、注意力…...

git的分支的使用,创建分支,合并分支,删除分支,合并冲突,分支管理策略,bug分支,强制删除分支
GIT | 分支 文章目录 GIT | 分支创建分支合并分支删除分支合并冲突分支管理策略bug分支强制删除分支 创建分支 查看当前本地仓库中有哪些分支 git branchHEAD所指向的分支就是当前正在工作的分支 cat .git/HEAD创建一个分支 git branch dev创建好了,但是目前还是…...

【leetcode100-081到090】【动态规划】一维五题合集1
【爬楼梯】 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 思路: 【状态】 dp[i];//爬i级台阶有几种方法 【初始】 dp[0] 1;//爬0级1种(不爬)dp[1] 1;/…...

数据结构-顺序表详解专题
目录 顺序表 1.简单了解顺序表 2.顺序表的分类 2.1静态顺序表 2.2动态顺序表 2.3typedef命名作用 3.动态顺序表的实现 SeqList.h SeqList.c test.c 顺序表 1.简单了解顺序表 顺序表是线性表的一种,线性表是在逻辑上是线性结构,在物理逻辑上并…...

对商业知识和思维的一些小体会
用途:个人学习笔录,欢迎指正 前言: 小生拙见,我认为商业知识和商业思维的理解对于每一个行业都有潜在的帮助,因为每个人的生活都离不开商业,生意、工作都是交换,用自身提供的价值换取薪酬。因此…...

【笔记】计算文件夹的大小
目标:遍历文件夹,计算文件夹下包含文件和文件夹的大小。将这些结果存入python自带的数据库。 用大模型帮我设计并实现。 Step1 创建一个测试用的目录结构 创建目录结构如下所示: TestDirectory/ │ ├── EmptyFolder/ │ ├── SmallF…...

机器学习_常见算法比较模型效果(LR、KNN、SVM、NB、DT、RF、XGB、LGB、CAT)
文章目录 KNNSVM朴素贝叶斯决策树随机森林 KNN “近朱者赤,近墨者黑”可以说是 KNN 的工作原理。 整个计算过程分为三步: 计算待分类物体与其他物体之间的距离;统计距离最近的 K 个邻居;对于 K 个最近的邻居,它们属于…...

外包干了8个月,技术退步明显...
先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…...

opencv#41 轮廓检测
轮廓概念介绍 通常我们使用二值化的图像进行轮廓检测,对轮廓以外到内进行数字命名,如下图,最外面的轮廓命名为0,向内部进行扩展,遇到黑色白色相交区域,就是一个新的轮廓,然后依次对轮廓进行编号…...

Websocket基本用法
1.Websocket介绍 WebSocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。 应用场景: 视频弹幕网页聊天体育实况更新股票基金…...

node.js与express.js创建项目以及连接数据库
搭建项目 一、技术准备 node版本:16.16.0 二、安装node成功后,安装express,命令如下: npm install -g express 或者: npm install --locationglobal express 再安装express的命令工具: npm install --location…...

【Tomcat与网络8】从源码看Tomcat的层次结构
在前面我们介绍了如何通过源码来启动Tomcat,本文我们就来看一下Tomcat是如何一步步启动的,以及在启动过程中,不同的组件是如何加载的。 一般,我们可以通过 Tomcat 的 /bin 目录下的脚本 startup.sh 来启动 Tomcat,如果…...

Java Agent Premain Agentmain
概念 premain是在jvm启动的时候类加载到虚拟机之前执行的 agentmain是可以在jvm启动后类已经加载到jvm中了,才去转换类。 这种方式会转换会有一些限制,比如不能增加或移除字段。 具体的做法,两者的实际做法是差不多的: premain 定义个静…...

Python实现设计模式-策略模式
策略模式是一种行为型设计模式,它定义了一系列算法或策略,并将它们封装成独立的类,使得它们可以相互替换,而不影响客户端的使用。 在策略模式中,算法或策略被封装在单独的策略类中,这些策略类实现了相同的…...

详解SpringCloud微服务技术栈:深入ElasticSearch(4)——ES集群
👨🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:详解SpringCloud微服务技术栈:深入ElasticSearch(3)——数据同步(酒店管理项目&a…...

AlmaLinux上安装Docker
AlmaLinux上安装Docker 文章目录 AlmaLinux上安装Docker一、前言二、具体步骤1、Docker 下载更新系统包索引:添加Docker仓库:安装Docker引擎: 2、Docker服务启动启动Docker服务:设置Docker开机自启: 3、Docker 安装验证…...

熟悉MATLAB 环境
一、问题描述 熟悉MATLAB 环境。 二、实验目的 了解Matlab 的主要功能,熟悉Matlab 命令窗口及文件管理,Matlab 帮助系统。掌握命令行的输入及编辑,用户目录及搜索路径的配置。了解Matlab 数据的特点,熟悉Matlab 变量的命名规则&a…...

【数据库数据恢复】Oracle数据库ASM磁盘组数据恢复案例
oracle数据库故障&分析: oracle数据库ASM磁盘组掉线,ASM实例不能挂载。数据库管理员尝试修复数据库,但是没有成功。 oracle数据库数据恢复过程: 1、将oracle数据库所涉及磁盘以只读方式备份。后续的数据分析和数据恢复操作都…...

STM32CubeMX教程31 USB_DEVICE - HID外设_模拟键盘或鼠标
目录 1、准备材料 2、实验目标 3、模拟鼠标实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.0、工程基本配置 3.1.1、时钟树配置 3.1.2、外设参数配置 3.1.3、外设中断配置 3.2、生成代码 3.2.0、配置Project Manager页面 3.2.1、设初始化调用流程 3.2.2、外设中…...

知道Wi-Fi名称和密码之后自动连接
这里写自定义目录标题 有Wi-Fi名称和密码自动连接Wi-Fi主Activity服务类 WIFIStateReceiver工具类 WIFIConnectionManager 有Wi-Fi名称和密码自动连接Wi-Fi 主Activity public class MainActivity extends AppCompatActivity implements View.OnClickListener{private static…...

本地搭建Plex私人影音网站并结合内网穿透实现公网远程访问
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

【算法】拦截导弹(线性DP)
题目 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。 但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。 某天,雷达捕捉到敌国的导弹来袭。 由于该系…...

记 doris 加载压缩文件(lzo、snappy)pr
做了一个case,是doris支持加载lzo压缩文件。[improvement](load) Enable lzo & Remove dependency on Markus F.X.J. Oberhumers lzo library by HowardQin Pull Request #30573 apache/doris (github.com) 其实doris里已经支持了 lzo,这个case源…...

【Leetcode】2670. 找出不同元素数目差数组
文章目录 题目思路代码结果 题目 题目链接 给你一个下标从 0 开始的数组 nums ,数组长度为 n 。 nums 的 不同元素数目差 数组可以用一个长度为 n 的数组 diff 表示,其中 diff[i] 等于前缀 nums[0, …, i] 中不同元素的数目 减去 后缀 nums[i 1, …, …...

༺༽༾ཊ—Unity之-01-工厂方法模式—ཏ༿༼༻
首先创建一个项目, 在这个初始界面我们需要做一些准备工作, 建基础通用文件夹, 创建一个Plane 重置后 缩放100倍 加一个颜色, 任务:使用工厂方法模式 创建 飞船模型, 首先资源商店下载飞船模型,…...

QT仪表盘小工具
头文件: /**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE…...

【2024】大三寒假再回首:缺乏自我意识是毒药,反思和回顾是解药
2024年初,学习状态回顾 开稿时间:2024-1-23 归家百里去,飘雪送客迟。 搁笔日又久,一顾迷惘时。 我们饱含着过去的习惯,缺乏自我意识是毒药,反思和回顾是解药。 文章目录 2024年初,学习状态回顾一…...