文件系统的核心问题是存储。这里面隐含2个问题:1)存储什么?2)存储到哪里?文件系统中的各种技术手段都是如何高效的解决这2个问题。ubifs用node标准化每一个存储对象,用lprops描述每一个逻辑块空间,用TNC组织管理所有的node对象,用LPT组织管理所有的lprops对象。
 
node
          ubifs中除了存储用户数据,还要存储索引节点、目录项、超级块等数据。这些数据结构各异,差异很大,为了统一数据视图,便于管理,ubifs标准化了所有数据的表现形式,所有数据以node表示呈现。并根据不同用途对node进行分类、存储和组织。ubifs的node汇总介绍如下。
          黑色部分为通用的文件系统数据,红色部分为ubifs专有的文件系统数据。

TNC
          因为 UBIFS_INO_NODE,UBIFS_DATA_NODE,UBIFS_DENT_NODE,UBIFS_XENT_NODE,UBIFS_TRUN_NODE节点数量巨大,ubifs采用 B+树用于管理这些节点。各节点在树中的index为(inode, key2),如上图所示,不同的node有不同的key2。其目的就是能根据index快速找到叶节点数据所在的位置,但是B+树的index节点数量多,更新很慢,如果这个过程中被打断,叶节点文件就丢失了。所以在commit tnc前,先把叶节点文件的数据信息commit到log区,这样既提高了速度,也保证在tnc commit失败的情况下,叶节点文件也能通过log区找到,并replay到tnc。
 
journal replay

          从数据的角度看,recovery的过程就是将(leb, offs) list进过加工处理,映射成{key: [leb, offs, len]} B+tree的过程。
          日志回放的详细过程如下:
          从log区中获取ref node((leb, offs) ),从ref node获取bud所在位置信息(leb:offs),构造内存对象bud,并根据此信息 scan这一段leb,筛选出无效的node,将有效的node加入sleb->nodes,以备后面replay,如果是最后一个bud并需要recovery,将leb:0-offs这段异地备份到另一个peb上。
把sleb->nodes上的node处理成replay_entry,并加入到c->replay_list,然后根据replay_list,构造成ubifs_zbranch({key: [leb, offs, len]})对象更新到TNC B+树上,然后将已replay的buds leb块的free和dirty空间、dirty标记等lprop属性信息
 
sync
          如果在unclean reboot前,没有调用sync,buf中的数据由于没有同步到flash,将可能破坏ubifs文件系统。
          sync会调用ubifs_run_commit进行所有的数据提交。
          如果调用sync过程中断电,
          如果在wbuf commit前或者过程中断电,文件将丢失,这需要应用层主动调用sync来保证。但wbuf commit很快,这是小概率事件;
          如果在log commit前断电,文件将丢失,这需要应用层主动调用sync来保证。
          如果在log commit过程中断电,文件还是会丢失。但log commit很快,这是小概率事件;
          其他情况下,比如gc commit前、或者tnc commit前或者过程中断电,文件不会丢失,因为可以从log区replay。
 
lprops
          ubifs用node对象解决存储对象的问题,用lprops对象解决存储位置问题。要决定新的对象存储到哪里,就需要获取整个存储空间的使用视图数据以辅助决策。
          lprops对象用(lnum,free,dirty)元组信息完成对一个逻辑块的使用视图的描述。通过把所有的lprops对象组织成LPT B+tree,可以快速查询更新某个lnum逻辑块的使用视图信息。因为LPT的key是lnum,所有无法快速查询到most free或most dirty的逻辑块,在这种需求基础上,ubifs对lprops进行分类组织,满足对free lnum(空间分配)或dirtry lnum(垃圾回收)的快速查询需求。
 
 
LPT
          lpt B+tree用于管理ubifs逻辑块属性对象 lprops,B+tree的index为lnum。其目的就是根据lnum,快速查询、更新逻辑块的信息(主要是free、dirty等信息)。
 
--EOF--
 

