【Linux Kernel】虚拟文件系统初探

学无止境~   看LKD进行的粗浅整理,目标是能够做到设计上面的理解~

Linux操作系统上支持多种文件系统,如本地文件系统EXT4、XFS、EXT3 等,同时还支持NFS、CIFS以及一些特殊的文件系统,同时在上层调用文件管理时又不感知不同文件系统的类型、存储的类型,之所以能做到这一点,最大的功臣就是虚拟文件系统,英文简称VFS。
VFS是定义一个通用的文件模型,满足上层对文件的处理应用,同时能够完整兼容所有文件系统的特殊需求和能力。

e149573a2348427fa5a4727d88829bb2.png

  之所以VFS能够屏蔽掉不同文件系统的差异,让上层无感我们以写文件为例

1619bf4a98d845e7a30e7cbf9d7f6762.png

vfs存在于用户与文件系统之间,这样就可以在虚拟文件系统层面实现屏蔽差异。

虽然内核整体采用C语言实现的,但是VFS本身的设计思想更多的是面向对象的,所以在使用C语言实现过程中会有些晦涩,整体思路是以结构体作为对象,对象的方法由不同的函数指针来实现。VFS中有几个关键的数据结构,分别是:超级块对象、索引节点对象、目录项对象、文件对象。下面的图可以简要描述这几个对象的关系:

ffe8f23043c9493abdfcedd3ef2551e5.png

 学习过程中, 我也是围绕这几个关键的数据结构进行的理解。

超级块对象(super_block)

代表已安装的具体的文件系统,存储的事文件系统本身的一些信息,通常对应于磁盘或分区特定扇区中的文件系统超级块或控制块。

索引节点对象(inode)

代表具体文件,在Linux一切皆文件,所以索引节点不仅代表传统意义上的文件,还有如目录等;主要包含了内核在操作文件时需要的全部信息。

文件对象

这个名字很容易被误解,会与inode搞混,文件对象描述的是由进程打开的文件,即同一个目录项由不同进程打开就会生成不同的文件对象, 换句话说文件对象是与进程相互绑定的,文件对象为进程提供了打开文件的相关信息与交互接口。

目录项对象(dentry)

是路径的一个组成部分,开始学习时很难理解目录项对象,目录项对象与Linux应用中传统意义上的文件夹不是等同或相近的。目录项对象的引入是为了解决文件查找繁琐的问题,所以目录项对象更多的意义在于文件与文件之间的关系,如/var/log/messages 这个文件中,包含的目录项对象有: /   var/ log/ messages 四个, 其中 根目录、var目录、log目录是不同层级的文件夹,messages是一个文件。

目录项对象还有一个比较重要的参数是状态,不同状态描述如下:

  • 空闲:没有被vfs使用,内存由slab处理,无关联inode
  • 未使用:没有被内核使用(d_count = 0),有关联的inode
  • 正在使用:正在被内核使用(d_count >0),有关联的inode,不能被丢弃
  • 负状态:有inode(被删除或不存在的)d_inode = NULL

既然目录项是为了方便查找,那么就需要一定的数据结构或设计方案来支持这一特性,其中目录项高速缓存解决了这一问题。目录项高速缓存由两个结构体组成:

  • 一个双向链表,包含了正在使用、未被使用、负状态的目录项对象,该双向链表形成一个先进先出的执行队列。以此实现一个“最近最少使用(LRU)”的缓存
  • 一个散列表,通过目录名和文件名从中能够快速获取一个目录项对象(目录项对象中与inode相关联,找到对应的目录项对象就能够定位到inode)

语言描述往往很难理解, 所以我就以查找/var/log/messages这个文件为例子描述一下目录项查找的逻辑:
查找一个文件的目录项查询逻辑
目标:查找/var/log/messages
高速缓存工作流如下:
1. 查找LRU链表:首先,文件系统会检查目录项高速缓存中的最近最少使用(LRU)链表。这是为了快速查找最近被访问过的目录项。如果目标文件(在这里是 `messages`)的目录项恰好位于LRU链表的头部或近期被访问过,那么它可能会直接从缓存中提取出来,避免了进一步的磁盘访问。

