你手里有个硬盘,1T大小。
你还有一堆文件。
这些文件在硬盘视图中只是一堆二进制数据。
你准备把这些文件存储在硬盘上,需要的时候把它们读出来。
应该设计什么样的软件来更方便地读写硬盘中的这些文件?
首先我不想处理复杂的扇区,设备驱动等细节,所以我先实现了一个简单的功能,逻辑上把硬盘分成块,可以分块读写。
每个块定义为两个物理扇区的大小,即1024字节,也就是1KB。
硬盘太大,无法分析,我们假设你的硬盘只有1MB,这个硬盘有1024块。
好了,我们开始保存文件吧!
准备一份文件。
选任何一块放进去,第三块!
成功!第一次胜利!
再存一个文件!
呃?发现问题了。万一这个文件也保存在Block 3中,不是会覆盖原来的文件吗?不,必须有一个地方记录现在哪些区块是可用的,就像这样。
0:未使用
1:未使用
2:未使用
第3部分:已使用
第4块:未使用
...
块1023:未使用
让我们用block 0来记录所有block的使用情况!怎么录?
位图!
那么我们给block 0起个名字,叫block bitmap,然后这个block 0会用来记录所有块的使用情况,而不是存储具体的文件。
当我们保存一个新文件时,我们只需要在块位图中找到第一位0,然后我们就可以找到第一个未使用的块并保存文件。同时,不要忘记在块位图中设置相应的位置1。
完美!
接下来,让我们尝试读取刚才的文件。
呃?还有一个问题。我怎么才能找到刚才的文件?根据街区号?太蠢了。这就好比你去书店找一本书,店员要求你提供书号而不是书名,这显然是不合理的。
因此,我们给每个文件一个名字,叫做文件名,并通过它寻找这个文件。
必须有一个地方记录文件名和块号的对应关系,像这样。
向日葵收藏. txt: Block 3
数学期末复习资料。MP4:第五街区
低并发编程的秘密. pdf: Block 10
...
别急,既然要选择一个地方记录文件名,我们不妨多记录一些我们关心的信息,比如文件大小、文件创建时间、文件权限等。
自然,这些东西也要存在硬盘里。我们选择一个固定大小的空间来表示这些信息。多大空间?请给我28字节。
为什么是128字节?我很乐意。
我们称这种128字节的结构为inode。
之后我们每保存一个新文件,不仅要占用一个块来存储文件本身,还要占用一个inode来存储文件的元信息,这个inode的block number字段指向这个文件的块号。
如果一个索引节点是128字节,那么一个块可以容纳8个索引节点,我们可以对这些索引节点进行编号。
如果你觉得inode的数量不够,你也可以使用两个或者更多的块来存储inode信息,但是这样存储数据的块就少了。就看你自己的平衡了。
类似地,像块位图的使用一样,我们也需要一个inode位图来管理inode的使用。让我们把索引节点位图放在块1中!
同时,我们将inode信息放在块2中,其中有8个inode共存,因此我们的块2称为inode表。
现在,我们的文件系统结构变成了下面这样。
注意:块位图用于管理可用的块,每一位代表一个块的使用。索引节点位图逐个管理索引节点,而不是索引节点所占用的块。例如,如果上图中有8个inode,那么inode位图中有8位来管理它们的使用与否。
现在,我们的文件很小,一个街区就能装下。
但是如果需要两块,三块,四块呢?
很简单,我们只需要采用连续存储的方式,而inode只记录文件的第一块,以及后面需要多少块。
这种方法的缺点是容易留下大小孔洞。新文档到达后,很难找到合适的空白块,空间会被浪费。
这种方式好像行不通,怎么办?
既然inode中记录了文件的块号,为什么不扩展一下,记录更多的块呢?
最初,inode中只记录了一个块号。现在,展开它,记录8个块号!并且这些块不必是连续的。
嗯,这是一个可行的办法!
但这只能代表8块,能记录的最大文件是8K。现在文件很容易超过这个限制。我该怎么办?
很简单,我们可以将其中一个块作为间接索引。
这样一瞬间就有了263块。这种指标称为一级间接指标。
如果还不够,再弄一个一级间接索引或者二级间接索引的块。
我们的文件系统,暂时只有一级间接索引。硬盘只有1024块,一个文件263块就够大了。再大也是这么任性。爱不爱。
好了,现在可以保存大文件了,可以通过文件名和文件大小准确的读出来了!
但是我们必须不断进步。让我们想想这个文件系统有什么问题。
例如,我们如何知道inode的数量何时不够?需要在inode位图中查找吗?找不到就知道不够用?
同样,当块数不足时,也是如此。
如果有个全球的地方把这一切都记录下来就好了,方便随时调整,比如这个。
信息节点数量
空闲信息节点数量
块数
空闲块数
那我们再占用一个块来存储这些数据吧!因为他们似乎是从上帝的角度来描述这个文件系统,所以我们把它放在初始块上,称之为超级块。现在布局如下。
我们继续追求卓越。
现在,块位图、索引节点位图和索引节点表都占据了块1、块2和块3这三个位置。
如果inode数量太大,以至于inode表或inode位图需要占用多个块怎么办?
或者,随着块数的增加,块位图需要占用多个块。我该怎么办?
程序已经死了。如果你不告诉它哪个方块代表什么,它就不会自己去猜。
很简单。就像超级块记录信息一样,你可以选择一块来记录这些信息,这样你就不会害怕了。那么我们就选择紧接超级块之后的第一个块来记录这些信息,称之为块描述符。
当然,这些块号只记录起始块号,块位图、inode位图、inode表可以分别占用多个块。
好了,你完成了!
现在,让我们尝试保存另一批文件。
葵花宝典. txt
materials.mp4数学期末复习
许·
许·
许·
许·
低并发Programming.pdf的秘密
呃?这看起来不舒服。所有的文件都放平了。可以有等级关系吗?像这样
葵花宝典. txt
materials.mp4数学期末复习
住在妻子父母家的女婿
许·
许·
许·
许·
低并发Programming.pdf的秘密
我们称之为向日葵收藏。txt一个普通文件,我女婿一个目录文件。如果你想拜访我的女婿1.mp4,整个文件名应该写成
女婿/女婿1.mp4。
如何做到这一点?那么我们又要说inode结构了。
此时需要一个属性来区分这个文件是普通文件还是目录文件。
弥补缺失的东西。我们已经很熟悉了。我们添加一个4字节来表示文件类型。
如果是正常文件,这个inode指向的数据块还是和以前一样,也就是文件本身的完整内容。
但如果是目录文件,这个inode指向的数据块就需要重新规划了。
这个数据块应该是什么样子?它可以是指向彼此相邻的不同inode的结构,比如这样。
这样我们就可以先找到这个目录文件中的数据块。然后,根据该数据块中包含inode信息的结构,找到该目录中的所有文件。
完美!
但是,仔细想想。如果你想检查这个目录下的所有文件,并显示文件名和文件类型呢?
需要从inode表中取出每个结构所指向的inode,然后再取出文件名和文件类型,很浪费时间。
让用户看到一个目录下的所有文件是一个很常见的操作。
因此,最好将结构中的文件名和文件类型等常用信息放在数据块中。
同时,inode结构中的文件名似乎也没什么用。这种变长的东西在这种定长结构里很烦,早就想摆脱了。它还可以为其他信息节省空间,比如文件所在的块数组,这样就可以多一些。
太好了,摆脱它!
好了,你完成了。现在我们可以将文件分类到不同的目录中,也可以在目录中创建目录,无限娃娃!
现在的文件系统已经比较完善了,但是还是有一点点不适。
当我们访问一个目录时,我们可以很舒服地看到目录中的文件,然后根据它们的名称访问这个目录中的文件或目录。整个过程都是套路。
但是,顶层目录(即根目录)中的所有文件仍然需要通过遍历所有inode来获取。可以和上面的套路统一吗?
答案很简单。我们规定inode表中的数字0 inode表示根目录,所有访问都从这个根目录开始!
好了,没有了!
最后,让我们来欣赏一下我们的文件系统架构。
你觉得没什么大不了的。
但是这个愚蠢的东西,叫做文件系统。
附言
这个文件系统和linux上的经典文件系统ext2基本相同。
下面是我画的ext2文件系统的结构。
我猜你看不清楚。我来说说主要的异同点:
1.超级块前面是引导块,是PC联盟为硬盘指定的1KB独占空间,任何文件系统都不能使用。
2.EXT2文件系统首先将整个硬盘划分为许多块组,但如果只有一个块组,那么它将与我们文件系统的整体结构完全相同,即超级块、块描述符、块位图、inode位图、inode表和数据块。
3.在EXT2文件系统的inode表中,有15个块用于定位文件,其中第13个块是一级间接索引,14个是二级间接索引,15个是三级间接索引。
4.ext2文件系统有更多的文件类型,如块设备文件、字符设备文件、管道文件、套接字文件等。
5.EXT2文件系统的超级块、块描述符和inode表记录的信息更多,但核心和我们的文件系统是一样的,在后续的ext3和ext4中不断增加这些字段,保持向前兼容。
6.6.ext2文件系统的2号inode是根目录,而我们的系统是0号inode的根目录。这是非常武断的。你设计一个文件系统,设置一个187号inode作为根目录,没人拦你。
如果你想知道ext2文件系统的所有细节,有三种方法。
1.看源代码。linux1.0以后的源码有ext2文件系统的实现,源码最准确。
2.看官方文件。这里有一个pdf链接。
3.阅读高质量的博客。这里我推荐一个。
4.使用linux的mke2fs命令生成ext2文件系统的磁盘镜像,然后逐字节分析其格式。可以在微信官方账号回复ext2低并发编程获取我的图像分析文件。
如果看源代码和官方文档比较容易,当然我是提倡这两个的,因为毕竟是第一手资料。
但是大部分人可能做不到,有时候也没必要,所以也可以看一些有质量的博客。
入门,我觉得我这个是质量非常高的一个。它将带你理解你为什么从设计者的角度来设计文件系统。
如果介绍细节的话,别看那些连文件系统的格式和字段都写不正确的,所以我在这里良心推荐一个,也就是上面的第三种方式,你可以放心的逐字逐句的吃下去。
声明:本网转发此文章,旨在为读者提供更多信息资讯,所涉内容不构成投资、消费建议。文章事实如有疑问,请与有关方核实,文章观点非本网观点,仅供读者参考。
-
小崧股份:已推出多款适用于户外休闲活动的露营灯等产品证券E公司消息,萧山股份在互动平台上表示,公司关注到公司目前在同花顺有“露营经济”的概念标签。根据户外休闲、旅行和露营爱好者的需求,公司推出了许多适合户外休闲活动的...
-
三星GalaxyTabS8FE平板现身Geekbench网站感谢IT家庭用户在华南吴彦祖的线索传递!去年5月,三星发布了GalaxyTabS7FE平板电脑。此后,又有消息称三星将发布型号为SM-X500和SM-X506B的三...
-
我国粗钢产量超全球半数应加快推进低碳改造目前,中国钢铁行业碳减排正在有序推进。中钢协数据显示,截至7月底,全国共有251家钢企完成或正在实施超低排放改造,粗钢产能约6.81亿吨。据不完全统计,国内钢企超低...
-
微星发布英特尔Z790主板:2299元起,GODLIKE采用今天微星发布了IntelZ790系列电竞主板,包括MEG、MPG、MAG系列。梅格Z790神一样MEGZ790GODLIKE采用26+2相DuetRail供电系统和...
-
英特尔13代酷睿桌面处理器发布:24核心/5.8GHz,多线在今天的英特尔技术创新峰会上,英特尔发布了第13代英特尔酷睿处理器产品家族。IT之家了解到,英特尔的第13代英特尔酷睿产品家族包括六个不锁频的台式机处理器,多达24...
-
甲骨文Oracle董事长和CEO上一财年总薪酬均超1.3亿美据《华尔街日报》报道,由于甲骨文公司去年决定给予高管更多时间来赚取股票期权,甲骨文高管再次跻身美国大公司薪酬最高的高管之列。甲骨文在上周五的年度委托书声明中称,在截...
-
纺织服装板块走势活跃,真爱美家等涨停,联发股份两连板27日,纺织板块呈现盘中活跃态势。截至发稿,新奥股份、邦杰股份、真爱美佳股份、联发股份等涨停。,巨杰超细纤维涨幅超过8%,梦洁股价涨幅超过7%。值得注意的是,联发股...
-
港交所迎来首个长租企业魔方递交招股书丨长租·探索者9月26日,魔方生活服务集团提交了在HKEx的招股说明书,摩根士丹利和建银国际为联席保荐人。财务上,截至2019年底、2020年底、2021年底,魔方生活服务集团收...
-
行业估值不友好、股价长期破发,军信股份董事长、副董事长抛增持图片来源:图虫近期,新股破发现象时常出现,不过集中在高市盈率、高估值的板块中。不过,作为长期低估值的军信股份(301109.SZ),仍未能逃脱长期破发的命运,这也引...
-
9月26日龙虎榜,机构青睐这11股9月26日,上证综指下跌1.20%。盘后数据显示,该机构出现在18只股票的名单中,净买入11只,净卖出7只。沪股通席位出现在五只股票的名单中。证券牛;据统计,9月2...
- 以数字化推动绿色城市更新,龙湖荣获“最佳城市运营商”
2022-09-28 15:07:00
- WindowsPhone模拟器上线GitHub,可在安卓手机上玩
2022-09-28 15:07:00
- 微软XboxElite无线控制器2代配件包上架,售价419元
2022-09-28 15:07:00
- 两种用Excel创建目录的妙招
2022-09-28 15:06:00
- 中控横电首套国产风机主控系统投运
2022-09-28 15:06:00
- 银行业二季度消费投诉透视:交行投诉量居国有大行第一
2022-09-28 15:06:00
- AI术士炼肛记:程序员开源“肛珠作弊”代码寻天选之子体验
2022-09-28 15:06:00
- 万荣县人民医院院长:巩固脱贫攻坚成果与乡村振兴有效衔接防范群众因
2022-09-28 15:05:00
- 银保监会:二季度保险消费投诉人身保险占六成以上
2022-09-28 15:05:00
- 中东第一站,哪吒汽车进军以色列市场
2022-09-28 15:05:00