第一章 计算机体系结构
1.1 什么是计算机体系结构
计算机体系结构其实又称计算机系统结构,请注意:这里指的是计算机系统,而不是计算机上的操作系统,二者不能化等价关系。
笔者看来,计算机体系结构粗略上来讲是为了描述计算机的软硬件组成的一个框架(是一个抽象的概念,并没有具体的实体)。
举例来说,就是如果把计算机比作一套房子,而计算机体系结构则是这个房子的基础结构,硬件则是这个房子的组成的物理上的材料,如”砖混、钢筋“;软件则指该房子的生活配置,如沙发,水源等等。这里主要还是以描述计算机为主,则不牵涉其他过多的内容。
这里给出一张计算机体系结构的描述图
计算机系统包括读取并执行程序的中央处理单元(CPU),保存程序和数据的存储器,以及将芯片转换为实用系统的其他子系统。
-
在计算机中,实际执行程序的部分叫做CPU,或者更简单地被称作处理器。微处理器则是在单个硅片上实现的CPU。围绕着微处理器构建的计算机被称作微机。CPU是计算机的核心,计算机的性能既取决于CPU,也取决于其他子系统的性能。
-
信息(即程序和数据保存在存储器中,为了实现不同的目标,计算机会使用不同类型的存储器,如cache、主存、辅存等多个存储层次,大多数处理器都在CPU内集成了片上Cache。
如图,描述了一台接收并处理输入信息、产生输出结果的可编程数字计算机。
-
Cache是存放常用数据的高速,专用存储器。主存中存放了大量的工作数据。辅存是指磁盘和CD-ROM,能够存放海量数据,价格却比前两种便宜的多。这里需要声明的是,在计算机中,我们俗称的内存条是计算机的主存,而我们俗称的硬盘等则是计算机的辅存。
-
寄存器是CPU内部用来存放数据的存储单元。
-
组成计算机的各个子系统通过总线连接在一起,数据通过总线从计算机中的个位置传递到另一个位置。
-
时钟提供了脉冲流,所有内部操作都在时钟脉冲的触发下进行。时钟频率是决定计算机速度的一个因素。
程序执行的过程:
如图,描述了程序的执行过程:
从存储器中读出一条Z=X+Y的指令,将其发送给解释单元,解释单元产生控制信号,驱动这条指令的执行。假定这个程序的功能是从存储器读出两个数据(X和Y),将它们相加,然后写回存储器。
要执行这个程序,CPU必须首先从存储器中取出一条指令,在CPU分析或解码这条指令后,从存储器中读出这条指令所需的所有数据。
第一条指令,LOAD X,从存储器中读出变量X的值,并将它暂存在寄存器中。
第二条指令,LOAD Y,从存储器中读出变量Y的值,并保存在另一个寄存器中。
第三条指令,Z=X+Y,将两个寄存器的内容相加,并将结果保存在第三个寄存器中。
第四条指令,STORE Z,将加法的结果写回存储单元Z。
计算机指令:
尽管计算机能够执行上百种不同指令,但下面的6条基本指令可以将所有计算机指令进行分类:
指令 | 解释 |
---|---|
MOV A, B | 将B的值复制到A |
LOAD A, B | 将存储单元B的值复制到寄存器A中 |
STORE A, B | 将寄存器B的值复制到存储单元A中 |
ADD A, B | A与B相加,结果保存到A中 |
TEST A | 测试A的值是否为0 |
BEQ Z | 若最后一次测试结果为TRUE,执行地址Z处的代码 ,否则继续执行 |
1.2 体系结构和组成
体系结构 计算机体系结构通常被认为是程序员视角中的计算机。程序员所看到的是计算机的抽象视图,计算机的实际硬件和实现都被隐藏起来了。计算机体系结构的这个抽象视图现在通常被称作指令集体系结构(instruction set architecture, ISA)。指令集体系结构并不等于计算机体系结构。
- 组成 计算机组成表示其体系结构的具体实现。计算机组成是计算机体系结构的实例化(即将抽象变为具体)。
- 本专栏中用术语“组成”代表计算机的实际硬件实现。“体系结构”代表计算机的抽象指令集体系结构(它的指令集)。
- 寄存器 寄存器是用来存放一个单位的数据或字数据的存储单元。寄存器通常用它所保存数据的位数来描述,典型的有8位、16位、32位和64位。寄存器与存储器中的字存储单元没有本质区别。二者的实际差别在于,寄存器位于CPU内,它的访问速度远远快于访问CPU外的存储器。
- 机器码 计算机上执行的代码表示为二进制0和1组成的串,被称作机器码。每种计算机都只能执行一种特定的机器码。
- 汇编语言 人类可读的机器码(如ADD RO,R1)叫作汇编语言。
- 高级语言 能够在类型完全不同的计算机上运行,与底层计算机体系结构几乎没有关系的代码叫做高级语言(如C或Java等)。在执行之前,高级语言程序必须先被编译为计算机的本地机器码。
- 时钟 绝大多数数字电子电路都带有一个时钟,用以生成连续的间隔固定的电脉冲流。之所以被称作时钟,是因为可用这些电脉冲来计时或确定计算机内所有事件的顺序。如,处理器可能会在每一个时钟脉冲到来时执行一条新指令。
RISC 精简指令集计算机)体系结构
-
设计策略:是使用少量的指令完成最少的简单操作
-
缺点:程序设计更难,复杂指令需要用简单指令模拟
-
应用:ARM处理器
CISC (复杂指令集计算机)体系结构
- 设计策略:是使用大量的指令,包括复杂指令
- 优点:程序设计更容易,因为每个简单的或复杂的任务都有一条对应的指令。程序员不需要写一大堆的指令去完成复杂的任务
- 缺点:指令集的复杂性使得CPU和控制单元电路非常复杂
- 应用:英特尔公司开发的奔腾系列CPU
1.3 计算机的发展
这里仅列出大致路线:
机械计算机 --> 机电式计算机 --> 早期的电子计算机 --> 微机和PC革命
具体可参考计算机的起源于发展
1.3.1 摩尔定律和进步的历程
摩尔定律 是卡沃-米德于1975年根据戈登-摩尔所观察到集成电路的集成度每18个月翻一番,摩尔定律是一个经验性的观察结果。广泛的讲,摩尔定律只是形容集成电路集成度的一种发展规律。
顺序执行 程序中的指令必须一条接一条按照在程序中的出现的顺序执行。
乱序执行 指令有时可以通过改变指令的执行顺序提高计算机的速度。如图中,(4)和(5)可以在任何时候执行,但指令(3)必须在指令(1)和(2)结束后执行。即,打乱程序执行顺序,就算指令位于后边,只要可以执行,就先执行,这就是乱序执行(Out-of-Order)。
乱序执行时,由于数据依赖性而无法立即执行的指令会被延后,因此可以减轻数据灾难的影响。
1.3.2 存储技术发展
覆盖着电容的旋转的磁鼓–>阴极射线管–>铁氧体磁芯存储器–>磁盘–>光存储器(DVD等) 这里只列出发展历程,具体相关内容可以自行查阅。
1.3.3 普适计算
无论是什么设备,在现实生活中,计算是无处不在的!
1.3.4 多媒体计算机
所谓多媒体计算机就是具有了多媒体处理功能的计算机,它的硬件结构与一般所用的个人机并无太大的差别,只不过是多了一些软硬件配置而已。一般用户如果要拥有多媒体个人计算机大概有两种途径:一是直接够买具有多媒体功能的PC机;二是在基本的PC机上增加多媒体套件而构成多媒体个人计算机。其实,现在所购买的个人电脑绝大多都具有了多媒体应用功能。
**多媒体处理(处理和存储音频/视频数据)**需要很大的存储容量以及完成大量简单重复操作的实时处理声音样本的图像像素的能力。
1.4 存储器
存储器 是计算机系统中的记忆设备,用来存放程序和数据
如图,描述了程序怎样找出保存在一个假象存储器中的数串的最大序列长度。必须强调的是,这个程序是概念上的而不是实际的。该图叫作存储器映射,展示了信息在存储器中的存放位置,存储器中的每个位置要么保存指令,要么保存数据元素。
作用:
- I/O设备要与存储器交换信息
- 多处理机系统中,各处理机都要与主存交换信息,而且各处理机在相互通信中,也都需要共享存放在存储器中的数据
分类:
1.按存储介值进行分类
- 磁表面存储器(磁盘;磁带)
- 磁芯存储器
- 半导体存储器(MOS型半导体存储器,具有高集成度的特点;两极性半导体存储器,具有高速的特点)
- 光存储器(光盘)
2.按在计算机中的作用(层次)分类
- 主存:又称为内存,用来存放计算机运行期间所需的大量程序和数据,CPU可以直接随机地对其进行访问,也可以和Cache及辅助存储器交换数据。其特点是容量小,存取速度较快,单位成本较高。
- 辅助存储器:又称为外存,用来存储当前暂时不用的程序和数据,以及一些需要永久性保存的信息,它不能与CPU直接交换信息。其特点是容量大,存取速度慢,单位成本低。
- 高速缓冲存储器Cache,位于主存和CPU之间,用来存放正在执行的程序段和数据,以便CPU能高速地使用它们。Cache的存取速度可与CPU的速度相匹配,但其容量小,单位成本高。
3.按存取方式分类
- 随机存储器(RAM):存储器的任何一个存储单元的内容都可以随机存取,而且存取时间与存储单元的物理位置无关。RAM又分为静态RAM(主要用于高速缓冲存储器Cache,以触发器原理寄存信息)和动态RAM(主要用于主存,以电容充电原理寄存信息)。
- 只读存储器(ROM):存储器的内容只能随机读出而不能写入。信息一旦写入存储器就固定不变,即使断电,内容也不会丢失。因此,通常用它存放固定不变的程序、常数和汉字字库,甚至用于操作系统的固化。它与随机存储器可共同作为主存的一部分,统一构成主存的地址域。(注意:广义上的只读存储器已可通过电擦除等方式进行写入,其“只读”的概念没有保留,但仍然保留了断电内容保留、随机读取特性、且其写入速度比读取速度慢得多)
- 串行访问存储器。对存储单元进行读/写操作时,需按其物理地址的先后顺序寻址,包括顺序存取存储器(如磁带)与直接存取存储器(如磁盘)
① 顺序存储寄存器:只能按某种顺序存取,存取时间的长短与信息在存储体上的物理位置有关,其特点是存取速度慢。
② 直接存储寄存器:通常先寻找整个存储器中的某个小区域(如磁盘上的磁道),再在小区域内顺序查找。
4.按信息的可保存性分类
- 易失性存储器:断电后,存储信息即消失的存储器。如 RAM
- 非易失性存储器:断电后,存储信息仍然存在的存储器。如 ROM、磁表面存储器和光存储器
- 破坏性读出:若某个存储单元所存储的信息被读出时,原存储信息被破坏,则称破坏性读出。具有破坏性读出性能的存储器,每次读出操作后,必须紧接一个再生的操作,以便恢复被破坏的信息
- 非破坏性读出:若某个存储单元所存储的信息被读出时,原存储信息不被破坏,则称非破坏性读出。
存储系统 处理器将一个放在地址总线上的地址以及一个用于选择读操作或写操作(也被称为读或写周期)的控制信号发送给存储器。
- 在读周期中,存储器将数据放在数据总线上供CPU读取:
- 写周期中,放在数据总线上的数据被写入存储器。
- 信息进入或离开存储器的位置叫作端口。
**RTL (寄存器传输语言)**由于使用文字描述计算机的操作很不方便,使用RTL可以更加容易地定义计算机内发生的操作。
RTL符号
-
区分存储单元的地址和它的内容非常重要。。
-
在RTL语言中,用方括号[]表示存储单元的内容,如.[15]= Max Run
含义是:地址为15的存储单元保存了变量MaxRun的值左箭头符号表示数据传送操作,如
[15] <-- [15]+ 1
含义是:将地址为15的存储单元的值加1,并将结果写回地址为15的存储单元
-
考虑下面3个RTL表达式:
[20] = 5
[20]<–6
[20]<–[6]
1.5 存储程序的概论
下面的伪代码描述了存储程序计算机的基本操作:
存储程序计算机
程序计数器指向存储器中的第一条指令
REPEAT
从程序计数器所指的存储单元中读出指令修改程序计数器,使之指向下一条指令将从存储器中取出的指令解码
执行指令
FOREVER
End
从存储器中取出每条指令都需要进行一次访存操作(即读存储器)。
可以用下面的伪代码描述”执行指令“这一动作
执行指令
IF指令需要使用数据
THEN 从存储器中读这个数
END IF
完成指令定义的操作
IF 指令要将数据写回存储器
THEN 将数据写回存储器、
END IF
End
指令格式
上面的动作序列用C语言描述:
执行一条指令需要至少两次访存,第一次访存是读取指令第二次访存要么从存储器读出指令需要的数据要么将它之前的指令产生的或修改过的数据写回存储器。
存储程序计算机的一种直观合理的指令格式可以用下面的形式表示:
Operation Address1, Address2, Address3
- Operation表示要执行的指令的动作
- Address2和Address3分别是3个操作数在存储器中的位置。在这Address1、条指令中,操作数为数据的地址,而不是数据本身。
三操作数指令:
ADD , PQ, R是一条典型的三操作数指令,P、Q、R是三个存储单元地址的符号名,这个三操作数指令格式用RTL表示为:
[Addressl] <-- [Address2] Operation [Address3]
如图,描述了一条指令的执行过程,一共需要4次访存(即一次取指令,两次取两个源操作数,一次保存结果)。
如图,描述了指令的4个字段与CPU、之间的关系,存储器以及指令的执行方式
两地址指令:
两地址指令 有些计算机实现了两地址指令,其格式为!
Operation Addressl, Address2
Address2为源操作数,Address1既是源操作数也是目的操作数。
指令ADD P, Q的RTL定义为:
[P] ← [B] + [Q]
- 两地址指令会破坏它的一个操作数,也就是说,会用结果替换源操作数P,本专栏大部分约定两地址指令格式为:
Operation destination, source
- 在实际计算机中,一般不允许同一条指令中使用两个存储地址。大多数计算机都规定一个地址是存储器地址,另一个地址是寄存器。
单地址指令:
单地址指令 有些计算机实现单地址指令,其格式为:
Operation address
指令中只提供了操作数地址,而指令却需要至少两个地址,处理器不得不使用一个不需要显示地址的第二操作数,第二个操作数来自CPU内一个叫累加器(accumulator)的寄存器。
如图,描述了一条单操作数指令执行过程中的信息流,操作结果将一直保存在寄存器中,直到另一条指令将它送入存储器。
计算机分类:
可以按照计算机的指令处理数据的方式对计算机分类
- 存储器 - 存储器型:一条指令能够从存储器中读出源操作数,对数据完成某个操作,并将结果保存在存储器中
- 寄存器 - 存储器型:能够处理两个数据,其中一个位于存储器中,另一个位于寄存器中,结果要么被写回存储器,要么被写回寄存器,如Intel IA32 CPU体系结构
- 寄存器 - 寄存器型:只能对寄存器中的内容进行操作,这些计算机必须通过LOAD指令将数据读入寄存器并使用STORE指令将数据从寄存器送回存储器。由于LOAD 和STORE操作是仅有的存储器访问指令这些计算机也被称为load/store 型计算机,如ARM和MIPS CPU体系结构
1.6 计算机系统概览
1.6.1 存储层次
由于CPU与存储器的性能之间的差距不断加大,通过在使用数据之前将它们从存储器中取出来消除相对慢速的存储器的影响,以降低延迟。
如图,描述了经典的存储层次图,展示了计算机中存储部件的类型、速度以及在PC机中的典型容量。
- 寄存器:存放处理器的工作数据
- Cache:缓存常用数据的快速存储器存放工作数据
- DRAM :存放工作数据
- 硬盘:保存程序和数据
注意,硬盘的容量是寄存器的4000万倍,但速度却比寄存器慢2000万倍!
Cache高速缓存
- 经常被用到的数据保存在cache中,Cache的访问时间比主存短得多,cache保存主存中经常使用的数据的副本。Cache系统与计算名机的地址总线和数据总线相连,监听CPU与存储器之间的事务:
- 只要cache注意到CPU发出的地址与它保存的某个数据元素地址相同,就把这个数据发送个CPU,而不会去主存中取数据。
- 一级缓存(集成在CPU中)&二级缓存&三级缓存
DRAM
存放正在执行的程序的主存是由一种叫作动态随机访问存储器(Dynamic Random Access Memory,DRAM)的易失性半导体存储器构成的立即存取存储器。
1.6.2 总线
总线将计算机的两个或多个功能单元连接在一起并允许它们相互交换数据。总线还将计算机与外设连接在一起。
如图,描述了一个没有总线的假象系统的结构,节点之间的互连复杂并且凌乱,若要添加一个新单元,必须在新单元与它所连接的每个单元之间增加一条新连接:
如图,展示了通过公共总线将所有单元连接在一起的好处,此时只有一条高速数据通路,每个单元通过一个接口与这条通路相连:
缺点 每次只有唯一一个设备能够与其它设备通信,因为这里只有一条信息通路。如果两个设备同时请求使用总线,它们不得不去竞争总线的控制权。用术语仲裁来描述多个设备竞争同一资源的过程。
总线术语
-
宽度
一般用并行数据通路的数量来定义总线的宽度。一条64位宽的总线一次能传送64位(8个字节)信息
-
带宽
总线带宽是衡量信息在总线上的传输速率的一项指标。带宽的单位要么是B/s,要么b/s。在保持数据传输率不变的情况下增加总线宽度,可以提高带宽。
-
延迟
延迟是从发出数据传输请求到实际数据传输的时间间隔。总线延迟通常包括传输开始之前进行总线仲裁的时间。
多总线系统 现代计算机中有多条总线,包括片内总线、功能单元间(如CPU和存储器间)的总线以及总线间的总线,如图描述了一个多总线系统:
- 多总线运行并发操作
- 总线可能具有完全不同的特点和操作速度