【操作系统·考研】文件系统

1.概述

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


2.结构

image.png

2.1 逻辑文件系统

用于管理元数据信息,元数据包括文件系统的所有结构,但不包括实际数据(文件的内容),
该模块负责管理目录结构,并根据文件名向文件组织模块提供所需要的信息。
该模块通过FCB来维护文件结构,同时还负责保护文件。

2.2 文件组织模块

组织文件及其逻辑块和物理块,该模块可将逻辑地址转换成物理地址。该模块还包括一个空闲空间管理器以跟踪未分配的块,根据需求提供给文件组织模块。

2.3 基本文件系统

向对应的设备驱动程序发送通用命令,以读取和写入磁盘的物理块,每个物理块由磁盘地址标识。
该层还负责管理内存缓冲区,并保存各种文件系统、目录和数据块的缓存,还负责给调入的磁盘块分配合适的缓冲区,并对缓冲区进行管理。

2.4 I/O控制

包括设备驱动程序和中断处理程序,在内存和磁盘系统之间传输信息。设备驱动程序将输入的命令翻译为对底层硬件的特定指令,用于告知I/O控制器对设备的什么位置采取什么操作,而硬件控制器则利用这些指令使I/O设备与系统进行交互。


3.布局

FS存放在磁盘上,多数磁盘被划分为一个或多个分区,每个分区都有一个独立的FS。
FS将包含以下信息:启动存储在那里的OS的方式、总的块数、空闲的块数和位置、目录结构和各个具体的文件等。

3.1 FS在磁盘中的结构

image.png

  • 主引导记录(Master Boot Record,MBR):位于磁盘的0号扇区,用来引导计算机,MBR后面就是分区表,用于指明每个分区的起始地址和结束地址。分区表中会有一个分区被标记为活动分区,计算机启动时,会先通过BIOS读入MBR,然后MBR将确定哪个分区是活动分区,然后读入该分区的第一个块(引导块)。
  • 引导块(Boot Block):MBR将启动引导块中的程序,该程序负责启动该分区中的OS。(规定只要是磁盘分区,不管分区中有没有OS,分区都要以引导块开始,后续的分区布局可以随OS不同而不同)
  • 超级块(Super Block):包含FS的所有关键信息,包括分区的块的总数、块的大小、空闲的块数和指针、空闲的FCB数及其指针等。计算机启动时或该FS被首次使用时,超级块将被读入内存。对卷中的文件进行操作前,都先将超级块读入到内存中,同时还要经常保持内存中的超级块与磁盘中的超级块的一致性。
  • 空闲空间管理:可以使用位图或指针链接的形式给出FS中空闲块的信息。
  • i节点:每个文件对应一个i节点,i节点描述了一个文件的方方面面。image.png
  • 根目录:它存放FS的目录树的根部。

3.2 FS在内存中的结构

  • 安装表(Mount Table):包含每个已安装FS的分区的有关信息。
  • 内存中的目录结构的缓存:包含最近访问目录的信息。对安装分区的目录,它可以包含一个指向分区表的指针。
  • 整个OS的打开文件表:包含每个打开文件的FCB副本&其他信息。
  • 每个进程的打开文件表:包含一个指向整个OS的打开文件表中适当条目的指针&其他信息。

打开一个文件的过程:
首先会拿着文件名去检索OS的打开文件表,若发现该文件已被其他进程打开过,则直接在本进程的打开文件表创建一个条目,并让其指向OS的文件打开表中的此文件对应的条目;若没有没打开过,则需要调用逻辑文件系统,逻辑文件系统知道目录的结构(目录结构通常缓存在内存中,以加快目录操作),它根据文件名找到文件后,便将对应的FCB复制到OS的打开文件表中,然后进程这边也需要在打开文件表中创建一个新条目,并让它指向OS的打开文件表的该文件FCB对应的条目。
关闭一个文件的过程:
先删除单个进程的打开文件表的条目,然后该文件对应的打开数量–,若减至0,则删除其在OS的打开文件表中对应的条目,若元数据有修改,还需要将其写回到磁盘的目录结构中去。

4.外存的空闲空间管理

4.1 概述

包含FS的磁盘分区称为卷(Volume),卷可以是磁盘的一部分、磁盘的全部、多个磁盘构成的RAID集。
image.png
在一个卷中,将被划分为存放FCB的目录区和存放文件数据的文件区
卷在提供文件服务前,必须由对应的额文件程序进行初始化,划分好目录区和文件区,建立好空闲空间管理表格以及存放卷信息的超级块。
文件存储设备分层许多大小相同的物理块,并以块为单位交换信息。

4.2 分类

4.2.1 空闲表法

空闲表法属于连续分配的方式,系统为外存上的所有空闲区建立一张空闲表,每个空闲区对应一个空闲表项,所有空闲区表项将按其开始磁盘号升序排序。

