"> "> 计算机组成原理-计算机的硬件组成 | Yufei Luo's Blog

计算机组成原理-计算机的硬件组成

中央处理器(CPU)

CPU组成

冯·诺依曼结构CPU的组成部件包括算术逻辑部件(ALU),寄存器,和连接它们的内部总线。从逻辑上说,这些组成部件可以被划分为运算器和控制器两大部分。

运算器接收控制器送来的命令并执行相应的动作,对数据进行加工和处理。它主要由算术逻辑单元(ALU,进行算数和逻辑运算)、暂存寄存器(暂存从主存中得到的数据)、通用寄存器(存放操作数和各种地址信息)、状态字寄存器(PSW,保存算术逻辑运算指令或测试指令产生的状态信息)、移位器(对操作数或计算结果进行移位运算)和计数器(CT,控制乘除运算的操作步骤)组成。

控制器分为硬布线控制器和微程序控制器两种,它的功能是执行指令,每条指令的执行是由控制器发出的一组微操作实现的。控制器包括程序计数器(PC,指向下一条指令在主存内的存放地址)、指令寄存器(IR,保存当前执行的指令)、指令译码器(对操作码字段进行译码,从而向控制器提供特定的操作信号)、存储器地址寄存器(MAR,存放要访问的主存单元的地址)、存储器数据寄存器(MDR,存放向主存写入的信息或是从主存读取到的信息)、时序系统(产生各种时序信号)、微操作信号发生器(根据IR、PSW的内容和时序信号,产生控制信号)。注意MAR、MDR和IR是用户不可见的。控制器的工作原理是根据指令操作码、微指令序列和条件信号来形成计算机各部件需要用到的控制信号。

另外,在现代处理器中,为了实现操作系统的虚拟内存功能,在CPU内部封装了一个内存管理单元(Memory Management Unit, MMU),用于实现虚拟地址和物理地址之间的相互转化。

指令

机器指令

对于一条汇编指令,它的机器码分为两部分:操作码字段(对应于汇编指令的类型)和地址码字段(对应于汇编指令的操作数)。指令字长由操作码长度、操作数地址的长度和个数共同决定。

CPU支持的所有操作指令(即所有的汇编指令)组成指令集。指令集的一个重要性质就是字节编码必须有唯一的解释,任意一个字节序列要么是一个唯一的指令序列的编码,要么就不是一个合法的字节序列。

根据指令集大小的不同,分为CISC(复杂指令集计算机,如x86-64)和RISC(精简指令集计算机,如嵌入式系统)指令集。它们的主要区别如下:

CISC RISC
指令数量很多(可达1000以上),各个指令使用频率相差很大 指令数量少得多(通常少于100),复杂指令用简单指令组合
有些指令的延迟很长 没有较长延迟的指令
编码可变长度 编码固定长度
指定操作数的方式很多样 简单寻址方式
可以对内存和寄存器操作数做运算 只能对寄存器操作数做运算
对机器级程序来说实现细节不可见 对机器级程序来说实现细节可见
有条件码 没有条件码
栈密集的过程链接 寄存器密集的过程链接
采用微程序控制器 采用组合逻辑实现控制器
有专用寄存器 多个通用寄存器

RISC指令集能够充分利用VLSI芯片的面积,便于实现指令流水,也便于设计,但是不易实现指令系统的兼容。在现代处理器中,常常将二者结合使用。

指令周期

指令周期指的是取出并执行一条指令所需的全部时间,一个指令周期最多包含4个工作周期:取指周期(取出指令并分析)、间址周期(可能有,如果指令中包含主存单元的地址则需要从主存单元寻址)、执行周期(不同指令的执行时间不等,且数据流也不同)、中断周期(可能有,如果有则需要保存程序断点)。一个工作周期包含了若干个时钟周期(CPU操作的最基本单位)

指令流水

