当前位置: 首页 > 编程日记 > 正文

虚拟文件系统(VFS)

原文链接:http://www.orlion.ga/1008/

linux在不同的文件系统之上做了一个抽象层,使得文件、目录、读写访问等概念都成为抽象层概念,这个抽象层被称为虚拟文件系统(VFS)。

linux内核的VFS子系统如下:

每个进程在PCB(Process Control Block)中都保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针,一打开的文件在内核中用file结构体表示,文件描述符表中的指针指向file结构体。

在file结构体中维护File Status Flag(file结构体的成员f_flags)和当前读写位置(file结构体的成员f_pos)。在上图中,进程1和进程2都打开同一文件,但是对应不同的file结构体,因此可以有不同的File Status Flag和读写位置。file结构体还有一个成员f_count,表示引用计数(Reference Count),如果有两个文件描述符指向同一个file结构体,那它的引用计数就是2,当close()一个文件描述符时并不会释放file结构体而是将引用计数减到1,再close一个文件描述符引用计数就会变成0同时再释放file结构体。真正的关闭文件。

每个file结构体都指向了一个file_operations结构体,这个结构体的成员都是函数指针,指向实现各种文件操作的内核函数。例在用户程序中read一个文件描述符,read通过系统调用进入内核,然后找到这个文件描述符指向的file结构体,找到file结构体所指向的file_operations结构体,调用它的read成员所指向的内核函数以完成用户请求。对于同一文件系统上打开的常规文件来说,read、weite等文件操作的步骤和方法应该是一样的,调用的函数应该是相同的,所以图中三个打开文件的file结构体指向同一个file_operation结构体,如果打开的是非常规文件那就不一样了。每个file结构体都有一个指向dentry结构体的指针,“dentry”是directory entry(目录项)的缩写。我们传给open、stat等函数的参数是一个路径,例如/home/orlion/a,需要根据路径找到文件的inode。为了减少读盘次数,内核缓存了目录的树状结构,称为dentry cache,其中每个节点是一个dentry结构体,只要沿着路径各部分的dentry搜索即可,从根目录/找到home目录,然后找到orlion目录,然后找到文件a。dentry cache只保存最近访问过的目录项,如果要找的目录项在cache中没有,就要从磁盘中读到内存中。

每个dentry结构体都有一个指针指向inode结构体。inode结构体保存着从磁盘inode读上来的信息。上图中有两个dentry,分别表示/home/akaedu/a和/home/akaedu/b,它们都指向同一个inode,说明这两个文件互为硬链接。inode结构体中保存着从磁盘分区的inode读上来信息,例如所有者、文件大小、文件类型和权限位等。每个inode结构体都有一个指向inode_operations结构体的指针,后者也是一组函数指针指向一些完成文件目录操作的内核函数。和file_operations不同,inode_operations所指向的不是针对某一个文件进行操作的函数,而是影响文件和目录布局的函数,例如添加删除文件和目录、跟踪符号链接等,属于同一文件系统的个inode结构体可以指向同一个inode_operation结构体。

inode结构体有一个指向super_block结构体的指针。super_block结构体保存着从磁盘分区的超级快上读来的信息,例如文件系统类型,块大小等。super_block结构体的s_root成员是一个指向dentry的指针,表示这个文件系统的根目录被mount到哪里。

file、dentry、inode、super_block这几个结构体组成了VFS的核心概念。

转载于:https://www.cnblogs.com/orlion/p/5350761.html

相关文章:

[学习笔记]矩阵乘法及其优化dp

1.定义: $c[i][j]\sum a[i][k]\times b[k][j]$ 所以矩阵乘法有条件,(n*m)*(m*p)n*p 即第一个矩阵的列数等于第二个矩阵的行数,否则没有意义。 2.结合律与分配率 矩阵乘法不一定任何时候都有交换律。因为交换后甚至不能保证第一个矩阵的列数等…

[LeetCode] Longest Substring with At Most K Distinct Characters 最多有K个不同字符的最长子串...

Given a string, find the length of the longest substring T that contains at most k distinct characters. For example, Given s “eceba” and k 2, T is "ece" which its length is 3. 这道题是之前那道Longest Substring with At Most Two Distinct Charac…

Linux创建指定用户特定指定目录权限

指定用户特定指定目录权限需要注意要指定好文件夹的权限,不然会导致nginx不能访问,最好是在root下建立目录,然后 # useradd -d /usr/www -m tempuser# passwd tempuser 回车输入密码 注意一定要带用户名,不然就是修改root!!!# c…

python asyncio教程_python中使用asyncio实现异步IO实例分析

1、说明Python实现异步IO非常简单,asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。asyncio的编程模型就是一个消息循环。我们从asyncio模块中直接获取一个EventLoop的引用,然后把需要执行的协程扔到EventLoop中执行&#xf…

