[内核摘要] 虚拟文件系统

  Linux支持多种文件系统类型的方式和其他类Unix系统类似,通过虚拟文件系统来实现。

  对每个读,写或其他操作文件系统的调用函数,内核都用实际支持各种文件系统的函数来代替。

  12.1 虚拟文件系统(VFS)的角色

  VFS是一个内核软件层,用来处理与标准Unix文件系统相关的全部系统调用。它主要作用是为多种文件系统提供通用接口。

  VFS是一个在应用程序和(实际的)文件系统实现之间的抽象层。

  VFS支持的文件系统可以分成三类:

    a.基于磁盘的文件系统Disk-based filesystems

      管理在本地磁盘或其他模拟磁盘的设备上的可用内存空间。

    b.网络文件系统Network filesystems

    c.特殊文件系统Special filesystems

      该文件系统不管理本地或者远端的磁盘空间。/proc文件系统就是一个典型的特殊文件系统。

  12.1.1 通用文件模型

  VFS背后的关键思想在于提出了能够代表全部所支持文件系统的通用文件模型(common file model)。

  然而,每个特定的文件系统实现必须把它的物理组织转变成VFS的通用文件模型。

  例如,在通用文件模型中,每个目录被当成是一个文件,包含了一列文件和其他目录。

  文件在内核内存中由file数据结构表征,该数据结构包含一个叫做f_op的成员,包含有指向特定文件系统函数实现的指针。

  通用文件模型包含以下几个对象类型:

    a.超级块Superblock 

      存储一个已挂载文件系统的信息。对于基于磁盘的文件系统来说,该对象通常对应存储在磁盘上的文件系统控制块。

    b.索引节点inode

      存储一个指定文件的一般信息。对基于磁盘的文件系统,该对象通常对应存储在磁盘上的文件控制块。

    c.文件file

       存储进程和打开文件之间交互的信息。该信息只有进程打开文件期间存在于内核内存中。

    d.目录项dentry

       存储对应文件的目录入口的连接信息。

  图12-2阐述了一个简单例子关于进程如何跟文件交互。三个不同的进程打开了同一个文件,其中两个使用同一个硬链接。在次情况下,每个进程使用各自的file对象,同时为每个硬链接对应一个dentry对象。但是两个dentry对象都指的是同一个inode对象,inode对象标识了superblock对象和该通用磁盘文件。

  除了为所有的文件系统实现提供通用的接口,VFS在系统性能上也扮演了重要的角色。最近使用的dentry对象包含在称作dentry cache的磁盘缓存中,加快了从文件路径到文件索引节点的转换。

  通俗地讲,磁盘缓存是一种软件机制使得内核可以把通常存储在磁盘中的信息保存在RAM中,那么对该数据进一步地访问可以被迅速地满足而不用访问缓慢的磁盘。

  应当注意磁盘缓存如果区别于硬件缓存或者内存缓存,它们当中没有一个跟磁盘或者其它设备有关。硬件缓存是一个快速静态RAM,加速了向慢速动态RAM发出的请求。内存缓存是一个软件机制,用来绕过内核内存分配器(Kernel Memory Alloctor)。

  12.1.2 由VFS处理的系统调用

  我们在前面说过VFS是应用程序和特定文件系统之间的一层。然而在某些情况下,一个文件操作可以直接由VFS完成,而不需要调用到底层的代码。比如,当一个进程关闭了一个打开的文件,并不需要操作在磁盘上的该文件,因此VFS仅仅是释放对应的file对象。类似的,当lseek()系统调用修改了文件指针,作为一个打开文件和进程之间的交互属性,VFS也只需修改对应的file对象而不用访问磁盘上的文件,因此它不需要调用特定的底层代码。

  12.2 VFS数据结构

  所有的超级块对象都链在一个环形双向链表中,该链表的第一个元素是super_blocks变量。

  一般而言,由s_fs_info成员指向的数据是磁盘的信息,出于效率的考虑存放在内存中。每个基于磁盘的文件系统为了分配或者释放磁盘块需要访问并更新它的分配位图。VFS允许文件系统在不访问磁盘的情况下直接操作s_fs_info成员。

  这种方式会导致一个问题,VFS的超级块可能跟磁盘上对应的超级块没有同步。因此有必要引出s_dirt标志,表明该超级块是否是dirty,也就是磁盘上的数据是否需要更新。

  12.2.2 inode对象

  文件系统操作一个文件所需要的全部信息都包含在inode数据结构中。文件名字只是可以改变的一个标号,但是inode对文件来说是唯一的,只要文件存在,它就存在。

  当i_state成员的值等于I_DIRTY_SYNC,I_DIRTY_DATASYNC,或I_DIRTY_PAGES时,inode是dirty,也就意味着对应的磁盘inode必须更新。I_DIRTY宏可以用来检查这三个标志的值。i_state成员其它的值有I_LOCK(inode对象正被卷入I/O传输中),I_FREEING(inode对象已被释放),I_CLEAR(inode对象的内容已无意义),和I_NEW(inode对象已被分配但是还没有从磁盘inode读取内容填充它)。

  每个inode对象包含在超级块中以s_inodes成员为头结点的链表中;inode对象的i_sb_list成员存储了指向临近成员的指针。

  12.2.3 file对象

  存储在file对象中的最主要的信息是文件偏移指针,表明了下一次进程操作的位置。因为多个进程可能同时访问同一个文件,文件偏移指针必须保存在file对象中而不是inode对象中。

  

      

    

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/IrisZhou/p/3206818.html

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

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