ubifs核心对象 -- TNC和LPT的更多相关文章

  1. Asp.Net WebApi核心对象解析(下篇)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

  2. ASP.NET Core的路由[2]:路由系统的核心对象——Router

    ASP.NET Core应用中的路由机制实现在RouterMiddleware中间件中,它的目的在于通过路由解析为请求找到一个匹配的处理器,同时将请求携带的数据以路由参数的形式解析出来供后续请求处理流 ...

  3. Asp.Net WebApi核心对象解析(上篇)

    生活需要自己慢慢去体验和思考,对于知识也是如此.匆匆忙忙的生活,让人不知道自己一天到晚都在干些什么,似乎每天都在忙,但又好似不知道自己到底在忙些什么.不过也无所谓,只要我们知道最后想要什么就行.不管怎 ...

  4. Three.js 入门指南(核心对象)

    推荐大家可以看看这个:http://wenku.baidu.com/link?url=RQU2exzV_EF3GATc3bzQU2o9LGMuCmiN5nUJth5SLG3E2TrxtBLQodJU_ ...

  5. Ajax的核心对象创建步骤

    * Ajax具有核心对象 * XMLHttpRequest对象 * 如何创建XMLHttpRequest对象 function getXhr(){ // 声明XMLHttpRequest对象 var ...

  6. 我心目中的Asp.net核心对象

    转:http://www.cnblogs.com/fish-li/archive/2011/08/21/2148640.html 阅读目录 开始 HttpRuntime HttpServerUtili ...

  7. 路由系统的核心对象——Router

    路由系统的核心对象--Router ASP.NET Core应用中的路由机制实现在RouterMiddleware中间件中,它的目的在于通过路由解析为请求找到一个匹配的处理器,同时将请求携带的数据以路 ...

  8. ASP.NET Ajax核心对象

    本章学习目标 主要掌握AJAX的基本概念和实现机制,学习并创建XMLHttpRequest对象,使用XMLHttpRequestObject对象获取服务器端的数据 主要内容如下,请点击ASP.NET ...

  9. ASP.NET Web API的核心对象:HttpController

    ASP.NET Web API的核心对象:HttpController 对于ASP.NET Web API来说,所谓的Web API定义在继承自ApiController的类中,可能ApiContro ...

随机推荐

  1. 与你相遇好幸运,Sails.js自定义数据库名

    在/api/models/下,自定义的.js文件内容 module.exports = { tableName: '自定义的数据库名',  autoCreatedAt: false, //关闭  au ...

  2. ExcelReport第三篇:扩展元素格式化器

    导航 目   录:基于NPOI的报表引擎——ExcelReport 上一篇:ExcelReport源码解析 概述 上篇中已介绍了ExcelRepor的架构,本篇将通过例子讲述如何扩展元素格式化器以满足 ...

  3. MVC4 使用概述

    1.Bundle使用: http://www.cnblogs.com/inline/p/3897256.html 2.MVC总结: http://www.cnblogs.com/xlhblogs/ar ...

  4. Babelfish(二分查找,字符串的处理略有难度,用sscanf输入)

    Babelfish Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 28581   Accepted: 12326 题目链接: ...

  5. 理解JavaScript中的事件处理

    什么是事件? 事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水.当我们与浏览器中 Web 页面进行某些类型的交互时,事件就发生了.事件可能是用户在某些内容上的点击 ...

  6. 限制非安全IP访问

    这个是一个检测ip是否非法的php函数,适应于白名单,黑名单功能开发,主要场景应用于:api来源限制,访问限制等. /** * 安全IP检测,支持IP段检测 * @param string $ip 要 ...

  7. linux文本模式下使用PPPOE拨号ADSL上网的方法

    转自:http://www.myzhenai.com.cn/post/945.html 转载请注明出处:http://www.myzhenai.com/thread-15431-1-1.html ht ...

  8. Debian 的 preinst, postinst, prerm, 和 postrm 脚本

    转自:http://jianjian.blog.51cto.com/35031/395468 这些是软件包安装前后自动运行的可执行脚本. 统称为控制文件, 是 Deian 软件包的"控制&q ...

  9. ViewPager onPageChangeListener总结(转)

    android ViewPager滑动事件讲解 今天在做项目的时候,由于要处理viewPager页面滑动的事件,所以对其进行了一个小小的研究: 首先ViewPager在处理滑动事件的时候要用到OnPa ...

  10. Codeforces Round #130 (Div. 2) C. Police Station

    题目链接:http://codeforces.com/contest/208/problem/C 思路:题目要求的是经过1~N的最短路上的某个点的路径数 /  最短路的条数的最大值.一开始我是用spf ...