指令流水将指令执行的过程分解为许多部分,每一部分由精心设计的硬件分别执行,都可以并行运行。这样,便可以像流水线一样执行这些指令(时钟周期必须能够满足最慢操作的执行需要),实现指令级并行。如下图所示:

image-20201012233537897

冒险

流水线中可能会出现下一个时钟周期中下一条指令不能执行的情况,这种情况被称为冒险,它会显著影响流水线性能。主要分为三种情况:

  1. 结构冒险:硬件不支持多条指令在同一时钟周期执行
  2. 数据冒险:一条指令必须等待另一条指令的完成而造成流水线暂停。解决数据冒险可以采用旁路的办法,即提前从内部寄存器中取出数据;对于取数—使用型数据冒险,也可以通过重新安排代码顺序来避免
  3. 控制冒险:又叫分支冒险,因为在分支中取到的指令不是所需要的,而导致指令不能在预定的时钟周期内执行。计算机常采用分支预测的方法,预测分支结果并立即沿着预测方向执行,流水线的效率与预测的成功率有关

流水线的多发技术

  • 超标量技术:使用超标量技术,可以在一个时钟周期内并发执行多条独立指令。
  • 超流水线技术:在一个时钟周期内再分段,使得一个时钟周期内一个功能部件可以被多次使用。
  • 超长指令字技术:将多条能够并行操作的指令组合成一条具有多个操作码字段的超长指令字,使用多个部件在一个时钟周期内同时执行。

处理器级并行

  • 数据并行计算机:包含SIMD处理器和向量处理器。SIMD处理器是由许多在不同数据集合上执行同样指令序列的完全相同的处理器组成,如GPU便严重依赖于SIMD处理器;而向量处理器的所有运算是由一个单独的高度流水的功能部件实现。
  • 多处理器:多个CPU同时工作,它们共享内存。CPU之间需要通过软件互相协调,从而避免互相影响。
  • 多计算机:将多个计算机互联,互相之间通过发送消息进行通信。

总线

分类

总线是连接计算机各个部件的信息传输线,是各个部件共享的传输介质。总线分为如下几种类型:

  • 片内总线:芯片内部的总线
  • 系统总线:计算机各个部件之间的信息传输线,包括数据总线(双向,与机器字长和存储字长有关)、地址总线(单向,与存储地址和I/O地址有关)和控制总线
  • 通信总线:用于计算机系统之间或者计算机系统和其他系统之间的通信

总线结构

如图所示为现代Core i7系统中使用的总线结构:

image-20201013215418020

除此之外,还有一些其他的总线结构:

image-20201013202615024

总线控制

判优控制

主设备对总线具有控制权,从设备响应从主设备发来的总线命令,主设备需要判定哪一个从设备优先工作。有三种不同的方式:链式查询、计数器定时查询、独立请求

通信控制

总线传输分为四个阶段:申请分配阶段、寻址阶段、传输阶段、结束阶段。在这一个传输周期内,需要解决通信双方的协调配合问题。常用的几种通信方式有:

  • 同步通信:使用统一时标控制数据传送
  • 异步通信:采用应答方式,没有公共时钟标准
  • 半同步通信:同步与异步结合。发送方使用系统的时钟前沿发信号,接收方使用时钟后沿判断和识别;可以允许不同速度的模块和谐工作,并增加一条等待响应信号
  • 分离式通信:在一个总线传输周期中,部分阶段总线内没有数据的传输,此时便放弃总线的使用权,等到需要时再次申请。这样便可提高总线的有效占用,从而充分挖掘了系统总线每个瞬间的潜力。

存储设备

主存储器

随机访问内存(Random Access Memory, RAM)

RAM分为两类:静态RAM(Static RAM, SRAM)和动态RAM(Dynamic RAM, DRAM)。SRAM比DRAM的访问速度更快(SRAM为0.5~2.5ns,DRAM为50~70ns),但是价格也更贵。因此SRAM常被用作CPU或是其他设备的缓存,而DRAM常被用作主存或是显卡的内存。RAM在断电之后,会丢失掉其内部的所有信息。

