707-存储容量的计算
# 707-存储容量的计算
对于存储器,我们既关心它的性能, 也关心它的容量,那么现在,在存储器容量的计算方面,却有了一些争议。 这又是怎么回事呢?我们一起来看一看。
我们来看一个关于 U 盘的怪事,有一天我想把我电脑上的一些文件随身带走 我先查看了一下文件的大小总共有 3.8GB, 于是我就找了一个 4G 的 U 盘,这应该可以轻松地存下了。 于是我插上 U 盘就开始复制文件。 结果,弹出了这么个对话框,说空间不足。 我明明是个 4G 的 U 盘,结果系统却说可用大小总共只有 3.72GB, 存不下我这 3.8G 的文件。这到底是怎么回事呢?
于是我就点右键,看这个 U 盘的属性,确实显示是 3.72GB。 这里系统也统计了这个 U 盘总共有多少个字节, 然后就自己算一算,4GB 应该是多少个字节,那么学计算机的都知道, 所谓 32 位的 CPU 可以访问 4Gbyte(位)内存空间。 这就是指,32 位的信号总共可以产生 2 的 32 次方个地址。 你因此可以访问 2 的 32 次方个 byte。所以 4G 个 byte 就等于 2 的 32 次方个 byte, 也就相当于 4 乘以 1024 的 3 次方, 那总共应该是四十二亿九千四百多万个字节, 而这个 u 盘足足给我少个两亿九千多万个字节,这不是太明显的偷工减料嘛?
于是我就向生产厂商投诉,说你们给我的东西怎么少了这么多呢? 我们原本买了一个 4GB 的 U 盘,你上面标的也是 4GB 为什么实际只有 3.72GB 呢?可没想到,人家慢条斯理地跟我说了一大番道理。 说我们这个就是 4GB,是这么算的。 当然你看到的这个 41 的字节并没有错,但我们的计算方法是这样的, 这 41 个字节就大约等于 4 乘以一千的 3 次方,这就是 4GB。 其实,我们还多送了你一百多万个字节呢, 你占了便宜,反倒来投诉我们偷工减料,这又是何道理? 这我哪能轻易罢休,计算机里明明应该用 1024 作为底数。 你怎么能 1000 作为底数呢,所以你应该给够我 1 乘以 1024 的 3 次方,这才是一个 4GB 的 U 盘。 不然所谓 32 位的地址可以访问 4GB 的存储空间岂不成为了一句笑话? 于是我们双方各执一词,谁也说服不了谁。
那虽然刚才讲的这个故事是虚构的。 但是这样的争议却是真实存在的,那么就从头来看一看。 刚才提到的 4GB,其中 B,也就是 byte, 是一个数据的单位,而 G 则是这个单位的前缀。 比如说,我们经常使用的长度 1km 也就是一公里,或者叫一千米。 那它就相当于 1000m,m 就是米,这是长度的单位, 而 K 就是一个单位前缀,用来指代 1000。
那么类似的,1KG 就是一千克。 那我们在学习到的计算机的知识中也经常有这样的单位前缀。 比如说我们形容高速缓存的容量,我们会说它是 32KB, 这就等于 32 乘以 1024,在这里 K 指的是 2 的十次方。
而 M,也就是我们平常所说的兆,指的是 2 的 20 次方, 而 G 指的是 2 的 30 次方,因此我们说一个内存是 4GB 的, 这就是说它一共有 4 乘以 1024 的三次方这么多 byte。 但是按刚才 U 盘的生产厂商的说法,4GB 的 u 盘则是指 4 乘以 1000 的三次方的 byte。 因此,至少从市值看来,4GB 的 u 盘和 4GB 的内存, 虽然它们用了同样的容量标记,但实际上它们真正的容量是不一样的。 另外,如果你用同样的方法检查硬盘的容量,你也会发现硬盘的容量, 似乎也没有它标称的那么多。这也是同样的原因。好,我们在计算机系统中检查硬盘的属性。 肯定会发现,它不到 1T,那这个矛盾到底是怎么回事呢? 究竟是谁对谁错呢?
另外除了存储的容量,还有一些别的地方, 也用到了这些前缀,那他们究竟又表达的是什么含义呢?
要确定这些单位前缀的含义,我们就得从国际单位开始说起。 第一个是温度的单位,kelvin,用 k 来表示。 第二个是时间的单位,秒,用 s 来表示。 第三个是长度的单位,米,用 m 来表示。 第四个是质量的单位,千克,用 kg 来表示。 这里我们要注意到,其实克也是一个单位, 而千则是一个单位前缀,另外还有几个其他的单位,我们就不一一说明了。
接着我们来看国际单位制的前缀,刚才我们已经提到了 k 这种前缀。 它所代表的是一千,也就是 10 的三次方, 因为一千的这个数量并不大,人的日常生活中经常会遇到,所以这个前缀很早就确定下来了 我们要注意的是这个 k 是小写的。 当然随着社会的发展进步,人们所需要记录和计算的数也越来越大, 这也需要有新的单位前缀。比 k 更大的就是 M,就相当于 1000 的平方, 更大一级的是 G,相当于 1000 的三次方。 再高一级的是 T,是 1000 的四次方,这都是在 1960 年确定的。 也就是说在那个时代这个量级的单位的前缀就基本够用了。
当然在后来,这些前缀又不够用了的时候,我们又必须要加新的。 75 年增加了 P 和 E,分别是 1000 的 5 次方和 6 次方。 到了 91 年,又增加了 Z 和 Y,分别是 1000 的 7 次方和 8 次方。 这就是目前最大的单位前缀了,那么有大也有小。
当我们想表达更小的数时,就需要有另一个方向的前缀。 比如说 m 就是 1000 的负 1 次方,也就是千分之一。 那 mm 就是我们常用的毫米,而 ms 就是毫秒。 这些也都是人所能直接感知的范围内,所以也在很早就确定下来了。
后来在 60 年确定了 micro 这个前缀, 在中文里称之为”微“, 对应的有微米、微秒、微克等等,那它是用一个希腊字母 μ 来表示的, 当然在手写的情况下,是没有问题的。 而如果计算机里来输入,则会有一些困难。如果条件允许,我们都应该用插入特殊字符等方式, 正确地输入 μ 这个字母,只有在确实无法输入的情况下, 也可以用英文字母”u“来代替。 那么同一年,它规定了 n 这个前缀, 也就是”纳“,现在的集成电路设计都是在纳米这个尺度上。 而 1G 赫兹的时钟频率对应的时钟周期, 也就是纳秒,那比 n 更小一级的前缀是 p, 中文里译作”皮“,那由晶体管构成的逻辑门的延迟现在都是在皮秒量级的。 那再往后,64 年由设了 f 和 a 这两个单位前缀, 分别是 1000 的负 5 次方和 1000 的负 6 次方, 再到了 91 年,又增加了 z 和 y,分别是 1000 的负 7 次方和 1000 的负 8 次方。 那这些就是现在国际公认的单位和单位前缀。
而在计算机领域使用情况有所不同, 内部存储器并没有遵守国际单位制的要求, 而在外部存储器的容量标记上则是遵循了国际单位制的标准。 从这个角度来看,那似乎是外部存储器的这个标记方法才更合理一些。 那内部存储器为什么要采取 1024 为底呢?这个原因其实也很明确。 刚才我们也已经解释过,因为计算器内部采取二进制的计数, 其实最主要的就是 CPU 的运算器采用二进制的计算的方式, 比如说 15 位的地址就正好可以表示 2 的 15 次方那么多个字节, 这 15 位地址线所能表示的每一个地址都正好对应了 sm 中的一个字节, 这样在计算的时候就自然而然应该用 1024 为底
而对于外部存储器,它和 CPU 的距离较远,不像高速缓存和内存那样, 由 CPU 直接的操作,所以他们并没有必要采用 1024 为底的计算方法。 而其他一些参数,比如数据传输率、时钟频率虽然也在计算机内部使用,但它和刚才提到的地址宽度并没有直接的联系, 而都只是在说在一个单位的时间内要完成多少事情,比如说以太网的传输率 100 兆 bps 是指每秒钟要传输 100 兆个比特,所以这里的兆, 指的就是 1000 的二次方,而 CPU 的主频则对应了时钟的信号每秒钟要翻转多少次, 那么 3G 赫兹就是指每秒钟有 30 亿个时钟周期。 因此我们可以看到,计算机当中大多数的单位前缀 都还是采用十进制的形式,并且符合国际单位制的要求。 只有在计算内部存储器容量时,采用了二进制的形式,这样的做法都是合理的
但唯一的问题在于, 只有采取 1024 为底的前缀,也都使用了与国际单位制额前缀相同的字母, 针对这些单位前缀使用上的矛盾,也有一些官方的说法。
那美国国家标准协会以及电器和电子工程师协会, 在 1968 年出过标准, 关于 K,它给了两个定义,一就是和国际单位制相同的,是指 1000, 第二条,它特别说明了如果是用来形容计算机存储的容量, 那这个前缀又可以表示 2 的十次方也就是 1024。 类似的,M,也有两个定义。 然而在现实中,大家仍然是各行其是,并没有按照它们的规定执行, 也就按照内存一套,外存一套,各说各话。
因此到后来,IEEE 的标准委员会也通过美国国家标准技术研究员发布了声明, 大概意思是说,针对现状, IEEE 的标准将会将会使用大家公认的国际单位制前缀的定义, 那么 mega,也就是我们说的兆,也就是指 100 万,不再有 2 的 20 次方这样另一个定义。当然这里也说了,如果能够明确指出,是以 2 为底的, 也可以作为个例单独处理,直到有一种新的标准专门用于二进制的单位前缀
那现在这种单位前缀的标准也已经制定出来了, 是由国际标准化组织 ISO 和国际电工委员会 IEC 制定的, 比如说 Ki 指 1024, 而 Mi 就是指 1024 的平方,Gi 则是指 1024 的三次方, 以此类推, 因此现在标记为 500GB 的硬盘,如果要对应到计算机内部存储器所标记的存储容量, 应该是 466GiB,好,我们现在常说的标记为 512MB 的内存,如果想不引起混淆,那就应该标记出 512MiB, 在这一套标准的影响下, 就不再有混淆的问题了
# 本节小结
存储器容量计算标准现在已经有了, 但是执行的怎么样,那就是另一回事了。 现在的 CPU 和内存的厂商, 好像也没有太大的动力去改变原有的存储容量标记方式。 但是对于我们来说,已经了解了它内部的真相到底是怎么回事。 至少,不会把我们自己给搞糊涂了。