2. 查找散列表:如果LRU链表中没有找到目标目录项,文件系统会转向散列表(通常称为哈希表)。散列表根据目录项的名称进行快速查找。这里,文件系统会按照路径组件(`/`、`var`、`log`、`messages`)的顺序,逐个查找每个组件的目录项。每个找到的目录项都会成为下一个查找步骤的起点。

  •    首先,查找根目录(`/`)的目录项。
  •    然后,使用根目录的目录项作为起点,查找 `var` 子目录的目录项。
  •    接着,使用 `var` 目录项作为起点,查找 `log` 子目录的目录项。
  •    最后,使用 `log` 目录项作为起点,查找 `messages` 文件的目录项。

   在每个步骤中,如果目录项在散列表中不存在,那么它会根据需要从磁盘上读取,并添加到散列表和相应的链表中(例如,最近使用链表)。

3. 添加新目录项:如果在查找过程中发现某个目录项在缓存中不存在,那么该目录项会从磁盘上读取出来,并被添加到目录项高速缓存中。新添加的目录项会被放置在最近使用链表的头部,表示它是最近访问过的。

4. 缓存管理:随着时间的推移,当缓存空间不足时,文件系统会根据一定的策略(如LRU算法)从缓存中移除最少使用的目录项,以释放内存空间
以上逻辑就能够明白目录项的作用和逻辑了。

除了上述4个重要的数据结构外,还有一些特定的数据结构:
与文件相关的数据结构

  • file_system_type: 特定的文件类型
  • vfsmount:代表一个安装点

与进程相关的数据结构

  • files_struct: 与进程相关的文件信息(如:一个进程最多能够打开多少个文件等配置)
  • fs_struct:文件系统和进程的相关信息(如:pwd,进程根目录等)
  • mmt_namespace:单进程命名空间,进程在系统中能够看到的唯一的安装文件系统

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高并发Server的基石:reactor反应堆模式

业务开发同学只关心业务处理流程。但是我们开发的程序都是运行服务端server上,服务端server接收到IO请求后,是如何处理请求并最终进入业务流程的呢?这里不得不提到reactor反应堆模型。nginx tomcat redis nodejs dubbo等软件的网络处理模型都…

如何食用Kaggle的Course中的exercise?

前言 读完本文只需要几分钟,读完后你将知道: 如何连接kaggle的反馈系统如何检查代码正确性如何查看提示和答案 读者可以拿kaggle的 pandas入门课来练手。 关于Setup 通常最上面的会有一块代码,它的功能是连接kaggle的反馈系统&#xff0…

Python 在Word中创建表格并填入数据、图片

在Word中,表格是一个强大的工具,它可以帮助你更好地组织、呈现和分析信息。本文将介绍如何使用Python在Word中创建表格并填入数据、图片,以及设置表格样式等。 Python Word库: 要使用Python在Word中创建或操作表格,需…

HDFS源码解析---写数据流程

太长不看版 1、写入(create)创建DFSOutputStream,启动DataStreamer线程run (主线程) 2、setPipeline -> nextBlockOutputStream -> locateFollowingBlock(addBlock) 2、createBlockOut…

【前端素材】推荐优质后台管理系统Qovex平台模板(附源码)

一、需求分析 1、定义 后台管理系统是一种用于管理和监控网站、应用程序或系统的在线工具。它通常是通过网页界面进行访问和操作,用于管理网站内容、用户权限、数据分析等。后台管理系统是网站或应用程序的控制中心,管理员可以通过后台系统进行各种管理…

关于字符集(彻底搞清楚一个中文占几个字节?)

目录 一、字符集二、ASCII码(字符编码)三、ISO-8859-1(字符集)四、GBxxx(字符集)五、Unicode码(字符集)六、UTF-8(字符编码)总结 一、字符集 编码与解码 计算机中储存的信息都是用二进制数表示的而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结…

Ubuntu20.04和Windows11下配置StarCraft II环境

1.Ubuntu20.04 根据下面这篇博客就可以顺利安装: 强化学习实战(九) Linux下配置星际争霸Ⅱ环境https://blog.csdn.net/weixin_39059031/article/details/117247635?spm1001.2014.3001.5506 Ubuntu下显示游戏界面目前还没有解决掉。 大家可以根据以下链接看看能…

腾讯云ICP备案服务器多少钱?

腾讯云备案服务器多少钱?备案服务器只要62元一年,可以备案5个网站。备案服务器申请页面 https://curl.qcloud.com/oRMoSucP 链接打开如下图: 腾讯云备案服务器价格 腾讯云支持ICP备案的服务器有以下三点限制条件: 1、地域必须是中…