相关文章

python之数据库连接

概述 前几日,闲来无事,写了一个python来连接数据库的模板案例,仿照传统MVC的例子。代码如下: DBUtil import pymysqlclass DBUtil:__db None__obj None__init_flag True__cursor Nonedef __new__(cls, *args, **kwargs):if …

python同步应用:多个线程有序执行

可以使用互斥锁完成多个任务,有序的进程工作,这就是线程的同步 from threading import Thread, Lock import time mutex1 Lock() # 创建一个互斥锁 mutex2 Lock() # 创建一个互斥锁 mutex3 Lock() # 创建一个互斥锁 def fun1(): while 1: mutex1…

阿里云 超级码力在线编程大赛初赛 第2场 题目4. 小栖的金字塔(超级卡特兰数+除法求模/乘法逆元)

文章目录1. 题目2. 解题1. 题目 来源:https://tianchi.aliyun.com/oj/15165469968503404/76745683739284070 2. 解题 按道理可以DP暴力求解,但是数据规模太大,会超时的 手算前几项,然后去 oesi 网站查询数列,找到 大…

统计学习之箱线图

箱线图: 箱形图(Box-plot)又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图。因形状如箱子而得名。在各种领域也经常被使用,常见于品质管理。它主要用于反映原始数据分布的特征,还…

SQL SERVER 中 实现主表1行记录,子表多行记录 整合成一条虚拟列

表中有这样的记录,简单的主子表,现要想通过left join 语句把两表关联起来 select * from tbl_diary_reback a left join tbl_diary_reback_files s on a.id s.diaryrebackid where diaryid -7e0f6876:1400eb06d1f:-7fed and diaryrebackid 1a75114…

python中的生产者与消费者模式

Queue的说明 对于Queue,在多线程通信之间扮演重要的角色 添加数据到队列中,使用put()方法 从队列中取数据,使用get()方法 判断队列中是否还有数据,使用qsize()方法 生产者消费者模式的说明 为什么要使用生产者和消费者模式 在线程…

01.神经网络和深度学习 W4.深层神经网络

文章目录1. 深层神经网络2. 前向传播和反向传播3. 核对矩阵维数4. 参数、超参数参考: 吴恩达视频课 深度学习笔记 1. 深层神经网络 有的时候只有非常深的神经网络才能发挥作用。 但是无法提前预知多少层的神经网络合适,可以先尝试逻辑回归,…

R语言第六讲 数据的统计分析

基本命令练习 下面的代码涵盖了一些分析数据常用的一些R语言的命令&#xff1a; #基本向量、矩阵的一般操作 x <- c(1,3,2,5) x x c(1,6,2) x y c(1,4,3) length(x) length(y) xy ls() rm(x,y) ls() rm(listls()) ?matrix xmatrix(datac(1,2,3,4), nrow2, ncol2) x xmat…

linux中的网络体系结构

1. 网络层级模型 计算机在进行网络通讯的时候&#xff0c;也要经过上图所示的类比流程。我们在实现通讯的时候&#xff0c;为了让整个流程的各个环节各司其职&#xff0c;将其按照各自所做的工作类别划分为不同的层级&#xff0c;彼此协作完成整个工作。 2. TCP/IP参考模型 TCP…

struts2异常处理

