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 ...
随机推荐
- 读书笔记2014第6本:《The Hunger Games》
以前从未读过一本完整的英文小说,所有就在今年的读书目标中增加了一本英文小说,但在头四个月内一直没有下定决定读哪一本.一次偶然从SUN的QQ空间中看到Mockingjay,说是不错的英文小说,好像已经是 ...
- Sharepoint学习笔记—习题系列--70-573习题解析 -(Q85-Q87)
Question 85You create a Microsoft .NET Framework console application that uses a Representational St ...
- 操作数据库系统(OLTP)和联机分析处理系统(OLAP)的区别
联机操作数据库系统的主要任务是执行联机事务和查询处理.这种系统称为联机事务处理(OnLine Transaction Processing,OLTP) 系统.它们涵盖了单位的大部分日常操作,如购物,库 ...
- 弃用的异步get和post方法之代理方法
#import "ViewController.h" #import "Header.h" @interface ViewController () <N ...
- Android线程管理(三)——Thread类的内部原理、休眠及唤醒
线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...
- Flash网站Loading制作
Flash网站Loading制作~~~ stop(); stage.scaleMode=StageScaleMode.NO_SCALE; //指定舞台属性为不跟随播放器大小而改变 stage.show ...
- JavaScript Patterns 4.6 Immediate Object Initialization
( { // here you can define setting values // a.k.a. configuration constants maxwidth : 600, maxheigh ...
- SSL协议详解
背景介绍 最近在看<密码学与网络安全>相关的书籍,这篇文章主要详细介绍一下著名的网络安全协议SSL. 在开始SSl介绍之前,先给大家介绍几个密码学的概念和相关的知识. 1.密 ...
- SQL Server服务器名称与默认实例名不一致的修复方法
SQL Server服务器名称与默认实例名不一致的修复方法 分类: 个人累积 SQl SERVER 数据库复制2011-08-10 09:49 10157人阅读 评论(0) 收藏 举报 sql ser ...
- 第四篇 :微信公众平台开发实战Java版之完成消息接受与相应以及消息的处理
温馨提示: 这篇文章是依赖前几篇的文章的. 第一篇:微信公众平台开发实战之了解微信公众平台基础知识以及资料准备 第二篇 :微信公众平台开发实战之开启开发者模式,接入微信公众平台开发 第三篇 :微信公众 ...