PMP认证有什么用?含金量高吗?如何备考?

PMP备考多久能参加PMP考试,培训机构是关键点 依我这几年的持证体验来看,PMP认证的用处还是比较多的,也有一定的含金量,这两个方面基本都是随便一百度就能得到结果的,在考PMP的人群中唯一不同的可能就是备考方面的问题…

设计一个 shell 命令行程序

目录 实现 shell 主要思路 代码(Linux)系统 实现 shell 主要思路 1、要知道一个 shell 进程在运行起来都会在命令行呈现什么,如图是Xshell 登录成功后的界面:所以第一步要做的就是打印命令行提示符。 Xshell 命令行提示符的组…

SQL-Labs46关order by注入姿势

君衍. 四十六关 ORDER BY数字型注入1、源码分析2、rand()盲注3、if语句盲注4、时间盲注5、报错注入6、Limit注入7、盲注脚本 四十六关 ORDER BY数字型注入 请求方式注入类型拼接方式GET报错、布尔盲注、延时盲注ORDER BY $id 我们直接可以从界面中得知传参的参数为SORT&#x…

力扣 169. 多数元素

思路: 因为题目说一定存在多数元素,就说明一定有一个数的个数多于n/2 将数组采用冒泡从小到大排序,最中间的那个元素一定是多数元素(因为在大小排好序后,中位数也一定是众数) 答案: int maj…

【鸿蒙 HarmonyOS 4.0】UIAbility、页面及组件的生命周期

一、背景 主要梳理下鸿蒙系统开发中常用的生命周期 二、UIAbility组件 UIAbility组件是一种包含UI界面的应用组件,主要用于和用户交互。 UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口;一个UIAbility组件中可以通过多个页…

数据价值在线化丨TiDB 在企查查数据中台的应用及 v7.1 版本升级体验

本文介绍了企查查在数据中台建设中使用 TiDB 的经验和应用。通过从 MySQL 到 TiDB 的迁移,企查查构建了基于 TiDB Flink 的实时数仓框架 ,充分利用了 TiDB 的分布式架构、MySQL 兼容性和完善的周边工具等特性,实现了数据的在线化处理。2023 年…

svn客户端下载、安装、使用

下载、使用 打开360软件管家,选怎宝库,搜索svn,点击安装 可以修改安装路径 使用 在桌面右键弹出菜单,点击 输入地址,点击ok 输入用户名、密码 ,等待检出完成

Java智慧工地管理云平台源码 带AI识别、桌面管理+大屏指挥+手机APP

目录 智慧工地云系统技术说明 1.什么是 AI 危险源识别 2.什么是标养室监测 3.什么是塔机监测 4.什么是塔机黑匣子 5.什么是升降机监测 6.什么是升降机黑匣子 7.什么是标养箱 8.什么是吊钩可视化 9.什么是吊钩追踪控制设备 10.什么是扬尘监测 11.什么是扬尘监测设备…

基于SpringBoot的停车场管理系统

基于SpringBootVue的停车场管理系统的设计与实现~ 开发语言:Java数据库:MySQL技术:SpringBootMyBatis工具:IDEA/Ecilpse、Navicat、Maven 系统展示 前台首页 停车位 个人中心 管理员界面 摘要 摘要:随着城市化进程的…

测绘测量行业CRM功能大揭秘:哪家才是最佳选择?

测绘测量行业面临着处理及管理海量数据的难题。办公软件进行数据记录是非常繁琐的,往往需要花费大量的时间来查找所需的信息,甚至造成内容丢失。测绘测量企业运用CRM管理系统至关重要。本文将向您介绍测绘测量行业CRM功能、哪家好? CRM软件的…

03 表数据基本操作

文章目录 插入(insert)查询(select)where子句更新表记录(update)删除表记录(delete)表字段的操作(alter)时间类型数据 插入(insert) insert into 表名 values(值1,值2...),(值1,值2...),...; insert into 表名 (字段1,...) value…

【办公类-16-10-02】“2023下学期 6个中班 自主游戏观察记录(python 排班表系列)

背景需求: 已经制作了本学期的中4班自主游戏观察记录表 【办公类-16-10-01】“2023下学期 中4班 自主游戏观察记录(python 排班表系列)-CSDN博客文章浏览阅读398次,点赞10次,收藏3次。【办公类-16-10-01】“2023下学…