操作系统-4.2文件系统的层次结构虚拟文件系统
文章目录
- 文件系统的层次结构
- 物理格式化
- open系统调用打开文件的背后过程
- 图中内容解释
- 文件打开的详细步骤
- 操作总结
- 虚拟文件系统
- 1. **虚拟文件系统的作用**
- 2. **虚拟文件系统的结构**
- 3. **VFS 工作机制**
- 4. **VFS 的优点**
文件系统的层次结构
用一个例子来辅助记忆文件系统的层次结构:
假设某用户请求删除文件“D:/工作目录/学生信息.xlsx”的最后100条记录。
- 用户需要通过操作系统提供的接口发出上述请求–用户接口
- 由于用户提供的是文件的存放路径,因此需要操作系统一层一层地查找目录,找到对应的目录项–文件目录系统
- 不同的用户对文件有不同的操作权限,因此为了保证安全,需要检查用户是否有访问权限–存取控制模块(存取控制验证层)
- 验证了用户的访问权限之后,需要把用户提供的“记录号”转变为对应的逻辑地址–逻辑文件系统与文件信息缓冲区
- 知道了目标记录对应的逻辑地址后,还需要转换成实际的物理地址–物理文件系统
- 要删除这条记录,必定要对磁盘设备发出请求–设备管理程序模块
- 删除这些记录后,会有一些盘块空闲,因此要将这些空闲盘块回收–辅助分配模块
物理格式化
划分扇区,检测好的扇区,用好的扇区替换为坏的扇区。
用分区表,完成各区的文件系统初始化
超级块用来快速找到若干的空闲块。
i结点区:所有索引结点存放
根目录:从根目录出发建立子目录。
open系统调用打开文件的背后过程
从目录M读入缓存,将FCB复制到文件表,进程打开文件表新建一个条目,返回文件描述符,对打开文件进行操作。
这张图展示了文件打开的过程以及文件系统中与打开文件相关的数据结构
图中内容解释
-
内存结构:
- 目录M缓存:用于存储目录项和文件控制块(FCB),其中包含文件的元数据,如文件名、大小、存取权限等。
- 系统打开文件表:位于内核区,用于管理当前系统中所有进程所打开的文件,存储文件在内存中的副本及相关信息。
- 进程(用户)打开文件表:每个进程都有自己的打开文件表,用于维护该进程打开的文件信息。
-
磁盘结构:
- 磁盘上包含实际的文件,如图中展示的文件A和文件B。
- 磁盘目录(如目录M)用于存储指向文件的索引信息。
文件打开的详细步骤
-
打开文件操作:
- 用户通过
open
函数指定文件路径进行文件打开操作。例如,调用open(.../M/A, 只读)
来打开文件A
。 - 系统会根据指定路径逐级遍历目录,找到对应的文件控制块(FCB)。
- 用户通过
-
系统打开文件表:
- 在内存中,系统根据目录中找到的FCB,将其复制到系统打开文件表。
- 系统打开文件表存储文件的相关信息,包括文件指针和打开计数器(用于记录有多少个进程同时打开该文件)。
-
进程打开文件表:
- 系统在进程打开文件表中创建一项,存储打开文件的具体信息,如打开方式(只读、读写等)。
- 该表中的每项指向系统打开文件表中的对应文件项。
-
返回文件描述符:
- 系统会为该打开文件分配一个文件描述符
fd
,返回给用户区,供程序后续对文件的操作使用。
- 系统会为该打开文件分配一个文件描述符
操作总结
- 文件打开计数:每次有进程打开文件时,系统打开文件表中的计数器会递增;文件关闭时计数器递减。当计数器为0时,系统释放该文件的内存资源。
- 进程和系统关联:进程打开文件表中的每项通过索引与系统打开文件表项关联,这样可以共享文件信息,避免重复读取磁盘内容。
虚拟文件系统
虚拟文件系统(Virtual File System, VFS)是操作系统内核中一层抽象层,用于实现不同文件系统的兼容与统一接口。它使得操作系统可以通过统一的接口来访问不同类型的文件系统,例如 ext4、NTFS、FAT32 等。
1. 虚拟文件系统的作用
- 统一接口:VFS 为用户程序提供一个统一的接口,使得应用程序无需关心底层实际使用的文件系统类型。程序员可以使用相同的系统调用(如
open
、read
、write
等)来访问文件,而不需要考虑文件是存储在 ext4 文件系统还是 FAT32 文件系统中。 - 文件系统兼容:VFS 通过抽象层将操作系统与具体文件系统实现分离,支持多个文件系统共存,使操作系统可以无缝地处理不同类型的文件系统。
- 透明访问:用户或应用程序可以透明地访问网络文件系统、远程文件系统等,而不需要关注底层文件访问的细节。
2. 虚拟文件系统的结构
VFS 的实现通常包括以下几个核心部分:
- VFS 接口:定义了文件系统的操作接口,如打开、关闭、读取和写入文件等操作。
- 文件系统类型表:维护系统中已安装的文件系统类型列表,如 ext4、NTFS、NFS 等。每个文件系统类型都实现了 VFS 接口。
- 超级块对象:表示文件系统的元数据,包括文件系统的类型、状态等。
- 索引节点对象(inode):表示文件的具体元数据信息,如文件大小、权限、物理位置等。
- vnode:函数功能指针,指向具体函数的指针。每个文件对应一个vnode
- 目录项对象(dentry):用于表示目录项,维护文件和目录的层次结构。
- 文件对象:用于表示打开的文件,维护文件描述符及文件状态等信息。
3. VFS 工作机制
VFS 的工作机制如下:
- 文件系统挂载:操作系统通过 VFS 接口将不同的文件系统挂载到统一的目录树上。每个文件系统在挂载时都会注册其超级块对象和其他数据结构。
- 注册新挂载的文件系统(挂载表)。
- 向VFS提供一个函数地址列表。
- 将新文件系统加到挂载点上。
- 文件访问请求:当用户进程发出文件访问请求(如
open()
)时,VFS 接口接收该请求并在目录树中查找相应的目录项对象(dentry),确定所访问文件的索引节点(inode)。 - 文件操作:VFS 将操作请求发送到文件系统的实现中。每个具体的文件系统实现会根据自己的存储结构,完成读写等操作。
- 数据返回:文件系统返回操作结果,VFS 通过统一的接口将结果返回给用户程序。
4. VFS 的优点
- 抽象和扩展性:增加一个新的文件系统时,只需要实现 VFS 接口即可,系统内核不需要更改。
- 跨平台支持:VFS 提供了一个抽象层,便于操作系统兼容不同的存储介质和文件系统类型。
- 简化开发:开发人员只需针对 VFS 编写代码,无需针对每种文件系统分别编写。
相关文章:

