1kb等于多长个扇区 1kb等于多长字节

你手里有一块硬盘,大小为 1T
你还有一堆文件
这些文件在硬盘看来,就是一堆二进制数据而已
你预备把这些文件存储在硬盘上,并在需要的时候读取出来 。
要设计怎样的软件,才能更方便地在硬盘中读写这些文件呢?
首先我不想和复杂的扇区,设备驱动等细节打交道,因此我先实现了一个简朴的功能,将硬盘按逻辑分成一个个的块,并可以以块为单位进行读写 。
每个块就定义为两个物理扇区的大小,即 1024 字节,就是 1KB 啦 。
硬盘太大不好分析,我们就假设你的硬盘只有 1MB,那么这块硬盘则有 1024 个块 。
OK,我们开始存文件啦!
预备一个文件
随便选个块放进去,3 号块吧!
成功!首战告捷!
再存一个文件!
诶?发现问题了,万一这个文件也存到了 3 号块,不是把原来的文件覆盖了么?不行,得有一个地方记录,现在可使用的块有哪些,像这样 。
块 0:未使用
块 1:未使用
块 2:未使用
块 3:已使用
块 4:未使用
...
块 1023:未使用
那我们就用 0 号块,来记录所有块的使用情况吧!怎么记录呢?
位图!
那我们给块 0 起个名字,叫块位图,之后这个块 0 就专门用来记录所有块的使用情况,不再用来存详细文件了 。
当我们再存入一个新文件时,只需要在块位图中找到第一个为 0 的位,就可以找到第一个还未被使用的块,将文件存入 。同时,别忘了把块位图中的相应位置 1 。
完美!
下面,我们尝试读取刚刚的文件 。
咦?又碰到问题了,我怎么找到刚刚的文件呢?根据块号么?这也太蠢了,就像你去书店找书,店员让你提供书的编号,而不是书名,显然不合理 。
因此我们给每个文件起一个名字,叫文件名,通过它来寻找这个文件 。
那必然就要有一个地方,记录文件名与块号的对应关系,像这样 。
葵花宝典.txt:3 号块
数学期末复习资料.mp4:5 号块
低并发编程的秘密.pdf:10 号块
...
别急,既然都要选一个地方记录文件名称了,不妨多记录一点我们关心的信息吧,比如文件大小、文件创建时间、文件权限等 。
这些东西自然也要保存在硬盘上,我们选择用一个固定大小的空间,来表示这些信息,多大空间呢?128 字节吧 。
为啥是 128 字节呢?我乐意 。
我们将这 128 字节的结构体,叫做一个 inode 。
之后,我们每存入一个新的文件,不但要占用一个块来存放这个文件本身,还要占用一个 inode 来存放文件的这些元信息,并且这个 inode 的所在块号这个字段,就指向这个文件所在的块号 。
假如一个 inode 为 128 字节,那么一个块就可以容纳 8 个 inode,我们可以将这些 inode 编上号 。
假如你觉得 inode 数不够,也可以用两个或者多个块来存放 inode 信息,但这样用于存放数据的块就少了,这就看你自己的平衡了 。
同样,和块位图治理块的使用情况一样,我们也需要一个 inode 位图,来治理 inode 的使用情况 。我们就把 inode 位图,放在 1 号块吧!
同时,我们把 inode 信息,放在 2 号块,一共存 8 条 inode,这样我们的 2 号块就叫做 inode 表 。
现在,我们的文件系统结构,变成了下面这个样子 。
注重:块位图是治理可用的块,每一位代表一个块的使用与否 。inode 位图治理的是一条一条的 inode,并不是 inode 所占用的块,比如上图中有 8 条 inode,则 inode 位图中就有 8 位是治理他们的使用与否 。
现在,我们的文件很小,一个块就能容下 。
但假如需要两个块、三个块、四个块呢?
很简朴,我们只需要采用连续存储法,而 inode 则只记录文件的第一个块,以及后面还需要多长块,即可 。
这种办法的缺点就是:轻易留下大大小小的空洞,新的文件到来以后,难以找到合适的空白块,空间会被浪费 。
看来这种方式不行,那怎么办呢?
既然在 inode 中记录了文件所在的块号,为什么不扩展一下,多记录几块呢?
原来在 inode 中只记录了一个块号,现在扩展一下,记录 8 个块号!而且这些块不需要连续 。
嗯,这是个可行的办法!
但是这也仅仅能表示 8 个块,能记录的最大文件是 8K(记住,一个块是 1K), 现在的文件轻松就超过这个限制了,这怎么办?
很简朴,我们可以让其中一个块,作为间接索引 。
这样瞬间就有 263 个块(多了 256 -1 个块)可用了,这种索引叫一级间接索引 。