经过进一步的阅读代码,现昨天的一些观点似乎有些问题,把我的一些结论贴出来,请师兄指正。

1.在函数 exfs_blocklayout_get()中,有如下代码

Exfs_alloc_blocks()定义如下:

这里面涉及到三个概念

Blocks;segment blocks; alloc_bits;

这三个概念在代码中如下注释

Blocks是物理磁盘块,大小为4K

Segment是三级间址的粒度(和郭博交流后得出的结论,不是非常确定),默认大小是64k

Alloc bits 是描述每次layout分配的粒度参照值为1M

则 segment_length ==1 << allocbits << segment bits << 12(即为block bits)

造成之前的误解,主要是segment_length命名导致将其理解为 1 << segment bits << 12(即为blockbits);

最好改为alloc_length;

2在函数exfs_blocklayout_get()中,把要分配的长度截取为一个一个的segment_length之后,调用下面这个函数;

Exfs_get_blocknr_offset()入口参数是经过处理的被分配线性地址尾部的逻辑块的块号。

在 Exfs_get_blocknr_offset()中,

Segno是通过把iblock(逻辑块号)转换为以segment为粒度的偏移(如果把segment称为段,则为段号)

Exfs_block_to_path()函数是把此段号转换为三级间址编码,将每一级的偏移量放到offset[4]数组中。

其代码如下:

其中,各变量含义如下

ptrs:一个物理块上可以存放多少个物理地址。

ptrs_bits :ptrs有多少位 相等于sizeof(ptrs)

direct_blocks:三级间址的数组中,表示直接地址的数量

indirect和double分别代表二级和三级的数量。

若一个地址需要三级索引来表示。

offset[0]= EXFS_TIND_BLOCK;在i_data[]数组中的偏移量,即为三间址的一级地址

offset[1] 表示的是在第一级中的偏移量

offset[2]表示 第二级中的偏移量

offset[3]表示的是第三级中的偏移量

回到Exfs_get_blocknr_offset()函数,

此函数中,根据offset[] 和depth,解析三级间址,并把物理地址存到一个chain[]中,chain[]的类型为

typedef struct {

u32     *p;

u32     key;

struct buffer_head *bh;

} Indirect

其中,bh 指向间接索引块的内存缓存,p 指向此索引块中的某一个entry(一个entry对应一个物理块地址),而KEY的值为物理块(或者应该叫物理segment)的地址。

若exfs_get_branch()发现当前的逻辑地址已经在三级间址中,则返回NULL;否则返回查找过程的断点(即为现在文件的末尾),然后由后面的代码完成真正的分配。

EXFS的块分配策略相关推荐

  1. Kafka 原理以及分区分配策略剖析

    欢迎关注方志朋的博客,回复"666"获面试宝典 ‍ ‍一.简介‍ ‍ Apache Kafka 是一个分布式的流处理平台(分布式的基于发布/订阅模式的消息队列[Message Qu ...

  2. 《深入理解Java虚拟机》-----第3章 垃圾收集器与内存分配策略

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来. 3.1 概述 说起垃圾收集(Garbage Collection,G ...

  3. 《深入理解java虚拟机》笔记2——GC算法与内存分配策略

    说起垃圾收集(Garbage Collection, GC),想必大家都不陌生,它是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行在JVM上的语言,如Sca ...

  4. 深入理解JVM(2)——GC算法与内存分配策略

    说起垃圾收集(Garbage Collection, GC),想必大家都不陌生,它是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行在JVM上的语言,如Sca ...

  5. Memcache 内存分配策略和性能(使用)状态检查

    一直在使用Memcache,但是对其内部的问题,如它内存是怎么样被使用的,使用一段时间后想看看一些状态怎么样?一直都不清楚,查了又忘记,现在整理出该篇文章,方便自己查阅.本文不涉及安装.操作.有兴趣的 ...

  6. JVM学习笔记之-堆,年轻代与老年代,对象分配过程,Minor GC、Major GC、Full GC,堆内存大小与OOM,堆空间分代,内存分配策略,对象分配内存,小结堆空间,逃逸分析,常用调优工具

    堆的核心概述 概述 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域.Java堆区在JVM 启动的时候即被创建,其空间大小也就确定了.是JVM管理的最大一块内存空间. 堆内存的大小是可 ...

  7. 操作系统:第三章 内存管理2 - 详解虚拟内存,页面置换算法,页面分配策略

    本文已收录至 Github(MD-Notes),若博客中有图片打不开,可以来我的 Github 仓库:https://github.com/HanquanHq/MD-Notes,涵盖了互联网大厂面试必 ...

  8. JAVA虚拟机之垃圾收集与内存分配策略

    最近再看<深入理解JAVA虚拟机>周志明写的第二版.现将学习笔记分享出来,方便日后复习,理解有误的地方欢迎指正! 1.运行时数据区: 程序计数器:一块较小的内存空间,保存当前线程所执行的字 ...

  9. jvm(3)-垃圾收集器与内存分配策略

    [0]README 0.1)本文部分文字转自:深入理解jvm,旨在学习 垃圾收集器与内存分配策略 的基础知识: [1]垃圾回收概述 1)GC(Garbage Collection)需要完成的3件事情: ...

最新文章

  1. 如何添加ORACLE 的 ODBC
  2. cookie的路径和域
  3. How to Analyze Java Thread Dumps--reference
  4. 分享十佳Web开发资源
  5. AngularJS从入门到实践(一)
  6. FLutter入门:异步加载组件FutureBuilder
  7. 使用密钥加密码加密_创建基于密码的加密密钥
  8. bazel 链接_bazel-链接第三方动态库,静态库。
  9. 有符号数与无符号数间的转换
  10. win7+cuda8.0+cudnn6.0+tensorflow-gpu1.3.0安装过程总结
  11. 浅谈OWASP TOP 10
  12. Hive--sql中的explode()函数和posexplode()函数
  13. mysql安装包下载与检核
  14. 风车im即时通讯源码
  15. 拳王虚拟项目公社:如何搭建虚拟资源解析站,全自动化卖会员网络赚钱项目
  16. 微博 用户画像_用户画像实例:创建可信的微博用户画像
  17. win10开机内存占用过高
  18. 景区宣传片制作的作用
  19. 电子邮件协议---SMTP,POP3,IMAP,MIME
  20. 百度代码配置化实践:配置化是业务架构三化之一

热门文章

  1. ur机器人编程-程序流程
  2. ECHAP:身份认证的安全协议
  3. 回首2019,瞻仰2020
  4. MaxCompute SQL大数据公开数据集实战
  5. 量子计算机需要消耗什么能量,量子计算机的功效如何?
  6. 微信小程序开发之——个人中心-个人资料修改(7)
  7. su oracle是什么意思,su 命令 以及 su oracle 与su - oracle 命令区别
  8. Zabbix Trapper items
  9. JAVA基础Day01
  10. 难过!能不能放下抢票套路,我只想买好好回家过年!我在网上抢火车票:多加了100元的加速包,却依然买不到票...