操作系统-4.2文件系统的层次结构虚拟文件系统
文章目录 文件系统的层次结构物理格式化open系统调用打开文件的背后过程图中内容解释文件打开的详细步骤操作总结 虚拟文件系统1. **虚拟文件系统的作用**2. **虚拟文件系统的结构**3. **VFS 工作机制**4. **VFS 的优点** 文件系统的层次结构 用一个例子来辅助记忆文件系统的层…...
【深度学习】DreamClear:提升图片分辨率的模型
基于PixArt-XL-2模型,效果很好。 DreamClear:高容量真实世界图像修复与隐私安全数据集构建 在图像修复领域,处理真实世界中的低质量(Low-Quality, LQ)图像并恢复其高质量(High-Quality, HQ)版本一直是一个具有挑战性的任务。今天,我们将介绍一个最新的开源项目——Dr…...
操作系统进程互斥的四种软件实现和三种硬件实现
进程互斥是操作系统中保证多个进程不会同时访问共享资源的一种机制。 进程互斥的四种软件实现方式: 一、单标志法 核心思想:使用一个布尔变量(或称为标志位)来表示临界区的访问权限。该变量为true时表示允许某个进程访问临界区&…...

C++虚继承演示
在继承中如果出现: 这种情况,B和C都继承了A,D继承了B、C 在D中访问A的成员会出现: 这样的警告 是因为在继承时A出现两条分支:ABD、ACD 编译器不知道访问的A中的元素是经过B继承还是C继承 所以B、C在继承A时要用到…...
React Native的生命周期
React Native 组件的生命周期分为三个阶段:Mounting(挂载)、Updating(更新) 和 Unmounting(卸载)。每个阶段都会触发不同的生命周期方法。 下面是详细的生命周期解释,并通过一个项目…...
linux系统中涉及到用户管理的命令知识
用户创建与密码设置 Linux中新建用户使用useradd命令,只有root用户才能执行,若useradd命令直接输入不管用,可使用绝对路径/usr/sbin/useradd。设置用户登录密码使用passwd命令。 su命令相关 su代表switch user,用于切换用户。切换…...

LeetCode 0685.冗余连接 II:并查集(和I有何不同分析)——详细题解(附图)
【LetMeFly】685.冗余连接 II:并查集(和I有何不同分析)——详细题解(附图) 力扣题目链接:https://leetcode.cn/problems/redundant-connection-ii/ 在本问题中,有根树指满足以下条件的 有向 图。该树只有一个根节点&…...