java1234官网 在sstruts2里面配置自己的异常处理 1 <exception-mapping result"error" exception"java.sql.SQLException"/> 2 <result name"error">/error.jsp</result> 在service里面捕捉到异常后往外抛&#x…

LeetCode 486. 预测赢家(博弈DP)

文章目录1. 题目2. 解题1. 题目 给定一个表示分数的非负整数数组。 玩家 1 从数组任意一端拿取一个分数&#xff0c;随后玩家 2 继续从剩余数组任意一端拿取分数&#xff0c;然后玩家 1 拿&#xff0c;…… 。 每次一个玩家只能拿取一个分数&#xff0c;分数被拿取之后不再可取…

linux中的ip地址、子网掩码、端口

ip地址&#xff1a;用来在网络中标记一台电脑的一串数字&#xff0c;比如192.168.1.1&#xff1b;在本地局域网上是惟一的。 每一个IP地址包括两部分&#xff1a;网络地址和主机地址 子网掩码只有一个作用&#xff0c;就是将某个IP地址划分成网络地址和主机地址两部分子网掩码的…

R语言第七讲 线性回归分析案例

题目 MASS 库中包含 Boston (波士顿房价)数据集&#xff0c;它记录了波士顿周围 506 个街区的 medv (房价中位数)。我们将设法用 13 个预测变量如 rm (每栋住宅的平均房间数)&#xff0c; age (平均房 龄)&#xff0c; lstat (社会经济地位低的家庭所占比例)等来预测 medv (房价…

01.神经网络和深度学习 W4.深层神经网络(作业:建立你的深度神经网络+图片猫预测)

文章目录作业1. 建立你的深度神经网络1. 导入包2. 算法主要流程3. 初始化3.1 两层神经网络3.2 多层神经网络4. 前向传播4.1 线性模块4.2 线性激活模块4.3 多层模型5. 损失函数6. 反向传播6.1 线性模块6.2 线性激活模块6.3 多层模型6.4 梯度下降、更新参数作业2. 深度神经网络应…

浅析调用android的content provider(一)

在Android下&#xff0c;查询联系人、通话记录等&#xff0c;需要用到content provider。但是&#xff0c;调用content provider时&#xff0c;Android框架内部是如何做的呢&#xff1f;这一系列文章就是解决这个问题的&#xff0c;所采用的开发环境及源码都是基于Android 1.6版…

linux中的集线器、交换机、路由器及组网

集线器&#xff1a;&#xff08;缺点&#xff1a;群发信息 hub&#xff08;集线器&#xff09;能够完成多个电脑的链接每个数据包的发送都是以广播的形式进行的&#xff0c;容易堵塞网络 通过交换机组网 网络交换机&#xff08;又称“网络交换器”&#xff09;&#xff0c;是…

R语言第七讲 线性回归分析案例续

题目 MASS 库中包含 Boston (波士顿房价)数据集&#xff0c;它记录了波士顿周围 506 个街区的 medv (房价中位数)。我们将设法用 13 个预测变量如 rm (每栋住宅的平均房间数)&#xff0c; age (平均房 龄)&#xff0c; lstat (社会经济地位低的家庭所占比例)等来预测…

LeetCode 1129. 颜色交替的最短路径(BFS)

文章目录1. 题目2. 解题1. 题目 在一个有向图中&#xff0c;节点分别标记为 0, 1, ..., n-1。 这个图中的每条边不是红色就是蓝色&#xff0c;且存在自环或平行边。 red_edges 中的每一个 [i, j] 对表示从节点 i 到节点 j 的红色有向边。 类似地&#xff0c;blue_edges 中的每…

web.config文件之自定义错误节

web.config文件之自定义错误节 大家都知道&#xff0c;在开发asp.net应用程序时&#xff0c;通过web.config文件可以配置在执行 Web 请求期间发生未处理的错误时&#xff0c;ASP.NET 显示信息的方式。下面是一个典型的基本配置&#xff1a; ?<system.web><customErro…

R语言第八讲 评估模型之交叉验证法分析案例

题目 评估Auto数据集上拟合多个线性模型所产生的测试错误率。Auto数据集是存在与ISLR程序包中的一个摩托车相关数据的数据集&#xff0c;读者可自行下载ISLR程序包&#xff0c;并将Auto数据集加载。 相关资料 交叉验证是在机器学习建立模型和验证模型参数时常用的办法。交叉验…