c语言初学 循环 的灵活使用小案例

上为流程图 上为代码实现,没有做优化。接下来是效果图。 时间2018.10.01 地点:广东轻工业职业技术学院复制代码 转载于:https://juejin.im/post/5bb1d98a5188255c9a77441a

常见maven引用

json-lib Could not find artifact net.sf.json-lib:json-lib:jar json-lib是需要区分jdk版本的&#xff0c;pom.xml中的配置应加上<classifier>标签&#xff0c;如用jdk15&#xff1a; <dependency><groupId>net.sf.json-lib</groupId><artifactId…

怎么控制table的大小java_如何查询Table占用空间的大小

Oracle和DB2都支持分区表&#xff0c;但是我们得知道什么样的表适合使用分区表技术&#xff0c;Oracle的官方建议是超过2G的Table就要使用分区表。下面来总结一下&#xff0c;各DB中如何获得这些大小信息&#xff1a;Oracle 10G中&#xff1a;查询出当前用户的表所占用的空间大…

王豪:HW265到“HW266”

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/vn9PLgZvnPs1522s82g/article/details/82929609 每年的MSU的视频压缩评比报告都是多媒体的热点话题之一&#xff0c;在MSU 2018评比中&#xff0c;华为HW265在多项测试中排名…

Flex报错Error #2048: 安全沙箱冲突

FlexJPA架构&#xff0c;JPA程序迁移&#xff0c;从A服务器到B。其他一切没变&#xff0c;唯一变的就是IP。 前端Flex也就是swf报错Error #2048: 安全沙箱冲突:http://xxx.swf 不能从 xxx 加载数据 如下&#xff1a;其实原因就是需要在www网站的根目录放一个crossdomain.xml就可…

centos 默认mysql_centos改变mysql默认目录

centos改变mysql默认目录查看SELinux状态&#xff1a;如果未关闭&#xff0c;则要关闭1、/usr/sbin/sestatus -v ##如果SELinux status参数为enabled即为开启状态SELinux status: enabled2、getenforce ##也可以用这个命令检查关闭SELinux修改配置文件需要重启机器&#xff1a;…

如何免费(轻成本)在网上做推广宣传

最近有很多人在问我一个问题&#xff0c;如何少成本或者免费的在网上做推广宣传&#xff0c;这里我也总结一下&#xff0c;给各位一些建议和小方法&#xff0c;目前就以“BAT”和其他平台为例说明一下&#xff0c;通常来说都会以百度重技术、阿里重运营、腾讯重产品来形容“BAT…

BZOJ2631tree——LCT

题目描述 一棵n个点的树&#xff0c;每个点的初始权值为1。对于这棵树有q个操作&#xff0c;每个操作为以下四种操作之一&#xff1a; u v c&#xff1a;将u到v的路径上的点的权值都加上自然数c&#xff1b;- u1 v1 u2 v2&#xff1a;将树中原有的边(u1,v1)删除&#xff0c;加入…

MyBatis点滴积累

MyBatis在使用中不知不觉积累了很多经验1.#和$ MyBatis/Ibatis中#和$的区别1. #将传入的数据都当成一个字符串&#xff0c;会对自动传入的数据加一个双引号。如&#xff1a;order by #user_id#&#xff0c;如果传入的值是111,那么解析成sql时的值为order by "111", 如…

java可以调用python程序吗_我们可以从java调用python方法吗?

是的,那可以做到.通常,这将通过创建PythonInterpreter对象然后使用它来调用python类来完成.请考虑以下示例&#xff1a;Java&#xff1a;import org.python.core.PyInstance;import org.python.util.PythonInterpreter;public class InterpreterExample{PythonInterpreter inte…

【转】Hbuilder MUI 页面刷新及页面传值问题

文章来源&#xff1a;http://www.111cn.net/sys/CentOS/67213.htm 一、页面刷新问题 1.父页面A跳转到子页面B&#xff0c;B页面修改数据后再跳回A页面&#xff0c;刷新A页面数据(1).父页面A代码window.addEventListener("pageflowrefresh", function (e) {location.r…

第三次作业---读《构造之法》1-5章有感

这个作业的要求来自于&#xff1a;https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2178。 第一章&#xff1a;概论 读完第一章了解到了什么是软件工程、软件工程的领域。软件工程是把系统的、有序的、可量化的方法应 用到软件的开发、运营和维护上的过程。软件工程包…

Solr安装与配置

需要Java Runtime Environment(JRE) 1.7或更高版本&#xff0c;先验证。 # java -version如果没有安装好Java环境&#xff0c;需要参考&#xff1a;http://blog.csdn.net/unix21/article/details/18774417无需安装tomcat,新版solr已经集成jettySolr最新版下载地址 http://mirro…