Dubbo负载均衡
负载均衡策略与配置细节 Dubbo 内置了 client-based 负载均衡机制,如下是当前支持的负载均衡算法,结合上文提到的自动服务发现机制,消费端会自动使用 Weighted Random LoadBalance 加权随机负载均衡策略 选址调用。 如果要调整负载均衡算法…...
PymuPDF4llm提取pdf文件文字、表格与图片
一、PymuPDF4llm 的功能特点 (一)文本提取 简单易用 PymuPDF4llm 的文本提取功能非常简单易用。只需使用pip install pymupdf4llm进行安装,然后通过import pymupdf4llm导入库,就可以使用md_text pymupdf4llm.to_markdown("…...

20241108通过iperf3确认中科创达的高通CM6125的WIFI的网速【失败】
20241108通过iperf3确认中科创达的高通CM6125的WIFI的网速【失败】 2024/11/8 15:43 由于以太网不能用,那就测试一下WIFI,iperf3链接/测试异常。 一般认为可能的原因有: 1、CM6125开发板的WIFI不带天线,影响性能。 2、CM6125的And…...

Stored procedures in PostgreSQL
select 存储过程,在现了解的情况,还是没有mysql,sqlserver等好写好用。 --postgreSQL 11.0 以下版本 create or replace FUNCTION procInsertSchool (pSchoolId Char(5),pSchoolName VarChar(100),pSchoolTelNo VarChar(8) ) RETURNS void language plp…...

第10章 多表查询
一、什么是多表查询 多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。 前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立…...
【基于LSM的ELF文件安全模块设计】参考
《基于LSM的ELF文件安全模块设计文档》 一、设计目标 本设计致力于通过 Linux 安全模块(LSM)构建一个强大而严密的安全防护体系,以实现对 ELF 文件(涵盖可执行文件和动态链接库)的绝对严格的合法性和完整性检查。其核…...
全卷积和全连接
全连接网络和全卷积网络不一样 以下是对两者的正确解释和代码示例: 1. 全连接网络(Fully Connected Network) 全连接网络使用的是 线性层(nn.Linear),也就是我们常说的“全连接层”。它是用于将每一个输入…...
Unity图形学之Shader结构
Unity - Manual: ShaderLab: Legacy Lighting 1.Shader 语言: OpenGL:SGL 跨平台性能非常好 GLSL语言 OpenGL Shader LanguageDX:微软 非跨平台 性能非常好 HLSL语言 High Level Shader LanguageCG:微软和英伟达 联合开发CG …...

离散时间信号的产生
文章目录 前言1.单位冲激序列函数1.2 函数:1.3 实现代码:1.3 调用方式1.4 调用结果 2.单位阶跃序列函数2.1 函数2.2实现代码2.3调用方式2.4调用结果 3.矩形序列3.1函数3.2 实现代码3.3调用方式3.4 调用结果 4.实指数序列4.1函数4.2实现代码4.3调用方式4.…...

物联优化汽车齿轮锻造
在汽车齿轮的锻造工艺中,锻造温度、锻造压力与行程、锻造速度与锤击方式以及热处理工艺等核心参数扮演着举足轻重的角色。这些参数的精准控制与实时监测,对于提升生产效率、确保产品质量、削减生产成本以及推动生产智能化转型具有不可估量的价值。明达技…...

CocosCreator 构建透明背景应用(最新版!!!)
文章目录 透明原理补充设置截图以及代码step1: electron-js mian.jsstep2:ENABLE_TRANSPARENT_CANVASstep3:SOLID_COLOR Transparentstep:4 Build Web phonestep5:package electron-js & change body background-color 效果图补充 透明原理 使用Cocos creator 做桌面应用开…...

使用CentOS宝塔面板docker搭建EasyTier内网穿透服务
0. 前言 EasyTier是一个简单、安全、去中心化的内网穿透 VPN 组网方案,部署方便,支持 MacOS/Linux/Windows/FreeBSD/Android平台,而且作者搭建了一个公共服务器,不想折腾自建服务,可以使用默认的公共服务器地址 tcp:/…...

HTMLCSS: 实现可爱的冰墩墩
效果演示 HTML <div class"wrap"><div class"body"></div><div class"ear"></div><div class"ear rightEar"></div><div class"leftHand"></div><div class"…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...

消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...

【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
WEB3全栈开发——面试专业技能点P7前端与链上集成
一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...