SRAM

SRAM将每个位存储在一个双稳态的存储器单元中,每个单元是用一个六晶体管电路来实现的。这个电路可以无限期地保存在两个不同的电压配置或状态之一,其他任何状态都是不稳定的。由于双稳态特性,即使是受到干扰来扰乱电压,干扰消除之后电路也可以恢复到稳定值。

DRAM

DRAM的原理

DRAM将每个位存储为对一个小电容(\(10^{14}F\))的充电,因此DRAM存储器可以造的非常密集,每个存储单元包括一个电容器和一个访问晶体管。

DRAM对于干扰非常敏感,当电容的电压被扰乱之后就无法再恢复。同时也有很多原因会导致漏电,使得DRAM单元在10~100毫秒内失去电荷,因此内存系统需要周期性地读出并刷写内存中的每一位。一些系统使用纠错码,将计算机中的字多编码几个位,从而发现并纠正一个字中任何单个的错误位。

DRAM的存储结构

DRAM芯片中的单元被分为\(d\)个超单元,每个超单元都由\(w\)个DRAM单元组成,这样一个\(d\times w\)的DRAM共存储了\(dw\)位信息。超单元被组织为一个\(r\)\(c\)列(\(rc=d\))的长方形阵列,每个超单元有形如\((i,j)\)的地址格式。将DRAM组织为二维阵列可以降低芯片上地址引脚的数量,但是分两步发送地址增加了访问时间。通过芯片与外部连接的引脚,可以选择超单元地址,并将数据输入芯片或是从芯片中输出。

超单元内容读取的过程如下图所示:

image-20201009233043208

DRAM芯片被封装在内存模块中,它插到主板的扩展槽上。每个DRAM芯片被连接到称为内存控制器的电路,这个电路可以一次传送\(w\)位到每个DRAM芯片,或是一次从每个DRAM芯片传出\(w\)位。通过将多个内存模块连接到内存控制器,便可聚合成主存。当控制器收到一个地址A时,控制器选择包含A的模块\(k\),并将A转化成该模块对应的\((i,j)\)的形式发送给\(k\).

下图所示是从DRAM芯片中读取一个64位字到CPU的过程:

image-20201009232705351
增强的DRAM
  • 快页模式DRAM(FPM DRAM):允许对同一行连续访问时,直接从行缓冲区得到服务。
  • 扩展数据输出DRAM(EDO DRAM):是FPM DRAM的增强形式,允许CAS(Column Access Strobe,列访问选通脉冲)信号在时间上靠的更加紧密一些。
  • 同步DRAM(SDRAM):使用与驱动内存控制器相同的外部时钟信号的上升沿,从而能够更快地输出它的超单元的内容。
  • 双倍数据速率同步DRAM(DDR SDRAM):是对SDRAM的增强,使用两个时钟沿作为控制信号,从而使得DRAM的速度翻倍。
  • 视频RAM(VRAM):用于图形系统的帧缓冲区中,与FPM DRAM类似,但是它允许对内存并行地读和写,它的输出是通过依次对内部区的整个内容进行移位得到的。

非易失性存储器(Read-Only Memory, ROM)

非易失性存储器在断电后,其内部的信息仍然保存。非易失性存储器的种类很多,而且目前一些ROM中的类型支持读写操作,但是其整体都被称为只读存储器。根据被重编程(写)的次数和机制,ROM主要有以下几种类型:

  • PROM(Programmable ROM,可编程ROM):每个存储器单元有一种熔丝,只能用高电流熔断一次
  • EPROM(Erasable Programmable ROM,可擦写可编程ROM):有一个透明的石英窗口,允许光到达存储单元。紫外线光照过窗口,EPROM单元被清除为0;把1写入EPROM需要使用特殊设备。它被擦除和重编程的次数可以达到1000次。
  • EEPROM(Electrically Erasable PROM,电子可擦除PROM):可以直接在印制电路卡上编程,不需要物理上独立的编程设备。它能够被编程次数的数量级约为\(10^5\)次。闪存便是基于EEPROM的存储技术,SSD也是一种基于闪存的磁盘驱动器。

