轻松理解操作系统 - Linux的虚拟文件系统是如何简化我们的使用的?

在前面几期,我们不仅了解了 Linux文件系统 是如何在硬盘等储存介质上保存文件的:

什么是软硬链接

文件的“身份证” - inode

真正储存文件的地方 - 数据块

文件系统的心脏 - 超级块

以及了解了 Linux系统 中具体都有一些什么文件:

Linux 中有哪些文件?

解决完了以上的问题之后,又有一个新的问题出现了:如何才能让用户方便的使用这些文件呢?尤其是在多文件系统的情况下。

Linux系统解决这个问题的方法是采用了虚拟文件系统(VFS)

一、虚拟文件系统是何方神圣?

通常,我们听说的比较多的“文件系统”都是在硬盘等储存介质上真实存在的。这个“虚拟文件系统”是什么呢?

答案是:它其实就是内存中的一个接口层

它将各种不同的文件系统抽象成一个统一的接口。使上层应用程序和操作系统内核直接调用其提供的接口即可,不必关心底层的实现和区别。

图片

二、虚拟文件系统起到了什么作用?

1、提供统一文件系统接口

VFS 定义了统一的文件系统接口,使得用户空间程序和操作系统内核无需关心底层文件系统的具体实现细节

用户程序和系统内核可以通过相同的系统调用来进行文件的读取、写入、打开、关闭等操作,而无需担心底层文件系统的差异。

2、支持多种文件系统

通过 VFS,操作系统内核可以同时支持多种文件系统,如ext4、NTFS、FAT32等。

这使得用户能够在不同文件系统之间自由地进行文件操作,而无需修改应用程序代码。

3、方便了文件系统的挂载和管理

VFS 负责管理文件系统的挂载和卸载,使得用户能够通过挂载点访问不同的文件系统。

三、那它的实现原理是什么呢?

它的数据结构

1、超级块对象

它会将每个文件系统的超级块都加载到内存中

前面有讨论过它是什么:文件系统的心脏 - 超级块

2、索引节点(inode)对象

它会将许多 inode 加载到内存中

前面有讨论过它是什么:文件的“身份证” - inode

3、目录项对象

它加速了文件路径的解析

它存在于内存之中:Linux文件系统在内存中有什么结构?

4、文件对象

存放已打开的文件和进程之间交互的信息,如文件描述符、文件偏移量等。

系统调用处理

当进程发起一个文件操作的系统调用时,VFS会拦截这个调用,并将其转换为特定于所访问的文件系统的操作。

以打开文件为例,这个流程是:

图片

1 - 拦截系统调用:

当进程调用 open() 系统调用时,VFS会拦截这个调用,并检查其参数的有效性。

2 - 查找目录项对象:

VFS 会根据提供的文件路径,通过逐级查找目录项对象来定位目标文件。

如果目标文件不存在,VFS 会根据系统调用的标志位决定是否创建新文件。

3 - 创建或获取文件对象:

文件对象会被添加到进程的文件描述符表中,以便后续访问。

4 - 执行文件系统操作:

VFS 会根据目标文件所在的文件系统类型,调用相应的文件系统操作函数来完成文件操作。

一个从生化环材专业转行的字节研发工程师,日常分享干货和有趣的科普。欢迎围观

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

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

相关文章

LeetCode【0019】删除链表的倒数第N个结点

本文目录 1 中文题目2 求解方法:虚拟头节点和快慢指针2.1 方法思路2.2 Python代码2.3 复杂度分析 3 题目总结 1 中文题目 给定一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例: 链表如上: 输入&a…

【JavaSE】多线程案例---阻塞队列

1. 阻塞队列 阻塞队列是一种特殊的队列,也遵守 " 先进先出 " 的原则。 阻塞队列是一种线程安全的数据结构,并且具有以下特性: 1. 当队列为满时,继续进行入队列操作就会阻塞,直到有其他线程从队列中取走元素…

SQL练习(2)

题源:牛客官网 选择题 假设创建新用户nkw,现在想对于任何IP的连接,仅拥有user数据库里面的select和insert权限,则列表语句中能够实现这一要求的语句是() A grant select ,insert on *.* to nkw% B grant…

Hyper-v中ubuntu与windows文件共享

Hyper-v中ubuntu与windows文件共享 前言相关链接第一步--第一个链接第二步--第二个链接测试与验证 前言 关于Hyper-V的共享我搞了好久,网上的很多教程太过冗余,我直接采用最简单的办法吧 相关链接 Hyper-V中Ubuntu 同windows系统共享文件夹-百度经验 …

【TCP零窗口问题】

零窗口问题说明 零窗口问题(Zero Window Problem)是指在TCP连接中,当接收方的接收缓冲区已满时,无法接受新的数据。此时,接收方会向发送方发送一个窗口大小为0的TCP消息,告知其暂停发送数据,直到接收方释放出缓冲区空间。这种情况在高负载或接收方处理能力不足时比较常见…

