本篇包括三个部分: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源码分析之文件读写过程的更多相关文章

  1. MyBatis 源码分析 - 映射文件解析过程

    1.简介 在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程.由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因.所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来, ...

  2. Yii2 源码分析 入口文件执行流程

    Yii2 源码分析  入口文件执行流程 1. 入口文件:web/index.php,第12行.(new yii\web\Application($config)->run()) 入口文件主要做4 ...

  3. Spring Ioc源码分析系列--Bean实例化过程(一)

    Spring Ioc源码分析系列--Bean实例化过程(一) 前言 上一篇文章Spring Ioc源码分析系列--Ioc容器注册BeanPostProcessor后置处理器以及事件消息处理已经完成了对 ...

  4. Spring源码分析之`BeanFactoryPostProcessor`调用过程

    前文传送门: Spring源码分析之预启动流程 Spring源码分析之BeanFactory体系结构 本文内容: AbstractApplicationContext#refresh前部分的一点小内容 ...

  5. Spring Ioc源码分析系列--Bean实例化过程(二)

    Spring Ioc源码分析系列--Bean实例化过程(二) 前言 上篇文章Spring Ioc源码分析系列--Bean实例化过程(一)简单分析了getBean()方法,还记得分析了什么吗?不记得了才 ...

  6. tomcat8 源码分析 | 组件及启动过程

    tomcat 8 源码分析 ,本文主要讲解tomcat拥有哪些组件,容器,又是如何启动的 推荐访问我的个人网站,排版更好看呦: https://chenmingyu.top/tomcat-source ...

  7. MyBatis 源码分析 - SQL 的执行过程

    * 本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程.该过程本身比较复杂,牵涉到的技术点比较多.包括但不限于 Mapper 接口代理类的生成.接口方法的解析.SQL 语句的解析 ...

  8. Tornado源码分析 --- 静态文件处理模块

    每个web框架都会有对静态文件的处理支持,下面对于Tornado的静态文件的处理模块的源码进行分析,以加强自己对静态文件处理的理解. 先从Tornado的主要模块 web.py 入手,可以看到在App ...

  9. Spark 源码分析 -- task实际执行过程

    Spark源码分析 – SparkContext 中的例子, 只分析到sc.runJob 那么最终是怎么执行的? 通过DAGScheduler切分成Stage, 封装成taskset, 提交给Task ...

随机推荐

  1. iOS启动图和开屏广告图,类似网易

    iOS启动图和开屏广告图,类似网易 启动图是在iOS开发过程中必不可少的一个部分,很多app在启动图之后会有一张自定义的开屏广告图,点击该广告图可以跳转到广告图对应的页面.今天呢,和大家分享一下如何添 ...

  2. 弃用的异步get和post方法之Block方法

    #import "ViewController.h" #import "Header.h" @interface ViewController () <N ...

  3. iOS-协议与代理<转>

    代理,又称委托代理(delegate),是iOS中常用的设计一种模式.顾名思义,它是把某个对象要做的事情委托给别的对象去做.那么别的对象就是这个对象的代理,代替它来打理要做的事.反映到程序中, 首先要 ...

  4. 快速与MySQL交互,使用XMAPP打开MySQL数据库,并用shell进行与MySQL交互<Window 10>

    1.如果想要通过XAMPP shell登录MySQL,还需要下载安装好XAMPP. 2.双击打开xampp-control.exe,会出现以下界面,点击开启Apache和MySQL,这样我们就开启服务 ...

  5. 关于Assets.car素材问题

    最近在做自己的第一个App,由于全程都是自己一个人完成,所以原型设计.素材都得自己找,自己改.遇到了提取Assets.car中的素材的问题,通过网络找到了2中解决方法: themeEngine 使 用 ...

  6. 深入理解java虚拟机(4)---类加载机制

    类加载的过程包括: 加载class到内存,数据校验,转换和解析,初始化,使用using和卸载unloading过程. 除了解析阶段,其他过程的顺序是固定的.解析可以放在初始化之后,目的就是为了支持动态 ...

  7. log4net资料收集

    Log4net 日志使用介绍 http://www.cnblogs.com/jys509/p/4699813.html log4net Tutorial http://www.codeproject. ...

  8. 完全卸载VS2005或VS2008的步骤

    手动卸载步骤: Visual Studio Express Editions 进入控制面板,运行添加或删除程序  卸载 "MSDN Library for Visual Studio 200 ...

  9. oracle序列

    一.序列 序列是oracle用来生产一组等间隔的数值.序列是递增,而且连续的.oracle主键没有自增类型,所以一般使用序列产生的值作为某张表的主键,实现主键自增.序列的编号不是在插入记录的时候自动生 ...

  10. 不用synchronized块的话如何实现一个原子的i++?

    上周被问到这个问题,没想出来,后来提示说concurrent包里的原子类.回来学习一下. 一.何谓Atomic? Atomic一词跟原子有点关系,后者曾被人认为是最小物质的单位.计算机中的Atomic ...