1kb等于多长个扇区 1kb等于多长字节( 二 )


假如还嫌不够,就再弄一个块做一级间接索引,或者做二级间接索引(二级间接索引则可以多出 256 * 256 - 1 个块) 。
【1kb等于多长个扇区 1kb等于多长字节】我们的文件系统,暂且先只弄一个一级间接索引 。硬盘一共才 1024 个块,一个文件 263 个块够大了 。再大了不答应,就这么任性,爱用不用 。
好了,现在我们已经可以保存很大的文件了,并且可以通过文件名和文件大小,将它们正确读取出来啦!
但我们得精益求精,我们再想想看这个文件系统有什么毛病 。
比如,inode 数量不够时,我们是怎么得知的呢?是不是需要在 inode 位图中找,找不到了才知道不够用了?
同样,对于块数量不够时,也是如此 。
要是有个全局的地方,来记录这一切,就好了,也方便随时调整,比如这样
inode 数量
空闲 inode 数量
块数量
空闲块数量
那我们就再占用一个块来存储这些数据吧!由于他们看起来像是站在上帝视角来描述这个文件系统的,所以我们把它放在最开始的块上,并把它叫做超级块,现在的布局如下 。
我们继承精益求精 。
现在,块位图、inode 位图、inode 表,都是是固定地占据这块 1、块 2、块 3 这三个位置 。
如果之后 inode 的数量很多,使得 inode 表或者 inode 位图需要占据多个块,怎么办?
或者,块的数量增多(硬盘本身大了,或者每个块变小了),块位图需要占据多个块,怎么办?
程序是死的,你不告诉它哪个块表示什么,它可不会自己猜 。
很简朴,与超级块记录信息一样,这些信息也选择一个块来记录,就不怕了 。那我们就选择紧跟在超级块后面的 1 号块来记录这些信息吧,并把它称之为块描述符 。
当然,这些所在块号只是记录起始块号,块位图、inode 位图、inode 表分别都可以占用多个块 。
好了,大功告成!
现在,我们再尝试存入一批文件 。
葵花宝典.txt数学期末复习资料.mp4赘婿1.mp4赘婿2.mp4赘婿3.mp4赘婿4.mp4低并发编程的秘密.pdf诶?这看着好不爽,所有的文件都是平铺开的,能不能拥有层级关系呢?比如这样
葵花宝典.txt数学期末复习资料.mp4赘婿赘婿1.mp4赘婿2.mp4赘婿3.mp4赘婿4.mp4低并发编程的秘密.pdf我们将葵花宝典.txt 这种称为普通文件,将赘婿这种称为目录文件,假如要访问赘婿1.mp4,那全文件名要写成
赘婿/赘婿1.mp4 。
如何做到这一点呢?那我们又得把 inode 结构拿出来说事了 。
此时需要一个属性来区分这个文件是普通文件,还是目录文件 。
缺什么就补什么嘛,我们已经很认识了,专门加一个 4 字节,来表示文件类型 。
假如是普通文件,则这个 inode 所指向的数据块仍旧和之前一样,就是文件本身原封不动的内容 。
但假如是目录文件,则这个 inode 所指向的数据块,就需要重新规划了 。
这个数据块里应该是什么样子呢?可以是一个一个指向不同 inode 的紧挨着的结构体,比如这样 。
这样先通过 赘婿 这个目录文件,找到所在的数据块 。再根据这个数据块里的一个个带有 inode 信息的结构体,找到这个目录下的所有文件 。
完美!
不过这样的话,你想想看,假如想要查看一下赘婿这个目录下的所有文件(比如 ll 命令),将文件名和文件类型都展示出来,怎么办呢?
就需要把一个个结构体指向的 inode 从 inode 表中取出,再把文件名和文件类型取出,这很是浪费时间 。
而让用户看到一个目录下的所有文件,又是一个极其常见的操作 。
所以,不如把文件名和文件类型这种常见的信息,放在数据块中的结构体里吧 。
同时,inode 结构中的文件名,似乎就没啥用了,这种变长的东西放在这种定长的结构中本身就很讨厌,早就想给它去掉了 。而且还能给其他信息省下空间,比如文件所在块的数组,就能再多几个了 。
太好了,去掉它!
OK,大功告成,现在我们就可以给文件分门别类放进不同目录下了,还可以在目录下创建目录,无限套娃!
现在的文件系统,已经比较完善了,只是还有一点不太爽 。
我们访问到一个目录下,可以很惬意地看到目录里的文件,然后再根据名称访问这个目录下的文件或者目录,整个过程都是一个套路 。
但是,最上层的目录下的所有文件,即根目录,现在仍旧需要通过遍历所有的 inode 来获得,能不能和上面的套路统一呢?
答案非常简朴,我们规定,inode 表中的 0 号 inode,就表示根目录,一切的访问,就从这个根目录开始!