空闲盘区的分配与内存分配类似,同样采用首次适应算法和最佳适应算法。

系统在对用户所释放的存储空间进行回收时,也采取与内存回收类似的办法,即也要考虑会收取与空闲盘块表的插入点前后区是否相邻接,若相邻接则合并空闲分区。

4.2.2 空闲链表法

  1. 空闲盘块链:将磁盘上的所有空闲空间以盘块拉成一条链。当用户请求分配存储空间时,则从链首依次取下适当数目的空闲盘块给用户;当用户请求释放存储空间时,则将回收的盘块依次插入空闲盘块链的链尾。

该方式的优点就是分配和回收一个盘块非常简单,缺点是作为一个文件分配盘块时可能需要操作多次,此外,以盘块为单位的空闲盘块链往往很长。

  1. 空闲盘区链:将磁盘上的所有空闲盘区(每个盘区可能包含多个盘块)拉成一条链。每个盘区除了需要指明本盘区的大小外,还需要指明下一个空闲盘区的位置(指针)。分配盘区按首次适应算法,回收盘区与内存回收一致。

该方式的优点就是操作效率高,空闲盘区链往往较短,缺点是分配和回收过程较复杂。

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

4.2.3 位示图法

用二进制的一位来表示磁盘中的一个盘块的使用情况,磁盘上的每一块物理块都有一个二进制位与之相对应,二进制位0表示磁盘块空闲,1表示磁盘块已被分配。

4.2.4 成组链接法


image.png
将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的指针。
image.png
image.png
新版本的Windows允许在目录树下的任意位置安装FS。
在计算机启动时,WindowsOS将自动发现所有设备,并安装所有找到的FS。

UNIX系统

UNIX系统的根文件系统,由内核在引导阶段直接安装,其他FS则由各自的初始化脚本安装或由用户安装在已安装FS的目录下。每个FS都有自己的根目录,这个目录也称为安装点,安装就是将磁盘分区挂载到该安装点下,进入该目录就可以读取该分区的数据,已安装FS属于该安装点目录的一个子FS。
UNIX本身就是一个固定的目录树,只要安装就有,但是如果不给它分配存储空间,就不能对它操作,因此应该首先给根目录分配空间,然后才能去操作这个目录树。
image.png

安装的实现就是在安装点目录inode的内存副本上添加一个标记,表明该目录就是安装点,还有一个指向安装表条目的指针用于表明哪个设备安装在哪里,此外,这个条目还包括该设备的FS超级块的一个指针。

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

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

相关文章

js新增的操作元素类名的方法

Element.classList是一个只读属性,返回一个元素 class 属性的动态 DOMTokenList 集合。这可以用于操作 class 集合。 尽管 classList 属性自身是只读的,但是你可以使用 add()、remove()、replace() 和 toggle() 方法修改其关联的 DOMTokenList。 兼容性…

如何从 Android SD 卡恢复已删除的文件

作为 Android 用户,您可能会使用 SD 卡来扩展手机的存储容量,并存储照片、视频和其他类型的文件。但意外发生时,您可能会错误地删除其中一些文件,或者由于其他原因而丢失它们。在大多数情况下,您可以通过主动并遵循正确…

一款轻量级、高性能、功能强大的内网穿透代理服务器

简介 nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还支持内网htt…

reactnative 调用原生ui组件