php字符串替换多余逗号_PHP字符过滤函数去除字符串最后一个逗号(rtrim)

首先分别解释下,trim过滤字符串两端,rtrim过滤字符串尾部,chop()ltrim过滤字符串首部.过滤字符串中键的咚咚就只能用str_replace咯.举个例子说明下,PHP代码$str 123,333,234,;echo rtrim($str, ,);rtrim实例代码2$text "\t\tThese are a few words :) ... ";$trim…

TensorFlow王位不保?ICLR投稿论文PyTorch出镜率快要反超了

自PyTorch出道以来&#xff0c;不断有人表示&#xff0c;发现了这样的趋势&#xff1a; “学术圈正在慢慢地抛弃TensorFlow&#xff0c;转投PyTorch。” 如今&#xff0c;PyTorch 1.0发布&#xff0c;ICLR 2019也才截稿不久&#xff0c;又是讨论这个问题的好时节。 Reddit上面&…

php的hashmap,php如何实现hashmap

php实现hashmap的方法&#xff1a;主要方法参照JAVA的HASHMAP实现的Class HashMap{var $H_table;public function __construct() {$this->H_table array ();}public function put($key, $value) {if (!array_key_exists($key, $this->H_table)) {$this->H_table[$key…

Dispatcher与UI线程交互

1 this.chart2.Dispatcher.BeginInvoke(new Action(() > 2 { 3 this.chart2.SetData("Series1", lxs, lys, lzs); 4 })); 转载于:https://www.cnblogs.com/ants_double/p/5359476.html

Linux防火墙限制指定端口只能由指定IP访问

需要对redis的端口做限制&#xff0c;只能让公司内指定IP的机器访问-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACC…

Kubernetes基于Metrics Server的HPA

Kubernetes基于Metrics Server的HPA [TOC] 1. 环境说明和相关介绍 我的kubernetes环境&#xff1a; kubeadm安装的kubernetes1.11Horizontal Pod Autoscaler&#xff08;HPA&#xff0c;Pod水平自动伸缩&#xff09;&#xff0c;根据资源利用率或者自定义指标自动调整replicati…

Java判断文本文件编码格式以及读取

如果不是约定好的&#xff0c;要想解析txt文件就需要知道文件编码类型&#xff0c;由于文件编码类型众多&#xff0c;例如UTF-8&#xff0c;GBK&#xff0c;UTF-16,GB2312等等。其实有简单的办法&#xff0c;只需要这样就可以了String fileEncodeEncodingDetect.getJavaEncode(…

php 运维系统开发,PHP开发运维管理系统笔记

开发运维管理系统采用ThinkPHP框架mysql进行开发.框架配置return array(//‘配置项‘>‘配置值‘‘SHOW_PAGE_TRACE‘ > true,//允许访问的控制器‘MODULE_ALLOW_LIST‘ > array(‘Home‘),//默认控制器‘DEFAULT_MODULE‘ > ‘Home‘,//URL模式‘URL_MODEL‘ >…

[android]am自动化测试框架(原创)

在linux环境该目录下需要一个AndroidManifest.xml文件 需要一个python脚本就可以完成&#xff0c;功能点&#xff0c;打开某个package的所有activity并截图保存 import os import logging file open("AndroidManifest.xml") _adb_startActivity"adb shell am s…

Dubbo 整合 Pinpoint 做分布式服务请求跟踪

在使用Dubbo进行服务化或者整合应用后&#xff0c;假设某个服务后台日志显示有异常&#xff0c;这个服务又被多个应用调用的情况下&#xff0c;我们通常很难判断是哪个应用调用的&#xff0c;问题的起因是什么&#xff0c;因此我们需要一套分布式跟踪系统来快速定位问题&#x…

Memcached安装使用和源码调试

memcached官网&#xff1a;http://memcached.org/一.安装下载 # wget http://www.memcached.org/files/memcached-1.4.25.tar.gz解压 # tar xzvf memcached-1.4.25.tar.gz #cd memcached-1.4.25配置 #./configure --prefix/usr/local/memcached --with-libevent/usr 注意这里选…

上下或左右无缝滚动

文字或图片实现 向上 无缝滚动<div id"colee" style"overflow:hidden;height:80px;"><div id"colee1"><li><a href"/">文字或图片实现向上无缝滚动</a></li><li><a href"/"&g…

java老师拿钥匙,从Java中的NavigableMap获取第一把钥匙

要使用Java显示NavigableMap中的第一个键&#xff0c;请使用firstKey()方法。让我们首先创建NavigableMap-NavigableMap n new TreeMap();n.put("A", 498);n.put("B", 389);n.put("C", 868);n.put("D", 988);n.put("E", 68…