块和扇区之间的区别

Posted

技术标签:

【中文标题】块和扇区之间的区别【英文标题】:Difference between blocks and sectors 【发布时间】:2012-09-02 23:20:08 【问题描述】:

参考this的文章,有一行写着:

因为操作系统可以寻址的块或驱动器地址的数量是有限的。通过将一个块定义为多个扇区,操作系统可以在不增加块地址数量的情况下使用更大的硬盘驱动器。

这是什么意思? “操作系统可以寻址”是什么意思?随后的数学也不清楚。 64*512怎么会小于64*4呢?

【问题讨论】:

链接失效了,你能更新一下吗?否则,问题会失去一些价值...... 似乎此链接有该内容的克隆:alphaurax-computer.com/computer-tips/… 关于数学...文章不正确。当它谈到“64k * 512k vs 64k * 4k”时,它应该读作“64k * 512 vs 64k * 4k”(注意512去掉了k,所以实际上64k * 4k“大于”64k * 512。 【参考方案1】:

这样看。操作系统文件系统中用于存储数据的每个块都需要与您正在写入的实际文件数据一起存储一定数量的元数据。例如:时间戳(创建、修改)、文件名、所有权/权限位。对于跨越多个块的文件,您还必须存储每个块的 ID 以及它们链接在一起的顺序等。

确定操作系统中的块大小需要权衡取舍。每个文件必须至少占据一个块,即使文件长度为 0 字节,所以文件的元数据需要附加到一些东西上。除非您可以保证您的文件的大小始终是块大小的若干倍(例如,在 4k 块 OS 中,所有文件都是 4k),否则对于不完全适合的文件会有一定的浪费那个块。

当您需要存储许多小文件时,小块大小是很好的选择。另一方面,更多块 = 更多元数据,因此您最终会在开销上浪费大量存储系统,跟踪所有文件的位置。

另一方面,大块意味着更少的元数据,但在存储小文件时也意味着更大的浪费。例如存储在 4k 块中的 1 字节文件浪费了该块的 3.99k。

操作系统必须为每个块分配一个 ID 号,以便对其进行唯一标识。使用 8 位 ID 字段的操作系统只能跟踪 256 个块,因此,通过扩展,只能跟踪 256 个文件。但如果这些块中的每一个实际上都是 1 兆字节,那么您最多可以存储 256 兆字节的数据。

您链接到的文章有一个错字/逻辑缺陷:它们的意思是 512 BYTES,而不是 512k,因此 64*512 字节小于 64*4k,即 64*4096 字节。大多数硬盘驱动器都带有 512 字节的扇区/块大小。

但是,如前所述,小块意味着更多元数据。现在驱动器大小在 3+ TB 范围内,具有 512 字节块,您必须拥有 3TB/512 字节 = 64.4 亿块的元数据存储。这是空间的一大浪费。因此,现在他们交付的驱动器具有 4k 块,大 8 倍,因此您只需要存储 8.05 亿块的元数据。可能的文件总数减少了 8 倍,但元数据量的减少意味着您实际上可以存储更多的可用数据。

顺便说一句,64 亿块比 32 位系统可以直接寻址的块要大。 2^32 的上限约为 42 亿,因此较旧的 32 位机器无法使用整个 3TB 驱动器。因此切换到更大的块大小。 32 位盒子可以轻松处理 8.05 亿个区块。

【讨论】:

地狱的解释!谢谢!只是一个问题,你的意思是块本身包含元数据吗,也就是说,如果一个文件跨越 10 个块,每个块和一些数据是否会包含元数据,比如它的 id,它在块链中的序列号等? 还有一个问题,这里的这一行是什么意思:通过将一个块定义为几个扇区,操作系统可以在不增加块地址数量的情况下使用更大的硬盘驱动器。? 扇区在现代驱动器中是一个过时的概念。当驱动器上的“位置”由旧的 CHS(柱面、磁头、扇区)定义指定时,它们就存在了,这浪费了大量空间。所有现代驱动器都使用 LBA - 逻辑块寻址,因此扇区不再存在。但是,操作系统仍然可以将多个块/扇区链接到单个逻辑操作系统级块以减少空间。例如。 “驱动器上的每 3 个实际块/扇区将被操作系统视为 1 个块”。 同样,块元数据存储在其他地方。例如在 DOS/Win9x 中,这就是“FAT”——文件分配表。在 Unix-ish 系统上,它是 inode 表等……它不完全是 1 块文件数据 = 1 块元数据。但是每次您在某个文件的某个地方使用一个块时,该块的使用必须记录在另一个块的其他地方 - 但是操作系统可以将多个文件块的数据存储在单个元数据块中,因此开销不会太可怕 所以基本上对于大量的小文件,因为会有很多元数据,所以必须牺牲很多块来存储元数据,对吧?

以上是关于块和扇区之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

文件系统块如何转换为 lba?

iOS/Swift - 闭包/完成块和委托/函数有啥区别?

深入理解使用synchronized同步方法和同步代码块的区别

Java的synchronized的同步代码块和同步方法的区别

Java 重学系列之匿名代码块和静态代码块区别

Java 重学系列之匿名代码块和静态代码块区别