reactnative 调用原生ui组件 ![组件对应关系](https://img-blog.csdnimg.cn/direct/c4351ad7bd38411e9c13087f1059a4b0.png)1.该样例已textView,介绍。 新建MyTextViewManager 文件,继承SimpleViewManager。import android.graphics.Color; import andr…

2024年美国大学生数学建模竞赛F题思路分析

题目 非法野生动物贸易对环境造成了负面影响,并威胁全球生物多样性。据估计,其涉及高达265亿美元的年交易额,被认为是全球所有非法交易中的第四大。[1] 你需要开发一个基于数据驱动的5年项目,旨在显著减少非法野生动物贸易。你的…

2024美赛数学建模F题思路分析 - 减少非法野生动物贸易

1 赛题 问题F:减少非法野生动物贸易 非法的野生动物贸易会对我们的环境产生负面影响,并威胁到全球的生物多样性。据估计,它每年涉及高达265亿美元,被认为是全球第四大非法交易。[1]你将开发一个由数据驱动的5年项目,…

2024年美赛F题Problem F Reducing Illegal Wildlife Trade减少非法野生动物贸易的完整思路代码分享

非法的野生动物贸易会对我们的环境产生负面影响,并威胁到全球的生物多样性。据估计,它每年涉及高达265亿美元,被认为是全球第四大非法交易。[1]你将开发一个由数据驱动的5年项目,旨在显著减少非法野生动物贸易。你的目标是说服一个…

Leetcode2772. 使数组中的所有元素都等于零

Every day a Leetcode 题目来源:2772. 使数组中的所有元素都等于零 解法1:差分数组 令差分数组 diff[i] nums[i] - nums[i - 1],特别地,diff[0] nums[0],diff[n] -nums[n-1]。 可以发现,差分数组具…

用Audio2Face导出Unity面部动画

开始之前说句话,新年前最后一篇文章了 一定别轻易保存任何内容,尤其是程序员不要轻易Ctrl S 在A2F去往Unity的路上,还要经历特殊Blender,自己电脑中已下载好的可能不是很好使。 如果想查看UE相关的可以跳转到下边这两篇链接 1. …

Linux小知识分享-压缩包解压之后属主和属组不是当前用户问题

今天给大家分享一个Linux小知识 背景 假设当前Linux下用户是root,我们从网络上或者其他环境下载了个压缩包进行本地解压。 结果发现解压之后的文件或者文件夹的 属主和属主 都不是当前用户root # 检查当前用户 [roottest-xxxx-01-vm /tmp/colinspace ]# id uid0(…

IDEA 配置和缓存目录 设置

IDEA系列产品&#xff0c;一般会在用户目录创建 配置 和 缓存 目录&#xff1a; %APPDATA%\JetBrains%LOCALAPPDATA%\JetBrains 一般会展示为&#xff1a; C:\Users\<username>\AppData\Roaming\JetBrainsC:\Users\<username>\AppData\Local\JetBrains 一般占用…

MtfLive直播导航PHP源码,附带系统搭建教程

将自动采集斗鱼、虎牙、触手、YY、章鱼、电视直播按分类/关键词聚合&#xff0c;用户选择分类&#xff0c;可以观看到全网该关键词下正在直播的内容。 特点 PC站和H5移动站自适应 自动缓存&#xff0c;避免频繁抓取数据 自定义抓取采集规则&#xff0c;同时支持HTML和JSON …

Character Auras 3

该包包含12种惊人的光环效果! 列表: 秋天的氛围 血光 五彩纸屑的光环 疾风 火光光环 森林氛围 治疗光环 冰系光环 爱的光环 毒气环 星光气场 所有预制件都已准备好用于游戏,只需将它们拖放到游戏中即可! 下载: ​​Unity资源商店链接 资源下载链接 效果图:

OJ刷题:《剑指offer》之左旋字符串!

目录 1.题目描述 2.方法一&#xff08;元素一一挪&#xff09; 2.1算法解析 2.2代码实现 3.方法二&#xff08;三次逆置&#xff09; 3.1算法解析 3.2代码实现 4.方法三&#xff08;库方法&#xff09; 4.1算法解析 4.2代码实现 5.完结散花 创作不易&#xff0c;宝子…

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏8(附项目源码)

本节最终效果演示 文章目录 本节最终效果演示系列目录前言配置可使用物品功能下载一些水果模型代码实现使用物品 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇中&#xff0c…

Java面对对象

Java面向对象 面对对象概述&#xff0c;类与对象&#xff0c;继承&#xff0c;重写与重载&#xff0c;多态&#xff0c;抽象&#xff0c;封装&#xff0c;包&#xff0c;泛型&#xff0c;异常 面对对象概述 什么是面向对象&#xff08;OOP&#xff09; 面向对象(Object Ori…

【python3.8 pre-commit报错】记录pre-commit install报错

一、问题 在执行pre-commit install --allow-missing-config命令时&#xff0c;报错 Traceback (most recent call last):File "C:\ProgramData\Anaconda3\envs\py38\lib\runpy.py", line 192, in _run_module_as_mainreturn _run_code(code, main_globals, None,F…

html,css,js速成

准备&#xff1a;vscode配好c&#xff0c;python&#xff0c;vue环境。 1. html hypertext markup language(超文本标记语言) 1. 基础语法 一个html元素由开始标签&#xff0c;填充文本&#xff0c;结束标签构成。 常见标签说明<b></b>粗体<i></i>…

免费分享一套SpringBoot+Vue药店(药房)管理系统,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue药店(药房)管理系统 &#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue药店(药房)管理系统 Java毕业设计_哔哩哔哩_bilibili【免费】SpringBootVue药店(药房)管理系统 Java毕业设计…

Jmeter学习系列之五:基础线程组(Thread Group)

前言 线程组是一系列线程的集合,每一个线程代表着一个正在使用应用程序的用户。在 jmeter 中,每个线程意味着模拟一个真实用户向服务器发起请求。 在 jmeter 中,线程组组件运行用户设置线程数量、初始化方式等等配置。 例如,如果你设置线程数为 100,那么 jmeter 将创建…