司马牛忧曰:“人皆有兄弟,我独亡。”子夏曰:“商闻之矣:死生有命,富贵在天。君子敬而无失,与人恭而有礼。四海之内,皆兄弟也。君子何患乎无兄弟也?”《论语》:颜渊篇
百篇博客系列篇.本篇为:
v63.xx鸿蒙内核源码分析(文件系统篇)|用图书管理说文件系统
本篇讲一个大型图书馆的管理方案,来说清楚计算机文件系统是如何管理的.如果读懂了这个方案,就基本了解了文件系统最底层的运行机制.
假如给你一个100*100米,高10米的场地用于建图书馆,放置全世界的图书档案,有以下几个运营要求:
请问如果是你会如何设计这个图书馆并让它即安全又高效的运行.
有个叫小易的小伙子提出了一种解决方案:
将以上信息简化成树形图表示如下:
统计区用于统计整个图书馆和各大区的全局信息,这种信息非常的重要,被使用频率极高,就像问我们国家有多少人口一样,马上就要答出来,而不是让各省逐级汇报下加起来再回复.
这个区和统计区一样,是因为要高效的管理图书区而衍生出来的区.目录区和图书区所分配单元格数量是在图书馆开业那天就定下来了,填满图书区单元格的真正的图书,而谁也不知道会有些什么图书要进进出出,图书大小决定了单元格的使用情况,每本书会占用一张索引页,所以最后一定会出现两种情况:
完全可以把索引表看成是一本书,书的内容是一页一页的索引页,每一页记录一本书的索引信息,1000页就可以记录1000本书的索引信息,这本书也是要装到格子里的.装这本书的单元格叫索引表块.如果按1000万本书计算就会生成1000万张索引页,每个格子1000页,那么1000万/1000=1万,也就是说索引表这本书,需要1万个单元格来存放.索引页也有全局唯一且统一的编号,注意这个编号和单元格的编号是两码事,这是很多人搞不明白文件系统的关键所在,二者编号范围在统计区有保存.
大分区中三个分区(统计区,目录区,图书区)的排列格式是固定的.,所以很容易计算出某个分区下索引区块的开始和结束位置.这里假定索引表块在分区相对位置的第3000个单元格开始.
此时外部人员可凭条形码来取书.流程如下:
如果屌丝小王也想像小张一样,将爱书论程序员的自我修养捐给图书馆,流程又是怎样的呢
很明显需要增加两部分内容:
注意虽然索引页编号是按顺序编的,一个号接一个号的在索引表这本书里.但是图书馆运营久了有些书是会被销毁的,例如:条形码为200的delphi程序设计这本书太老太久没人借站着位置就被销毁了,但擦涂的是第200索引页上的记录,第200页这张纸还是存在的,一直在199-201页之间.擦洗干净了谁管你以前是干什么的,又可用于记录新书的索引信息.那么如何能快速的知道哪些索引页和图书区单元格没有被使用呢答案是:索引页位图块和图书区单元格位图块
可以把索引页位图看成是一本书,书的内容是一页一页的位图页,存放这本书的单元格叫索引页位图块.将位图页画成100*100的如下格子
010101011010110101010101110101010101101011101011010101010110101101011010101010101010110101010101101011010110101010110101101011010110101101010101011001110101101011010110101011010101010110101101011010101010101010110101010101101011010110101010110101101011011110101101010101010101110101101011010110010110101101010101011001110101101011010110101011010101010110101101011010101010101010....每一位代表一个索引页的使用情况,上面说了1000万本图书对应就会有1000万张索引页,而一张位图页能标识100100=1万张索引页的使用情况.总的计算公式就是:1000万索引页/(100100)=1千张位图页/1000=1个索引页位图块也就是说只需要一个格子就能装下1000万的索引占用情况.
同样的道理适用于图书区单元格位图块,它记录的是图书区单元格的使用情况.位图是最简单最高效的记录两种状态是否变更的方法.
有了以上的基础,小王捐书的流程就简单了.
能否用小易的方案记录以下这种信息关系
├──金庸小说全集(条形码:322)│├──射雕英雄传(条形码:1245)│├──神雕侠侣(条形码:23456)│├──鹿鼎记(条形码:34567)其实也是可以的金庸小说全集虽看似一个目录,但他们在索引区没有太多的区别,金庸小说全集目录同样有一张索引页,内容如下:
名称:金庸小说全集/大小:1页 数据块号:1单元格大小:1000页目录条形码:322捆绑数:17权限:(0755/drwxr-xr-x)用户ID:(10/小张)组ID:(2/技术部)Access:2021-08-0322:11:49.021942010-0700Modify:2021-07-2318:53:38.656550199-0700Change:2021-07-2318:53:38.656550199-0700数据块位置:15映射关系小易的方案基本是文件系统的底层实现.理解了这套方案对后续基于源码理解鸿蒙文件系统的实现会变得简单,图书馆系统和计算机文件系统概念映射关系如下
小易方案->ext文件系统画格子画分区过程->格式化(formate)图书馆营业->挂载(mount)大A区->块组(group)统计区->超级块(superblock)分区描述列表->块组描述符(GDT)索引表块->索引表(indextable)索引页->索引节点(inode)条形码->索引编号(inode.id)图书区位图块->数据块位图(Blocksbitmap)索引页位图块->索引位图(inodebitmap)单元格->逻辑块(Blocks)目录区->索引块(inodeBlocks)图书区->数据块(dateBlocks)问题思考一个问题
按功能模块:
鸿蒙研究站(weharmonyos)|每天死磕一点点,原创不易,欢迎转载,请注明出处。若能支持点赞更好,感谢每一份支持。