本篇讲一个大型图书馆的管理方案,来说清楚计算机文件系统是如何管理的.如果读懂了这个方案,就基本了解了文件系统最底层的运行机制.
假如给你一个100*100米,高10米的场地用于建图书馆,放置全世界的图书档案,有以下几个运营要求:
请问如果是你会如何设计这个图书馆?并让它即安全又高效的运行.
有个叫小易的小伙子提出了一种解决方案:
将以上信息简化成树形图表示如下:
└─图书馆 => 共 640万个单元格,平均被分成八大战区
├─大A区 => 80万单元格
│ ├─图书区 => 78万个单元格
│ ├─目录区 => 19000个单元格
│ │ ├─图书区单元格位图块 => 90个单元格
│ │ ├─索引表块 => 18900 个单元格
│ │ │ ├─A文件索引页 => 信息登记表,占一页纸,描述一本书的名称,权限,时间 ==
│ │ │ ├─...
│ │ │ └─B目录索引页
│ │ └─索引页位图块 => 10个单元格
│ └─统计区 (1000) => 记录图书馆和各分区的全局信息,使用频率高
└─大B区
├─图书区
├─目录区
│ ├─图书区单元格位图块
│ ├─索引表块
│ │ ├─A文件索引页
│ │ ├─...
│ │ └─B目录索引页
│ └─索引页位图块
└─统计区
...
请务必理解这些概念关系,在脑海中形成脑图,这是后续理解整个文件系统如何运作和管理的最关键底层逻辑.以下一一展开说明这些概念.
因为需求是图书大小没有限制,差别极大,有的书大到上千万页,有的小到只有一页.是个开放问题,需要在空间和时间上进行取舍,不想浪费时间就得浪费空间.没有边界就不方便做特殊处理,这需要标准化的统一管理.如何标准化? 答案是: 建相同的格子
至于是大格子还是小格子可以灵活,但必须是一样尺寸的.小易建了 0.250.250.25米的标准格,可放1000页(1K页)书的,所有图书都是统一按页数放,放满1000页就换个格子放剩下的. 格子是图书的关系是(N:1)的关系,即一本书可以分多个格子放,但一个格子中不能放两本不一样的书. 没错,其中就会存在浪费的问题,但浪费就是浪费了. 表现如下:
统计区用于统计整个图书馆和各大区的全局信息,这种信息非常的重要,被使用频率极高,就像问我们国家有多少人口一样,马上就要答出来,而不是让各省逐级汇报下加起来再回复.
整个图书馆的全局信息包括:
整个图书馆的全局信息包括:
战区数: 8
战区名称: A区,B区 ...
单元格的总数: 640W
已用单元格: 330W
剩余单元格: 310W
战区单元格范围: A区(0 ~ 799999),B区(800000 ~ ...) ....
索引页编号:A区(0~99999),B区(100000 ~ ...)
图书馆的创建时间:1921年 xx月
图书馆的名称: 世界图书馆
历史大事件: 1949年....
1956年....
列表描述各大分区基本信息
A分区 基本信息...
B分区 基本信息...
C分区 基本信息...
各分区全局信息包括
战区名称: A区
战区范围: (0 ~ 799999)
单元格的总数: 80W
已用单元格: 20W
剩余单元格: 60W
数据块总数:78W
索引块总数:19000
....
统计区的信息会非常的多,可以理解为也是一本本的书,有固定的格式,同样放在单元格中. 再次说明下本篇说的任何信息最后都是放在单元格中的,理解这点很关键!
这个区和统计区一样,是因为要高效的管理图书区而衍生出来的区.目录区和图书区所分配单元格数量是在图书馆开业那天就定下来了,填满图书区单元格的真正的图书,而谁也不知道会有些什么图书要进进出出,图书大小决定了单元格的使用情况,每本书会占用一张索引页,所以最后一定会出现两种情况:
完全可以把索引表看成是一本书,书的内容是一页一页的索引页,每一页记录一本书的索引信息,1000页就可以记录1000本书的索引信息,这本书也是要装到格子里的.装这本书的单元格叫索引表块. 如果按1000万本书计算 就会生成1000万张索引页, 每个格子1000页,那么 1000万/1000 = 1万 ,也就是说 索引表这本书,需要1万个单元格来存放. 索引页也有全局唯一且统一的编号,注意这个编号和单元格的编号是两码事,这是很多人搞不明白文件系统的关键所在,二者编号范围在统计区有保存.
大分区中三个分区(统计区,目录区,图书区)的排列格式是固定的.,所以很容易计算出某个分区下索引区块的开始和结束位置.这里假定索引表块在分区相对位置的第3000个单元格开始.
此时外部人员可凭条形码来取书.流程如下:
名称: 编程珠玑
大小: 14284页 占用图书区总格子数: 15 单元格大小: 1000页 属于普通文件
条形码: 5300 捆绑数: 2人
权限: (0644/-rw-r-----) 用户ID: ( 10/ 小张) 组ID: (2/ 技术部)
访问时间: 2021-07-24 02:07:21.683190622 -0700
修改书籍时间: 2021-07-21 00:17:34.733766830 -0700
修改索引时间: 2021-07-29 01:20:14.314343117 -0700
图书区存放位置:12,32,45,....980
欢迎大家关注公众号<程序猿百晓生>,可以了解到一下知识点。
`欢迎大家关注公众号<程序猿百晓生>,可以了解到一下知识点。`
1.OpenHarmony开发基础
2.OpenHarmony北向开发环境搭建
3.鸿蒙南向开发环境的搭建
4.鸿蒙生态应用开发白皮书V2.0 & V3.0
5.鸿蒙开发面试真题(含参考答案)
6.TypeScript入门学习手册
7.OpenHarmony 经典面试题(含参考答案)
8.OpenHarmony设备开发入门【最新版】
9.沉浸式剖析OpenHarmony源代码
10.系统定制指南
11.【OpenHarmony】Uboot 驱动加载流程
12.OpenHarmony构建系统--GN与子系统、部件、模块详解
13.ohos开机init启动流程
14.鸿蒙版性能优化指南
.......
如果屌丝小王也想像小张一样,将爱书论程序员的自我修养捐给图书馆,流程又是怎样的呢?
很明显需要增加两部分内容:
注意虽然索引页编号是按顺序编的,一个号接一个号的在索引表这本书里.但是图书馆运营久了有些书是会被销毁的,例如: 条形码为200的delphi程序设计这本书太老太久没人借站着位置就被销毁了,但擦涂的是第200索引页上的记录, 第200页这张纸还是存在的,一直在 199 - 201 页之间. 擦洗干净了谁管你以前是干什么的, 又可用于记录新书的索引信息.那么如何能快速的知道哪些索引页和图书区单元格没有被使用呢? 答案是: 索引页位图块 和 图书区单元格位图块
可以把索引页位图看成是一本书,书的内容是一页一页的位图页,存放这本书的单元格叫 索引页位图块.
将 位图页 画成 100*100的如下格子
010101011010110101010101110101010101101011
101011010101010110101101011010101010101010
110101010101101011010110101010110101101011
010110101101010101011001110101101011010110
101011010101010110101101011010101010101010
110101010101101011010110101010110101101011
011110101101010101010101110101101011010110
010110101101010101011001110101101011010110
101011010101010110101101011010101010101010
....
每一位代表一个索引页的使用情况,上面说了1000万本图书对应就会有1000万张索引页,而一张位图页能标识100100=1万张索引页的使用情况.
总的计算公式就是:
1000万索引页/(100100)=1千张位图页/1000=1个索引页位图块
也就是说只需要一个格子就能装下1000万的索引占用情况.
同样的道理适用于 图书区单元格位图块,它记录的是图书区单元格的使用情况.位图是最简单最高效的记录两种状态是否变更的方法.
有了以上的基础,小王捐书的流程就简单了.
名称: 论程序员的自我修养
大小: 9888页 数据块号: 10 单元格大小: 1000页 属于普通文件
条形码: 9527 硬链接数: 1人
权限: (0644/-rw-r-----) 用户ID: ( 4/ 屌丝小王) 组ID: (2/ 技术部)
访问时间: 2021-08-04 03:07:21.683190622 -0700
修改书籍时间: 2021-08-04 00:45:34.733766830 -0700
修改索引时间: 2021-08-04 01:20:14.314343117 -0700
数据块位置:3,89,765,...
能否用小易的方案记录以下这种信息关系?
├── 金庸小说全集 (条形码:322 )
│ ├── 射雕英雄传 (条形码:1245 )
│ ├── 神雕侠侣 (条形码:23456 )
│ ├── 鹿鼎记 (条形码:34567 )
其实也是可以的金庸小说全集虽看似一个目录,但他们在索引区没有太多的区别,金庸小说全集目录同样有一张索引页,内容如下:
名称: 金庸小说全集/
大小: 1页 数据块号: 1 单元格大小: 1000页 目录
条形码: 322 捆绑数: 17
权限: (0755/drwxr-xr-x) 用户ID: ( 10/ 小张) 组ID: (2/ 技术部)
Access: 2021-08-03 22:11:49.021942010 -0700
Modify: 2021-07-23 18:53:38.656550199 -0700
Change: 2021-07-23 18:53:38.656550199 -0700
数据块位置:15
小易的方案基本是文件系统的底层实现.理解了这套方案对后续基于源码理解鸿蒙文件系统的实现会变得简单, 图书馆系统和计算机文件系统概念映射关系如下
小易方案 - > ext 文件系统
画格子画分区过程 - > 格式化(formate)
图书馆营业 - > 挂载(mount)
大A区 - > 块组(group)
统计区 - > 超级块(super block)
分区描述列表 - > 块组描述符(GDT)
索引表块 - > 索引表(index table)
索引页 - > 索引节点(inode)
条形码 - > 索引编号(inode.id)
图书区位图块 - > 数据块位图(Blocks bitmap)
索引页位图块 - > 索引位图(inode bitmap)
单元格 - > 逻辑块(Blocks)
目录区 - > 索引块(inode Blocks)
图书区 - > 数据块(date Blocks)
思考一个问题
如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。