存储在ROM设备中的程序被称为固件,当一个计算机系统通电之后,它会运行存储在ROM中的固件。一些系统在固件中提供了少量基本的输入和输出函数,一些复杂设备也依赖于固件翻译来自于CPU的I/O请求。

主存的访问

数据流通过被称为总线的共享电子电路在处理器与主存之间传输,每次CPU和主存之间的数据传输都是通过一系列步骤完成的,这些步骤被称为总线事务。读事务从主存传送数据到CPU,写事务从CPU传送数据到主存。

以汇编指令movq A, %rax为例,其步骤分为3步:首先将内存地址A放在系统总线上,I/O桥将信号传递到内存总线;然后主存从内存总线中读取地址,从中取出地址A中的数据字,并将其写入到内存总线。I/O桥将内存总线信号转换为系统总线信号,并沿着系统总线传递;最后CPU从系统总线上面读取数据,并将数据存储在寄存器中。这一步骤如下图所示:

image-20201011210959156

反之,如果执行的是如指令movq %rax, A这样的写操作时,CPU首先把地址放到系统总线上,内存从内存总线中读取地址,并等待数据到达;接下来CPU将%rax中的数据字复制到系统总线;最后主存从内存总线中读取数据字,并将其存入到DRAM中。这一步骤如下图所示:

image-20201011210034274

辅助存储器

磁盘

磁盘构造

磁盘的构造如下图所示:

image-20201011221238694
image-20201011221313895

一个磁盘是由多个盘片构成的,每个盘片有两个表面,表面上覆盖着磁性记录材料。盘片中央是一个可以旋转的主轴,使得盘片以固定的旋转速率旋转,通常是5400~15000转每分钟。

磁盘用读/写头来读写存储在磁性表面的位,而读写头连接到一个传动臂—端。通过沿着半径轴前后移动这个传动臂,驱动器可以将读/写头定位在盘面上的任何磁道上,这样的机械运动称为寻道。一旦读/写头定位到了期望的磁道上,那么当磁道上的每个位通过它的下面时,读/写头可以感知到这个位的值(读该位),也可以修改这个位的值(写该位)。有多个盘片的磁盘针对每个盘面都有一个独立的读/写头。读/写头垂直排列,一致行动。在任何时刻,所有的读/写头都位于同一个柱面上。

这些结构被封装在一个密封容器中,从而防止磁盘损伤或是读/写头冲撞。

同时,磁盘驱动器也具有一块缓存,有时也被称为磁道缓冲区。这块缓存只是大小比较小的内存(8MB、16MB等),驱动器可以使用它来保存从磁盘读取或写入磁盘的数据。

磁盘容量

磁盘的每个表面由一组被称为磁道的同心圆组成,每个磁道被划分成一组扇区,每个扇区包含相等数量的数据位,数据便被编码在扇区上的磁性材料中。扇区之间由一些间隙分割开,间隙存储标识扇区的格式化位,不存储数据位。

磁盘容量的计算公式:磁盘容量=每扇区字节数×每个磁道的平均扇区数×每个表面的磁道数×每张盘片的表面数×磁盘盘片数

磁盘访问时间

磁盘以扇区大小的块来读写数据。对一个扇区的访问时间包括三个主要部分:

  • 寻道时间:传送臂将读/写头定位到包含目标扇区的磁道上所需的时间。寻道时间依赖于传动臂在盘面上的移动速度以及读写头以前的位置。磁盘中的平均寻道时间通常为3~9ms。
  • 旋转时间:驱动器等待目标扇区的第一个位旋转到读/写头下所需的时间。这个步骤的时间依赖于磁盘旋转速度以及读/写头到达目标扇区时盘面的位置。最坏情况下需要等待磁盘转一整圈(以5400转的磁盘为例,需要约12ms)。
  • 传送时间:驱动器读/写将扇区中的数据所需的时间。一个扇区的传送时间依赖于旋转速度和每条磁道的扇区数目。传送时间相比于寻道时间和旋转时间要少很多。

