f2fs源码分析之文件读写过程
本篇包括三个部分:1)f2fs 文件表示方法; 2)NAT详细介绍;3)f2fs文件读写过程;4)
下面详细阐述f2fs读写的过程。
管理数据位置关键的数据结构是node,node包括三种:inode、直接node、间接node。其中inode记录了文件的基本信息,包括访问权限、文件大小、修改时间等,也有索引的功能;直接node和间接node单纯负责索引。F2fs的inode中有923个直接数据块索引,2个一级索引,2个二级索引,1个三级索引,文件的逻辑表示如下图:
inode中有923个索引项,直接node、间接node中都是有1018个索引项。
通过上图,inode中923个直接数据块索引能够索引到××K的数据,
2个一级索引能够索引到
2个二级索引能够索引到
1个三级索引能够索引到
因此,f2fs支持单文件最大3.94T,
上面介绍了f2fs三种node之间是如何配合索引文件的,但是有一个非常重要的细节:间接node的索引项记录nid号(与NAT相关),直接node的索引项中直接记录数据块地址。拿图(一)中的三级索引部分为例:
其中node block 1) 2)属于间接node,索引项中为nid号,3)和4)属于直接node,索引项中为数据块的地址。这种设计是为了解决Log-structured 文件系统中雪崩树问题,其中nid号是NAT表的下标。
f2fs文件系统中,NAT表是和文件存储强相关的一个数据结构,非常重要。因此,这篇文章的第二部分,我们就详细说说NAT表,包括它的作用以及f2fs是如何管理NAT表的。
NAT表位于元数据区,可以认为是一个大数组,数据下标是nid,每一个表项记录着一个node块的信息,包括该node块属于哪一个inode,以及该node块在磁盘上的地址。
还是以图(一)中的三级索引部分为例,我们发现,整个索引过程的真相应该是这样的:
这和图一相比已经面目全非了,图一更宏观,本图粒度更细。
到这里我们基本上可以明白f2fs为什么可以削弱雪崩树的影响了:当图中数据块因为数据变脏导致异地更新时,它的直接索引2)也会变脏,但是由于2)是一个直接索引,是node块,信息是在NAT中管理,所以只需要在NAT中update下2)的新地址就好了!这样3)中对应的索引项根本就不用变,因为3)的索引项指向的东西在NAT里呢!
这一机制有效杜绝了雪球越滚越大!但是,这种类似于”二级指针“的方法,会带来一定程度的性能开销,所以f2fs的NAT信息在内存中以链表+基数树的方式维护,以加快查找、update过程。
好了,到这里NAT的作用基本清楚了,后面读写文件的过程还会涉及nat的操作。下面介绍下NAT的存储方式:
元数据区中有两份NAT,两份NAT在元数据区中以segment的粒度交叉存放(假设每个NAT表有3个segment):
之所以准备两份NAT,是因为f2fs中有两份snapshot,NAT是和文件存储强相关的元数据,因此两份。但是两份snapshort和两份NAT之间并不是一一对应关系,如上图,并不是说第一份快照对应的NAT数据就完全存储在图中NAT0(或者NAT1)中。它是通过一个bitmap,完成NAT在block粒度上的映射:
好了,把NAT介绍完毕后,我们对f2fs文件的索引有了新的认识,下面介绍文件的读写过程:
1)首先在VFS层,
上面介绍了f2fs文件的逻辑表示,下面看f2fs源码中是如何
f2fs源码分析之文件读写过程的更多相关文章
- MyBatis 源码分析 - 映射文件解析过程
1.简介 在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程.由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因.所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来, ...
- Yii2 源码分析 入口文件执行流程
Yii2 源码分析 入口文件执行流程 1. 入口文件:web/index.php,第12行.(new yii\web\Application($config)->run()) 入口文件主要做4 ...
- Spring Ioc源码分析系列--Bean实例化过程(一)
Spring Ioc源码分析系列--Bean实例化过程(一) 前言 上一篇文章Spring Ioc源码分析系列--Ioc容器注册BeanPostProcessor后置处理器以及事件消息处理已经完成了对 ...
- Spring源码分析之`BeanFactoryPostProcessor`调用过程
前文传送门: Spring源码分析之预启动流程 Spring源码分析之BeanFactory体系结构 本文内容: AbstractApplicationContext#refresh前部分的一点小内容 ...
- Spring Ioc源码分析系列--Bean实例化过程(二)
Spring Ioc源码分析系列--Bean实例化过程(二) 前言 上篇文章Spring Ioc源码分析系列--Bean实例化过程(一)简单分析了getBean()方法,还记得分析了什么吗?不记得了才 ...
- tomcat8 源码分析 | 组件及启动过程
tomcat 8 源码分析 ,本文主要讲解tomcat拥有哪些组件,容器,又是如何启动的 推荐访问我的个人网站,排版更好看呦: https://chenmingyu.top/tomcat-source ...
- MyBatis 源码分析 - SQL 的执行过程
* 本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程.该过程本身比较复杂,牵涉到的技术点比较多.包括但不限于 Mapper 接口代理类的生成.接口方法的解析.SQL 语句的解析 ...
- Tornado源码分析 --- 静态文件处理模块
每个web框架都会有对静态文件的处理支持,下面对于Tornado的静态文件的处理模块的源码进行分析,以加强自己对静态文件处理的理解. 先从Tornado的主要模块 web.py 入手,可以看到在App ...
- Spark 源码分析 -- task实际执行过程
Spark源码分析 – SparkContext 中的例子, 只分析到sc.runJob 那么最终是怎么执行的? 通过DAGScheduler切分成Stage, 封装成taskset, 提交给Task ...
随机推荐
- SAPScript、Smartforms动态打印图像或者背景图片
在利用 SMARTFORMS 进行打印的时候有时候要求输出的图片可能是随着打印内容的不同而不同了,也就是动态输出图片,SMARTFORMS的提供了相关的支持技术,下面是实现截图 1.创建要显示的图片 ...
- centos如何安装软件
背景 之前用的linux操作系统移植都是ubuntu,没有用过redhat版本的linux,最近开始想学习redhan版本的linux,就从centos开始.在安装完centos以后,第一个碰到的问题 ...
- android notification 传值关键
android notification 传值关键在 onNewIntent方法里获取 @Override protected void onCreate(Bundle savedInstanceSt ...
- 【读书笔记】iOS-KVC
一,KVC即键/值编码. 二,KVC的基本调用包括-valueForKey:和-setValue:forKey:. 三,对于KVC,Cocoa自动放入和取出标量值.也就是说,当使用setValueFo ...
- 基础学习day02--标识符、关键字、数据类型与运算符
一.标识符和关键字 关键字: 就是被java语言赋予了特殊含义的单词. 特点就是所有的关键字都是小写. 标识符: 就是给包.类.接口.方法.变量名起的名字. 规则:1.以数字.字母._以及$符 ...
- ios开发随笔第一篇-button,label按钮的一些属性的使用
我用的是纯代码方式,喜欢用storyboard开发的其实也很爽了; 首先谈谈button,ios中新建button这个对象一般接触的都明白,UIButton *button名=[ UIButton a ...
- iOS开发之UIImage等比缩放
iOS开发之UIImage等比缩放 评论功能真不错 评论开通后,果然有很多人吐槽.谢谢大家的支持和关爱,如果有做的不到的地方,还请海涵.毕竟我一个人的力量是有限的,我会尽自己最大的努力大家准备一些干货 ...
- 大家一起和snailren学java-(五)访问控制权限
“感觉中间断了一天,可是数数好像又没断……(-_^)” 这一天我们来再次细致讨论一下java的访控机制.java的访控机制其实在编程架构上非常实用的,也就是所谓的隐藏具体实现或者封装. 首先看看使用场 ...
- Memcache笔记04-Memcached机制深入了解
Memcached机制深入了解 ①基于c/s架构 ,协议简单 c/s架构,此时memcached为服务器端,我们可以使用如PHP,c/c++等程序连接memcached服务器. memcached的服 ...
- Effective Java 34 Emulate extensible enums with interfaces
Advantage Disadvantage Enum types Clarity Safety Ease of maintenance. None extensibility Typesafe en ...