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和内存的厂商, 好像也没有太大的动力去改变原有的存储容量标记方式。 但是对于我们来说,已经了解了它内部的真相到底是怎么回事。 至少,不会把我们自己给搞糊涂了。