Oracle OCP认证考试考点详解082系列19

题记: 本系列主要讲解Oracle OCP认证考试考点(题目),适用于19C/21C,跟着学OCP考试必过。 91. 第91题: 题目 解析及答案: 关于 Oracle 数据库中的索引及其管理,以下哪三个陈述是正确的&#x…

2445.学习周刊-2024年45周

一片树叶展示了秋天的美 ✍优秀博文 数据仓库如何划分主题域在忙碌的工作中如何保持信息的输入?PC小米妙享安装解锁流转补丁智能数据建设与治理Dataphin对方讲话不要乱插嘴轩师处世之道 ✍实用工具 typing-practice云搭 自动化巡检系统 ✍精彩言论 话说的越快、…

关于解决使用VMWare内的虚拟机无法识别USB问题小结

目录 前言 0. 查看是不是没有开启USB3.0的支持 1. 检查一下是否禁用了VMWare USB服务 2. 无奈之举 前言 笔者今天帮助一位同志解决了VMWare内的虚拟机不识别挂载设备的办法。这里对笔者使用的排查手段做一个总结。 0. 查看是不是没有开启USB3.0的支持 我们的第一件事情就…

【364】基于springboot的高校科研信息管理系统

摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古…

RN codegen编译报错

react-native codegen 编译报错 error: redefinition of ‘NativeAccessibilityInfoSpecJSI’ class JSI_EXPORT NativeAccessibilityInfoSpecJSI : public JavaTurboModule 解决: codegen不能和项目本身一起编译,先执行./gradlew clean,然…

大数据技术之Hadoop :我是恁爹

就如上图中的技术分类,大数据技术主要解决的就是海量数据的存储和计算问题。 这两个问题的解决方案最先被 Google 被提出,用于解决 Google 搜索引擎海量的网页存储和索引的构建。对应的技术就是日后被人所熟知的 HDFS 和 MapReduce。 不关注大数据的可…

ATAT-mcsqs生成准随机结构(SQS)更新

通常使用第一性原理计算某些多元素占据原胞中同一位置的结构会优先考虑使用准随机结构(special quasirandom structure,SQS)来进行模拟建模。此篇教程意在整理一个较为简便的操作流程,以供参考。 合金理论自动化工具包(ATAT)1是一…

人际交往中,想要有好人缘,需做到“三要”,做到一个,也是好事

人际交往中,想要有好人缘,需做到“三要”,做到一个,也是好事 在这个世上,每个人都是一座孤岛,但通过人际交往这座桥梁,我们能够彼此相连,共同编织出一张温暖的社会网络。 好人缘&a…

政务数据治理专栏开搞!

写在前面 忙忙碌碌干了一年政务数据治理的工作,从法人数据到自然人,从交通到地理信息等等,突发想法开一个专栏讲一讲政务数据遇到的问题,以及治理的成效,或许有朋友爱看。 政务数据,又称之为政务数据资源&a…

Linux最深刻理解页表于物理内存

目录 物理内存管理 页表设计 物理内存管理 如果磁盘上的内容加载到物理内存上,每次io都会按照4kb的方式进行加载(可能不同版本系统有些区别)。所以我们的物理内存上的内容也是4个字节进行管理的。 而每个页框都需要我们进行管理。所以自然物理内存就会对页框进行先…

一键高效管理:苹果手机如何一键删除照片

在我们的日常生活中,苹果手机不仅是沟通的工具,更是捕捉和保存生活瞬间的重要设备。随着时间的推移,数以千计的照片积累在设备中,这不仅占用了大量的存储空间,也可能影响设备的性能。本文将详细介绍苹果手机如何一键删…

C++:类和对象(二)

C:类和对象(二) 类的默认成员函数构造函数析构函数拷贝构造函数 类的默认成员函数 默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。⼀个类,我们不写的情况下编译器会默认生成以下6个…

机器学习(基础2)

特征工程 特征工程:就是对特征进行相关的处理 一般使用pandas来进行数据清洗和数据处理、使用sklearn来进行特征工程 特征工程是将任意数据(如文本或图像)转换为可用于机器学习的数字特征,比如:字典特征提取(特征离散化)、文本特征提取、图像特征提取。 特征工程API 实例化…

ts中的元组概念解释(tuple)

用于定义数组每个元素的类型 元组 (Tuple) 是⼀种特殊的数组类型,可以存储固定数量的元素,并且每个元素的类型是已知的且可以不同。元组⽤于精确描述⼀组值的类型, ? 表示可选元素 1,正常写法 let list1 :[string,number] li…

Rust,删除cargo安装的可执行文件

列出安装的文件列表 cargo install --list 删除 rm /Users/ry/.cargo/bin/fancy