从01开始 从01开始
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)

peterjxl

人生如逆旅,我亦是行人
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)
  • 计算机历史

  • 数字电路

  • 计算机组成原理

    • 网课-计算机组成原理(北大-陆俊林)

      • 概述-计算机组成原理(北大-陆俊林)
      • 第1周-计算机组成章节视频简介
      • 101-电子计算机的兴起
      • 102-冯·诺依曼结构的要点
      • 103-冯·诺依曼结构的小故事
      • 104-计算机结构的简化模型
      • 105-计算机执行指令的过程
      • 106-计算机输入和输出
      • 107-冯诺依曼结构和具体实现
      • 201-设计自己的计算机
      • 202-x86体系结构
      • 203-x86指令简介
      • 204-复杂的x86指令举例
      • 205-MIPS体系结构
      • 206-MIPS指令简介
      • 301-算术运算和逻辑运算
      • 302-门电路的基本原理
      • 303-寄存器的基本原理
      • 304-逻辑运算的实现
      • 305-加法和减法的实现
      • 306-加法器的优化
      • 401-乘法的运算过程
      • 402-乘法器的实现
      • 403-乘法器的优化1
      • 404-乘法器的优化2
      • 405-除法的运算过程
      • 406-除法器的实现
      • 407-除法器的优化
      • 501-处理器的设计步骤
      • 502-数据通路的建立
      • 503-运算指令的控制信号
      • 504-访存指令的控制信号
      • 505-分支指令的控制信号
      • 506-控制信号的集成
      • 601-流水线的基本原理
      • 602-流水线的优化
      • 603-超标量流水线
      • 604-流水线的冒险
      • 605-数据冒险的处理
      • 606-控制冒险的处理
      • 701-存储层次结构概况
      • 702-DRAM和SRAM
      • 703-主存的工作原理
      • 704-主存技术的发展
      • 705-高速缓存的工作原理
      • 706-高速缓存的组织结构
      • 707-存储容量的计算
        • 本节小结
      • 801-中断和异常的来源
      • 802-中断向量表的结构
      • 803-中断向量表的发展
      • 804-中断的处理过程
      • 805-内部中断分类说明
      • 806-基于中断的功能调用
      • 901-输入输出接口的基本功能
      • 902-输入输出接口的编址方式
      • 903-输入输出的控制方式
      • 904-中断控制方式
      • 905-外部中断的处理过程
      • 906-直接存储器访问方式
      • 网课-计算机组成原理(北大-陆俊林)
    • 计算机组成原理
  • 汇编语言

  • C语言

  • 数据结构

  • 操作系统

  • Linux

  • 计算机网络

  • Git

  • 数据库

  • 计算机小知识

  • 编译原理

  • 名人堂

  • 计算机基础
  • 计算机组成原理
  • 网课-计算机组成原理(北大-陆俊林)
2023-06-13
目录

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

在GitHub上编辑此页 (opens new window)
上次更新: 2023/6/13 17:13:13
706-高速缓存的组织结构
801-中断和异常的来源

← 706-高速缓存的组织结构 801-中断和异常的来源→

Theme by Vdoing | Copyright © 2022-2023 粤ICP备2022067627号-1 粤公网安备 44011302003646号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式