逻辑磁盘块

在操作系统中,磁盘常常被分为若干个逻辑块。磁盘封装中有一个被称为磁盘控制器的固件设备,维护逻辑块号和实际的物理磁盘扇区直接的映射关系。当操作系统执行一个I/O操作时,控制器上的固件会执行一个快速表查找,将逻辑块号翻译成一个(盘面,磁道,扇区)的三元组,从而寻找到逻辑块对应的物理块。

磁盘的访问

CPU使用一种被称为内存映射I/O的技术向I/O设备发送命令,地址空间中有一块地址是为与I/O设备通信保留的,每个这样的地址被称为I/O端口。当一个设备连接到总线时,它被映射到一个或者多个端口。

磁盘被通过主机总线适配器连接到计算机的I/O总线上去,使用由主机总线接口定义的通信协议。以磁盘读为例,其过程如下图所示:

image-20201011224957311

固态硬盘

固态硬盘是一种基于闪存的存储技术,一个SSD封装由一个或多个闪存芯片和闪存翻译层组成,闪存芯片替代了传统旋转磁盘中的机械驱动器,而闪存翻译层是一个固件设备,将对逻辑块的请求翻译成对物理设备的访问。在SSD中,闪存被划分为多个块,而每个块也被划分为多个页,数据以页为单位进行读写。

比起旋转磁盘,SSD的随机访问比旋转磁盘更快,同时能耗更低,也更结实。但是反复写会导致SSD的磨损,而且数据损坏之后难以恢复,因此这些存储单元常使用均衡磨损技术,将写操作尽量平均地分配到SSD中的每个存储单元。

光盘

光盘在写入信息时,是通过激光束对光盘表面的记录层进行烧刻,使其光学性质发生改变,从而记录二进制信息。在读取信息时,使用能量较低的激光束照射到盘面,根据光接收器接收到光的强弱并将其转换为二进制信息便可读取数据。

常见的光盘类型有:

  • CD-ROM:只读光盘,出厂时数据已经写好,之后无法擦除
  • CD-R:可刻光盘(CD-Recordable),只能刻写一次
  • CD-RW:可擦写光盘(CD-ReWriteable),可以多次重写
  • DVD:数字多用途盘(Digital Versatile Disk),相比于CD的存储容量更大
  • 蓝光光盘(Blu-Ray):使用蓝色激光取代DVD的红色激光,因此存储容量相比于DVD更大。

I/O设备

分类

I/O设备大致可以分为三种:

  • 人机交互设备:键盘、鼠标、打印机、显示器等
  • 计算机信息存储设备:磁盘、光盘、U盘等
  • 机—机通信设备:调制解调器等

接口

计算机的I/O设备通过I/O接口连接到计算机的I/O总线上。I/O接口的组成如下图所示:

image-20201013212407776

I/O接口包括设备组成电路、命令寄存器和命令译码器、数据缓冲寄存器、设备状态标记和控制逻辑电路五部分,并通过数据线、地址线、命令线和状态线四条线路实现设备与系统之间的交互。

通过I/O接口,可以实现数据缓冲、数据格式转换、电平转换等,从而进一步实现选址、传送命令、传送数据和反映设备状态等功能。

与主机的信息传送

I/O设备与主机的信息传送分为3种方式:程序查询方式、程序中断方式和DMA(Direct Memory Access)方式。在这三种方式中,I/O设备的自治能力越来越强,同时效率也越来越高。

这三种方式的执行流程以及CPU效率比较如下图所示:

image-20201013233243802

程序查询方式

