五、计算机组成
计算机组成部件可以分为三大类(子系统):中央处理单元(CPU)、主存储器和输入/输出子系统。
5.1 中央处理单元(CPU)
中央处理单元用于数据的运算,分为算术逻辑单元(ALU)、控制单元和寄存器组三部分。
5.1.1 算术逻辑单元(ALU)
能够对数据进行逻辑、移位和算数运算。
5.1.2 寄存器组
用来临时存放数据,是高速独立的存储单元。CPU的运算离不开大量的寄存器的使用。
数据寄存器:在过去,计算机只有几个数据寄存器用来存储输入数据和运算结果。现在,由于越来越多的复杂运算改由硬件设备实现,所以计算机在CPU中使用几十个寄存器来提高运算速度,并且需要寄存器来存放一些运算的中间结果。在图 5-2 中,寄存器被命名为 到 。
指令寄存器:基于冯诺依曼模型的计算机,其程序也是储存在内存中的,所以在程序运行时,CPU需要寄存器来存储指令。CPU从内存中逐条取出指令,并存放在指令寄存器中,解释并执行指令。
程序计数器:当程序开始运行时,CPU从内存中逐条取出指令,程序计数器首先保存第一条指令的地址,在取指令过程完成后,程序计数器+1,指向下一条指令的内存地址。
5.1.3 控制单元
控制单元用于控制各个子系统工作,控制是通过从控制单元到其他子系统的信号来进行。程序计数器和指令寄存器是控制单元的一部分。
5.2 主存储器
主存储器是存储单元的集合,每个存储单元都有唯一的标识,称为地址。存储单元可以是1字节、2字节或4字节。数据以称为字的位组的形式在内存中传入和传出。CPU一次处理的数据的位模式的长度就是这台计算机的字长,如,32位计算机的字长为32。
地址空间:尽管在编程的时候,程序员可以使用不同的名称来标记不同的数据,但在硬件层面,每个数据存储的内存空间的地址是由位模式来表示的。地址由无符号二进制整数表示。所有在存储器中标识的独立的地址单元的总数称为地址空间。对于同样大小的内存,如果寻址的字长不同,那么所需要的地址的位数就不同,如下面例题所示:
如果寻址内存中的任意一个字(字长2字节),那么就需要位来标识每一个字。但在现实中,寻址是需要物理设备实现的,所以一台计算机的地址空间应该与它的地址总线的条数有关,因为总线的条数确定,它能访问地址的最大数量也就确定了(我的理解)。
5.2.1 存储器的类型
随机存取存储器(RAM):是计算机主存的主要组成部分。在随机存取设备中,可以使用存储单元地址随机存取一个数据项,而不需要存取(地址)位于它前面的所有项。RAM的另一个特点是易失性,当系统断电后,信息(程序或数据)将丢失。
只读存储器(ROM):用户只能读不能写,内容是由制造商写进去的。它的优点是非易失性,断电后信息也不会丢失,可以用来存储那些关机后也不能丢失的程序或数据。例如,用ROM存储那些在开机时运行的程序。
5.2.2 存储器的层次结构
计算机用户需要许多存储器,尤其是速度快其价格低的存储器。但通常这两项并不能兼顾,因此需要一种折中的办法。解决的方法是采用存储器的层次结构。
当对速度要求很高时,使用少量高速存储器,CPU中的寄存器就是这种存储器;用适量的中速存储器来存储要经常访问的内容;用低速存储器来存储那些不经常访问的数据,主存就是这种。
5.2.3 高速缓冲存储器
高速缓冲存储器的存取速度要快于主存,但慢于CPU的寄存器。高速缓冲存储器通常容量较小,常被置于CPU与主存之间。
高速缓冲存储器在任何时候都有主存中一部分内容的副本。CPU在存取主存中的一个字时,按以下步骤进行:
1. 首先检查高速缓冲存储器;
2. 如果要存取的字在,CPU就将它复制;如果不存在,CPU从主存中复制一份从需要存取的字开始的数据块(因为下一个要存取的字大概率是上一个的后续)。该数据块将覆盖高速缓冲存储器中的内容;
3. CPU从高速缓冲存储器中进行存取。
高速缓冲存储器容量小但效率高是由于80-20规则。据观察,通常计算机花费百分之八十的时间来读取百分之二十的数据。
5.3 输入/输出子系统
这个子系统可以使计算机和外界通讯,并能够在断电的时候存储程序和数据。分为两大类:存储设备和非存储设备。
5.3.1 非存储设备
非存储设备可以使计算机和外界通讯,但不能存储信息。两个最常见的非存储设备是键盘和监视器,打印机是一种用于产生永久性记录的输出设备。
5.3.2 存储设备
有时称为辅助存储设备,通常分为磁介质和光介质两种。
5.3.2.1 磁介质存储设备
磁介质存储设备使用磁性来存储数据,有磁性表示1,无磁性表示0.
磁盘:磁盘由一张张地磁片叠加而成,这些磁片由薄磁膜封装起来。信息是通过磁头读写磁介质表面来进行存取的。
为了将数据存储在磁盘表面,每个盘面都被划分成磁道,每个磁道又被分为若干扇区,磁道由磁道间隔隔开,扇区由扇区间隔隔开。磁盘是一个随机存取设备,在某一时间可读取地最小存储区域只能是一个扇区。数据可以存储在一个或多个扇区上,但信息的获取不需要通过读取磁盘上的其他信息。
磁盘的性能取决于角速度(转动快慢)、寻道时间(磁头找到数据所在磁道的时间)、传送时间(数据从磁盘转移到CPU或内存的时间。
磁带:磁带用两个滚轮承接起来,当转动的磁带通过读/写磁头时,就可以通过磁头来读写磁带上的数据。
磁带的宽度可分为九个磁道,八位存储数据,一位用作错误检测。磁带是顺序存取设备,要想读取指定的数据,必须先按照顺序读取它前面所有的数据。尽管磁带速度慢,但是它非常便宜。
5.3.2.2 光介质存储设备
使用光(激光)技术来存储和读取数据。
只读光盘(CD—ROM):使用与CD相同的技术,两者间唯一的区别是增强程度不同,只读光盘更健壮,纠错能力强。下图给出了只读光盘的制造和使用步骤。
首先使用高能红外激光在塑料涂层上刻写位模式来制造主盘。激光束使位模式变成一系列坑(代表0)和纹间表面(代表1)。然后依照主盘,做成相应的模盘,模盘上凸起表示0。最后,溶解的聚碳酸酯树脂被注入模盘,同时将一层非常薄的铝(反射层)加到聚碳酸酯树脂上,最后加一层保护漆和标签。
在读取光盘时,激光束经过坑处的表面会反射,到反射层也会反射,所以有坑的地方会反射两次,纹间表面反射一次,所以纹间表面反射的光更多。这就可以读取到光盘上的数据。
可刻录光盘(CD—R):写一次,读多次。不需要使用主盘和模板,在聚碳酸酯树脂和反射层之间加一层染料,高能激光束在染料上烧制深色点(用来模拟坑)。读取时,深色部位不反射光。
可重写光盘(CD—RW):与可刻录光盘相似,但烧制的材料可以复原。读取与可刻录光盘相似。
DVD:有更大的存储空间,能够存储更大的视频数据等。
5.4 子系统的互联
5.4.1 CPU与存储器的连接
数据总线:由多根线组成,每根线每次传送1个位的数据。线的数量取决于计算机字的大小。例如,计算机的字是32位(4字节),那么需要32根线的数据总线,以便同一时刻同时传送32位的数据。
地址总线:允许访问存储器中某个字的地址,地址总线的线数取决于存储空间的大小。例如,存储器容量为2的n次方个字,那么地址总线一次需要传送n位的地址数据,因此需要n根线。
控制总线:负责在中央存储器和内存之间传送信息。例如,必须有一个代码从CPU发送到内存,用于指定进行的是读还是写操作。控制总线的线数取决于计算机所需要 的控制命令的总数。如果计算机由2的m次方条控制命令,那么控制总线就需要有m根,因为m位可以定义2的m次个不同的操作。
5.4.2 I/O设备的连接
输入/输出设备不能直接与CPU和内存的总线连接,因为它们数据的本质不同,而且传输速度也比CPU和内存慢很多,所以必须要有控制器(接口)来将这些设备连接到总线上。
控制器:或者说接口,清除了输入/输出设备与CPU和内存在本质上的障碍。控制器可以是串行或并行的设备。串行只有一根线连接到设备上,并行则有多根线连接到设备上。如今最常用的控制器有:SCSI、火线、USB及HDMI。
SCSI:小型计算机系统接口,是一个8、16或32线的并行接口。如图,它提供了菊花链连接,连接链的两端都必须有终结器,并且每个设备都必须有唯一的地址。
火线:是一种高速的串行接口,数据采用数据包的形式传送。它可以在一条菊花链或树形连接上连接多达63个设备,同SCSI不同,它不需要终结器。
USB:通用串行总线,用以连接与计算机相连的一些低速和高速设备。多个设备可以被连接到一个USB控制器上,这个控制器称为根集线器。USB-2允许多达127个设备组成的树状拓扑结构连接到一个USB控制器上,其中控制器作为树的根,设备作为末端节点。控制器(根集线器)与其他集线器的不同之处在于根集线器能感知到树中其他集线器的存在,而其他集线器只是简单的传送数据。设备可以不需要关闭计算机很容易的被移除或连接到树中,这称为热交换。USB使用4根线的电缆,两根线(+5V和地)用来向低压设备提供电压,其他两根线(缠绕在一起,以减小噪声)用来传送数据、地址和控制信号。USB有三种不同的连接头:A、B、C。USB-2提供三种传送速率:1.5Mbps(每秒兆位)、12Mbps和480Mbps。低速率可以用于低速设备,如键盘鼠标,中速率用于打印机,高速率用于大容量的存储设备。USB3.0是对计算机连接方对通用串行总线(USB)标准的再一次修订,增加了一个新的叫做“SuperSpeed”(超感)传输模式,可以将数据传输速率提升至4.8Gbit/s,根据承诺,USB3.0的速率将更新至10Gbit/s。
HDMI(高清清晰度多媒体接口):是现有视频模拟标准的数字化代替品,它可以用来从一个资源向另一个兼容的计算机显示器、 视频投影仪、数字电视或数字音像设备传输视频数据和数字音像数据。
5.4.3 输入/输出设备的寻址
I/O独立寻址:用来存取内存的指令和存取输入输出设备的指令是不同的,所以输入输出设备可以和内存有相同的地址,根据指令就能分辨出来是在内存操作还是在输入输出设备操作。
I/O存储器映射寻址:CPU用来存取输入输出设备和存取内存的指令是一样的,将输入输出设备的地址看作是内存中的地址,内存就不能再使用输入输出设备使用的地址,也就是说,内存大小减小了。
5.5 程序执行
5.5.1 机器周期
CPU利用重复的机器周期来执行程序中的指令,一步一条,从开始到结束。一个简化的机器周期包括3步:取指令、译码和执行。
取指令:在取指令阶段,控制单元命令系统将下一条要执行的指令复制到CPU的指令寄存器中,被复制指令的内存地址放在程序计数器中,复制完成后,程序计数器+1,指向下一条将要执行的指令。
译码:控制单元将指令译为机器能执行的二进制代码。
执行:控制系统控制CPU的某个部分执行指令。
5.1.2 输入/输出操作
因为输入/输出设备的运行速度比CPU慢很多,所以CPU的操作在某种程度上要和输入/输出设备同步,有三种方法用于同步。
程序控制输入/输出:CPU等待I/O设备。当CPU遇到一条I/O指令时,它就停止工作直到数据传输完毕。CPU不停的查询I/O设备的状态:如果准备好了,数据就被传入CPU;如果没准备好,CPU就会一直查询直到设备准备好。这种方法的问题就是,CPU浪费了大量的时间去查询I/O设备的状态,降低了性能。
中断控制输入/输出:CPU先告知设备即将开始传输,然后就去做其他工作。当I/O设备准备好的时候,它通知(中断)CPU,开始传输任务。
直接存储器存取(DMA):这种方法用于在高速I/O设备间传输大量数据块,DMA承担一部分CPU的功能。CPU首先发送消息给DMA。这些消息包括传输类型、内存单元的起始地址以及传输的字节数,之后CPU就可以做其他工作。当准备好传输数据时,DMA通知CPU它需要获得总线的使用权,CPU在这时候停止使用总线,等待传输完成。在这种方法中,CPU只有在数据传输时是空闲的,大大提高了CPU的性能。
5.6 不同的体系结构
5.6.1 CISC(复杂指令集计算机)
CISC体系结构的设计策略是使用大量的指令,包括复杂指令,所以程序设计比较容易,因为每一项复杂的工作都有对应的指令。但这使得CPU和控制单元的电路非常复杂。
CISC体系结构的设计者提出了减少这种复杂性的解决方案:程序在两个层面上运行,CPU不直接执行机器语言指令,CPU只执行被称为微操作的简单操作,复杂指令被转化为一系列简单操作后由CPU执行,使用微操作的程序设计被称为微程序设计。
CISC体系结构的一个例子是英特尔公司开发的奔腾处理器。
5.6.2 RISC(精简指令集计算机)
RISC体系结构的策略是使用少量的指令完成最少的简单操作,复杂指令用简单指令模拟。在RISC中程序设计比较困难,因为复杂指令都需要使用简单指令来完成。
5.6.3 流水线
我们直到简化的机器周期有三个部分:取指令、译码和执行。在早期的计算机中,只有当上一条指令执行完成后,下一个机器周期才会开始。现代计算机使用流水线来改善吞吐量(单位时间内完成的指令总数)。这个理念是如果控制单元能够同时进行不同指令的不同阶段,那么运行效率就会大大增加。
5.6.4 并行处理
计算机传统上有单个控制单元、单个算术逻辑单元、单个内存单元。随着硬件技术的发展,现代计算机可以有多个控制单元、多个算术逻辑单元、多个内存单元。这个思想称为并行处理,像流水线一样,并行处理能改善吞吐量。
SISD组织(单指令流单数据流):计算机只有一个控制单元、一个算术逻辑单元、一个内存单元。指令被顺序执行,每条指令可以存取数据流中的一个或多个数据项。
SIMD组织(单指令流多数据流):计算机有单个控制单元、多个算术逻辑单元和一个内存单元。所有处理器单元从控制器接收相同的指令,但对不同的数据进行操作。
MISD组织(多指令流单数据流):是一个概念,从未被实现。
MIMD组织(多指令流多数据流):真正的并行处理体系结构,可同时执行多个任务。处理器从控制器接收不同的指令,对不同的数据进行操作。
5.7 简单计算机
为了解释计算机的体系结构,还有指令处理,引入一台简单计算机(非真实)。
简单计算机包含三个部分:CPU、输入/输出子系统、主存储器。
CPU包含三个部分:控制单元(指令寄存器、程序计数器)、算术逻辑单元、寄存器(16个16位寄存器)。
主存储器:256个16位的存储单元,主存中存储数据和程序。
输入/输出子系统:键盘和监视器,地址采用映射寻址。
指令集:简单计算机具有16条指令集合的能力。每条计算机指令由两部分组成:操作码和操作数。操作码说明了执行的操作类型。每条指令16位,被分为4位一组的4个域,最左边的域是操作码,其他三个域含有操作数的地址。
现在假定需要相加161+254=415.每个周期由三步组成,那么完成这个运算需要五个周期。
周期1:
第一个周期开始时,程序计数器指向第一个要执行的指令。
取指令:控制单元取出存储在该地址的指令,放入IR中,PC+1;
译码:控制单元将指令译为二进制码(1040)16为R0<--M40;
执行:控制单元将整数副本放入寄存器中。
接下来的几个机器周期都很相似,只有指令的区别。
无论是读取还是存储操作,CPU都会从内存中输入数据或是将输出数据放回内存中,这时因为CPU中的寄存器数量并不多,无法存放过多的数据,完成简单的加法可以在CPU中存储,如果进行1000个数的排序,那么CPU的寄存器是完全不够的,所以要将数据放在内存中。