使用程序查询方式时,CPU会不断地查询I/O的状态,直到设备准备就绪。然后进行CPU与I/O设备之间的信息传送。这种方式会使得CPU踏步等待,效率很低。

如果有多个设备,程序会轮转查询设备1~N的状态标记,如果发现某个设备准备就绪,则处理该设备的请求,反之则接着查询下一个设备,如此循环往复。

程序中断方式

当I/O设备需要与计算机进行数据传输时,会在自身准备好之后发出一个I/O中断请求。CPU响应I/O中断,终止执行当前正在执行的程序,并开始执行中断服务程序,实现与I/O设备之间的信息传送。中断服务程序首先会保护现场,然后再执行中断服务,执行完成之后恢复现场并返回。这种方式没有踏步等待现象,但是需要中断现有程序。

一些中断服务程序不允许被中断(单重中断),也有一些中断服务程序能够被级别更高的中断源中断(多重中断)。

DMA (Direct Memory Access)

DMA是一种高速的数据传输操作,可以使得I/O设备与存储器之间直接读写数据。整个数据传输过程在DMA控制器的作用下进行,这样使得CPU与输入输出可以并行操作。DMA传送方式主要适用于一些高速的I/O设备中,如音频、视频、网络接口。

DMA接口

DMA接口的组成如下图所示:

image-20201013230204618

图中,AR为内存地址计数器,用于存放内存中要交换的数据的地址;WC为字计数器,用于记录传送数据块的长度;BR为数据缓冲寄存器,用于暂存每次传送的数据;DAR为设备地址寄存器,存放I/O设备的设备码或是表示设备信息存储区的寻址信息;控制逻辑用于管理DMA的传送过程;中断机构用于向CPU提出中断请求。

DMA接口的功能有:

  • 向CPU申请DMA传送
  • 处理总线控制权的转交
  • 管理系统总线、控制数据传输
  • 确定数据传送的首地址和长度,修正传送过程中的数据地址和长度
  • DMA传送结束之后给出操作完成信号

DMA接口有两种类型:一种是选择型,通过一条选择线连接多个物理设备,但是在逻辑上只允许连接一个设备;另外一种是多路型,在物理上连接多个设备,同时逻辑上也允许连接的多个设备同时工作。

连接方式

DMA与系统之间有两种连接方式:一种是所有的DMA具有一条公共的请求线,另外一种是每一个DMA接口都有一个独立的请求线

交换数据方式

DMA与主存交换数据主要有三种方式:

  1. 停止CPU访问主存,将总线全部交给DMA使用。这种方法控制简单,但是CPU处于不工作状态或保持状态,不能充分发挥CPU对主存的利用率
  2. 周期挪用(周期窃取),利用CPU不访问主存的那些周期来实现DMA操作。这种方法不会减慢CPU的操作,但是需要复杂的时序电路,而且数据传输过程是不连续和不规则的。由于I/O设备处理总线控制权也需要花费时间,因此这种方法适用于I/O设备读写周期大于内存存储周期的情况。
  3. 交替访问,在一个工作周期内,一部分专供DMA访问主存,另一部分专供CPU访问主存。这样不需要申请建立和归还总线的使用权,具有较高的效率。但是相应的硬件逻辑也更加复杂。

DMA的工作过程

DMA的传送过程主要包括三部分:预处理、数据传送和后处理。

在预处理阶段,DMA预置一些信息,包括逻辑传送方向、设备地址、主存地址和传送字数;在数据传送阶段,DMA将主存地址发给总线,将数据送给I/O设备或主存,同时修改主存地址和字计数器;在后处理阶段,需要校正送入主存的数是否正确,测试传送过程是否正确,并决定是否继续使用DMA,这些由中断服务程序完成。

参考

[1] 深入理解计算机系统(第三版)

[2] 哈尔滨工业大学 计算机组成原理公开课

[3] 计算机组成:结构化方法

[4] 计算机组成与设计:硬件/软件接口