1计算机组成(第6版)

计算机的基本概念

冯诺依曼模型

冯诺依曼存储程序指令周期总线

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第1章 计算机的基本概念(冯诺依曼模型)

一、导读

1.1 本章学习目标

理解冯诺依曼体系结构的核心思想:掌握存储程序概念的内涵,理解为什么将指令和数据存储在同一存储器中是计算机发展史上的里程碑式突破,以及这一思想如何奠定了现代计算机的基础架构。

掌握计算机五大组成部分的功能与协作关系:深入了解运算器、控制器、存储器、输入设备和输出设备各自承担的职责,以及它们如何通过总线和控制信号协调工作完成计算任务。

理解指令执行周期的各个阶段:从取指(Fetch)、译码(Decode)、执行(Execute)、访存(Memory Access)到写回(Write Back),掌握每个阶段完成的具体操作和涉及的数据流动路径。

掌握总线结构的基本概念与分类:理解数据总线、地址总线和控制总线的作用,了解单总线、双总线和多级总线结构的区别及其对系统性能的影响。

理解计算机性能的基本度量方法:掌握时钟频率、时钟周期、CPI(每条指令的时钟周期数)、MIPS 和 MFLOPS 等性能指标的含义及其相互关系,能够进行简单的性能计算。

了解计算机系统的层次化抽象模型:从应用程序、高级语言、汇编语言、指令集架构到微操作和硬件,理解各层次之间的关系以及抽象在计算机设计中的重要性。

1.2 为什么本章如此重要

本章是整门课程的起点和基石。计算机组成原理的后续章节——无论是指令集设计、数据通路、控制单元还是存储系统——都建立在本章所介绍的基本概念之上。如果不理解冯诺依曼模型的整体框架,就无法理解为什么指令集要这样设计,也无法理解数据通路为什么要按照特定的方式组织。

从历史角度看,冯诺依曼在 1945 年提出的存储程序概念是计算机发展史上最重要的思想之一。在此之前,ENIAC 等早期计算机需要通过重新接线来改变程序,效率极低。存储程序思想的提出,使得计算机从专用设备变成了通用计算平台,这一思想至今仍然指导着几乎所有计算机的设计。

从工程实践角度看,理解计算机的基本组成有助于编写更高效的程序。当程序员了解指令是如何被取出的、数据是如何在寄存器之间传递的、内存访问的代价有多高时,就能做出更好的设计决策。例如,理解 Cache 的存在会促使程序员按照局部性原则组织数据访问,从而大幅提升程序性能。

此外,本章介绍的层次化抽象思想是计算机科学中最核心的方法论之一。通过将复杂的系统分解为多个层次,每一层只关注本层的功能而将下层的实现细节隐藏起来,工程师能够管理计算机系统的巨大复杂性。这种分层思维不仅适用于硬件设计,也适用于软件工程的各个方面。

1.3 核心问题引导

冯诺依曼模型的核心思想是什么?它与早期计算机(如 ENIAC)的设计有什么本质区别?

为什么指令和数据可以存储在同一存储器中而不产生混淆?计算机如何区分它们?

一条指令从被取出到执行完毕,经历了哪些阶段?每个阶段涉及哪些硬件部件?

总线在计算机中扮演什么角色?如果总线带宽不足,会对系统性能产生什么影响?

时钟频率越高,计算机性能就一定越好吗?CPI 的概念如何帮助我们更准确地评估性能?

为什么说存储程序概念赋予了计算机通用性?如果指令不存储在内存中,计算机会怎样?

冯诺依曼模型存在什么潜在的瓶颈?这一瓶颈在现代计算机中是如何被缓解的?


二、核心概念详解

2.1 冯诺依曼体系结构

冯诺依曼体系结构(Von Neumann Architecture)是现代计算机设计的理论基础,由数学家 John von Neumann 在 1945 年的一份报告中系统阐述。该架构的核心思想是存储程序(Stored Program)概念:将程序的指令和数据都存储在同一个可读写的存储器中,处理器按照程序计数器的指示,依次从存储器中取出指令并执行。

冯诺依曼模型将计算机划分为五个基本组成部分。运算器(Arithmetic Logic Unit)负责执行所有的算术运算和逻辑运算,如加法、减法和逻辑与操作。控制器(Control Unit)是整个系统的指挥中心,它从存储器中取出指令,对指令进行译码,然后产生一系列控制信号来协调各部件的工作。存储器(Memory)用于存放程序和数据,在冯诺依曼模型中,指令和数据共享同一个地址空间。输入设备(Input Device)负责将外部信息转换为计算机能够处理的二进制形式,如键盘和鼠标。输出设备(Output Device)则将计算机处理的结果转换为人类可理解的形式,如显示器和打印机。

冯诺依曼架构的一个关键特征是指令和数据的存储方式。由于指令和数据存储在同一存储器中,它们在物理形态上没有区别——都是二进制位序列。计算机通过指令执行的上下文来区分二者:当程序计数器指向某个存储单元时,该单元的内容被视为指令;当指令要求读取数据时,指定地址中的内容被视为数据。这种统一存储的方式使得程序可以像数据一样被处理,为自修改程序和动态代码加载等高级技术提供了基础。

然而,冯诺依曼架构也存在一个固有的局限性,即冯诺依曼瓶颈(Von Neumann Bottleneck)。由于指令和数据共享同一条总线,CPU 在同一时刻只能取指令或取数据,不能同时进行。这在 CPU 速度远高于内存速度的现代计算机中尤为突出,成为制约系统性能的重要因素。现代计算机通过引入 Cache、流水线、分支预测等多种技术来缓解这一瓶颈。

2.2 指令执行周期

指令执行周期(Instruction Cycle)是指 CPU 从存储器中取出一条指令并完成其执行所需的全部步骤。一个完整的指令周期通常包括以下几个阶段:取指(Instruction Fetch)、译码(Instruction Decode)、执行(Execute)、访存(Memory Access)和写回(Write Back)。

在取指阶段,CPU 将程序计数器(PC)中的地址发送到存储器,从该地址读取指令并存入指令寄存器(IR)。随后,PC 的值自动递增,指向下一条待执行的指令。这一阶段的关键操作是将指令从存储器传送到 CPU 内部。

在译码阶段,控制单元对指令寄存器中的指令进行分析,提取操作码(Opcode)字段以确定需要执行的操作类型,同时提取操作数地址字段以确定参与运算的数据位置。译码的结果是产生一组控制信号,用于在后续阶段控制数据通路中各部件的动作。

在执行阶段,ALU 根据控制信号对操作数执行指定的运算。运算的类型取决于指令的种类,可能是算术加法、逻辑比较或地址计算等。执行阶段的结果通常暂时保存在 ALU 的输出寄存器中。

在访存阶段,如果指令需要访问内存(如 Load 或 Store 指令),CPU 将根据计算得到的有效地址访问存储器。Load 指令从内存读取数据,Store 指令将数据写入内存。对于寄存器-寄存器型指令,这一阶段可能被跳过。

在写回阶段,执行结果被写回到目标寄存器中。对于 Load 指令,从内存读取的数据被写入目标寄存器;对于算术指令,ALU 的运算结果被写入目标寄存器。

这五个阶段构成了经典的五级流水线模型。通过将不同指令的不同阶段在时间上重叠执行,流水线技术显著提高了处理器的指令吞吐量。

2.3 总线结构

总线(Bus)是计算机内部各功能部件之间传输信息的公共通信通道。总线的设计直接影响系统的数据传输速率和整体性能。一条总线通常由三组信号线组成:数据总线(Data Bus)传输实际的数据信息,地址总线(Address Bus)传输内存或 I/O 设备的地址信息,控制总线(Control Bus)传输读写控制、中断请求和时序同步等控制信号。

单总线结构是最简单的总线组织方式,所有部件——CPU、存储器和 I/O 设备——都连接到同一条总线上。这种结构的优点是简单、成本低、易于扩展,但缺点是总线争用严重,同一时刻只能有一对部件进行通信,成为系统性能的瓶颈。

为了克服单总线的瓶颈,现代计算机通常采用多级总线结构。例如,CPU 与 Cache 之间通过高速的前端总线(Front Side Bus)或片上总线连接,Cache 与主存之间通过内存总线连接,而 I/O 设备则通过扩展总线(如 PCIe)连接。不同级别的总线通过桥接器(Bridge)相连,既保证了高速部件的通信带宽,又兼顾了低速设备的接入需求。

总线的性能主要由两个参数决定:总线宽度(即数据总线的位数,决定了每次传输的数据量)和总线频率(即每秒钟的信号变化次数)。总线带宽等于总线宽度乘以总线频率,表示单位时间内总线能够传输的最大数据量。例如,一条 64 位宽、频率为 100MHz 的总线,其带宽为 64/8 x 100MHz = 800MB/s。

2.4 计算机性能度量

评估计算机性能需要考虑多个维度的指标。时钟频率(Clock Rate)表示 CPU 每秒钟经历的时钟周期数,通常以 GHz 为单位。时钟周期(Clock Cycle)是时钟频率的倒数,代表 CPU 内部最基本的时间单位。每个时钟周期可以完成一个基本操作,如从寄存器读取数据。

然而,时钟频率并不能完全反映计算机的实际性能。CPI(Cycles Per Instruction)表示执行一条指令平均需要的时钟周期数。不同的指令可能有不同的 CPI,例如简单的寄存器操作可能只需要一个周期,而内存访问指令可能需要多个周期。程序的总执行时间可以用以下公式计算:执行时间 = 指令数 x CPI x 时钟周期。

MIPS(Million Instructions Per Second)表示每秒执行的百万条指令数,是一个直观的性能指标。但 MIPS 存在一个明显的缺陷:不同指令集的指令复杂度不同,不能直接跨架构比较。MFLOPS(Million Floating-point Operations Per Second)专门用于衡量浮点运算性能,在科学计算领域被广泛使用。

更全面的性能评估方法是使用基准测试程序(Benchmark),如 SPEC CPU 套件。基准测试程序模拟真实应用场景,通过测量程序的实际运行时间来评价系统性能。几何平均值(Geometric Mean)通常被用来综合多个基准测试的结果。

2.5 层次化抽象模型

计算机系统是一个极其复杂的系统,包含数十亿个晶体管。为了管理这种复杂性,计算机设计采用了层次化抽象(Hierarchical Abstraction)的方法。从最高层到最低层,计算机系统通常被划分为以下层次:应用程序层、高级语言层、汇编语言层、操作系统机器层、指令集架构层、微体系结构层和逻辑电路层。

指令集架构(ISA, Instruction Set Architecture)是软硬件之间的关键接口。对上层而言,ISA 定义了程序员可以使用的指令集合、寄存器组织和数据格式;对下层而言,ISA 是微体系结构设计的规范,微体系结构负责用实际的硬件电路来实现 ISA 定义的功能。这种分层使得 ISA 的实现方式可以改变(例如从硬布线控制改为微程序控制),而不影响上层软件的运行。

抽象的核心价值在于信息隐藏(Information Hiding)。每一层只需要了解下一层提供的接口,而不需要关心其内部实现细节。例如,汇编语言程序员只需要知道指令的功能,而不需要知道 ALU 内部是如何实现加法运算的。这种分层设计极大地降低了系统设计和程序开发的复杂度。


三、深入分析与讨论

3.1 冯诺依曼瓶颈及其缓解策略

冯诺依曼瓶颈是指 CPU 与存储器之间的速度差距导致的性能限制。随着半导体工艺的进步,CPU 的时钟频率以每两年翻倍的速度增长(摩尔定律),但 DRAM 的访问延迟改善速度远远落后。现代 CPU 的一个时钟周期约为 0.3 纳秒,而一次主存访问可能需要 50-100 纳秒,这意味着 CPU 可能需要等待数百个周期才能获得所需的数据。

缓解冯诺依曼瓶颈的主要策略包括以下几种。Cache 存储器在 CPU 和主存之间插入一级或多级高速缓冲存储器,利用程序访问的局部性原理,将最近使用过的数据保存在离 CPU 更近的位置。现代处理器通常配备三级 Cache:L1 Cache 最快但最小(通常 32-64KB),L3 Cache 较大但较慢(通常数 MB)。

流水线技术将指令执行过程分解为多个阶段,使不同指令的不同阶段可以并行执行。理想情况下,五级流水线可以使指令吞吐量提高五倍。超标量处理器进一步在每个时钟周期发射多条指令,利用指令级并行性提高性能。

预取技术通过预测程序将要访问的数据,提前将其从主存加载到 Cache 中。硬件预取器通过分析内存访问模式来做出预测,现代处理器的预取算法已经相当成熟。此外,多端口存储器和交叉存储器(Interleaved Memory)等技术也从不同角度提高了存储系统的带宽。

3.2 哈佛架构与修正哈佛架构

与冯诺依曼架构不同,哈佛架构(Harvard Architecture)将指令存储器和数据存储器分开,使用独立的总线分别连接。这种设计的最大优势是可以同时进行取指和取数据操作,消除了冯诺依曼瓶颈中指令和数据争用总线的问题。

哈佛架构在嵌入式系统和数字信号处理器(DSP)中被广泛采用。例如,许多 DSP 芯片采用改进的哈佛架构,配备独立的程序总线和多条数据总线,使得单条指令周期内可以同时完成取指、读取两个操作数和写回结果四个操作,极大地提高了数据处理效率。

纯粹的哈佛架构在通用计算机中并不常见,因为程序无法像数据一样被灵活处理。但现代处理器普遍采用修正哈佛架构(Modified Harvard Architecture),在 Cache 级别将指令 Cache 和数据 Cache 分开(即哈佛结构),而在主存级别仍然使用统一的存储空间(即冯诺依曼结构)。这种设计兼顾了性能和通用性。x86 处理器和 ARM 处理器都采用了这种修正哈佛架构。

3.3 计算机性能评估的方法论

正确评估计算机性能对于系统设计和选型至关重要。一个常见的误区是仅凭时钟频率来判断性能。事实上,时钟频率只是决定性能的三个因素之一(另外两个是指令数和 CPI)。一个时钟频率较低但 CPI 更小的处理器,可能比时钟频率高但 CPI 大的处理器性能更好。

Amdahl 定律是性能分析中的重要工具。它指出,当对系统的某个部分进行加速时,整体性能的提升受到该部分在总执行时间中所占比例的限制。

Amdahl 定律计算示例:

可加速部分占比加速倍数整体性能提升
40%无穷大1/(1-0.4) = 1.67 倍
60%无穷大1/(1-0.6) = 2.5 倍
80%无穷大1/(1-0.8) = 5.0 倍
90%无穷大1/(1-0.9) = 10.0 倍

这一定律提醒我们,优化应该着眼于程序中最耗时的部分。

另一个重要的性能分析方法是 CPU 性能方程:CPU 时间 = 指令数 x CPI x 时钟周期。通过这个方程,可以将性能分解为三个独立的因素,分别对应编译器效率(影响指令数)、微体系结构设计(影响 CPI)和硬件工艺(影响时钟周期)。这种分解有助于工程师找到性能优化的最佳方向。


四、实践案例

4.1 案例分析:从 ENIAC 到现代 PC 的架构演进

ENIAC(Electronic Numerical Integrator and Computer)于 1946 年诞生于宾夕法尼亚大学,是世界上第一台通用电子计算机。ENIAC 使用了约 17000 个真空管,重达 30 吨,占地面积约 167 平方米。然而,ENIAC 并不是冯诺依曼架构的——它通过重新接线来改变程序,每次更换任务可能需要数小时甚至数天的重新配置。

冯诺依曼参与的 EDVAC 项目首次实现了存储程序概念。在 EDVAC 中,指令以二进制形式存储在水银延迟线存储器中,CPU 可以自动按顺序取出并执行指令。这一突破使得程序切换变得极为迅速,只需更换存储器中的程序内容即可。

从 EDVAC 到现代 PC,冯诺依曼架构的基本框架始终未变,但每个组成部分都经历了革命性的变化。运算器从真空管发展到晶体管再到集成电路,集成度提高了数十亿倍。存储器从水银延迟线发展到磁芯存储器再到半导体存储器,访问速度提升了数百万倍。控制器从硬连线逻辑发展到微程序控制再到流水线超标量设计,指令执行效率大幅提高。

现代 PC 的一个典型例子是基于 x86-64 架构的桌面计算机。它拥有多核处理器,每个核心都包含独立的 L1/L2 Cache 和共享的 L3 Cache。主存采用 DDR4/DDR5 DRAM,容量可达数十 GB。存储设备使用 NVMe SSD,通过 PCIe 总线与 CPU 连接。所有这些组件仍然遵循冯诺依曼模型的基本框架:CPU 从存储器中取出指令并执行,通过总线与各部件通信。

4.2 案例分析:简单程序的手工执行过程

考虑一段简单的汇编程序,其功能是将两个数相加并存储结果:

LOAD R1, [1000]    ; 将地址 1000 中的数据加载到寄存器 R1
ADD R1, R2         ; 将 R1 和 R2 相加,结果存入 R1
STORE [1002], R1   ; 将 R1 的值存储到地址 1002

我们手工模拟 CPU 执行第一条指令 LOAD R1, [1000] 的过程。在取指阶段,PC 中的地址(假设为 0x100)被发送到存储器,存储器返回该地址处的指令编码,同时 PC 递增到 0x104。指令被存入指令寄存器 IR。

在译码阶段,控制单元分析 IR 中的指令编码,识别出这是一条 LOAD 指令,目标寄存器为 R1,操作数地址为 1000。控制单元生成相应的控制信号:将地址总线设置为 1000,将读使能信号激活。

在执行阶段,存储器根据地址 1000 读出数据,数据通过数据总线传回 CPU。在写回阶段,数据被写入寄存器 R1。至此,第一条指令执行完毕。

接下来 CPU 自动取第二条指令 ADD R1, R2。译码后,控制单元将 R1 和 R2 的内容分别送到 ALU 的两个输入端,ALU 执行加法运算。在写回阶段,运算结果被写入 R1。

第三条指令 STORE [1002], R1 将 R1 的内容写入地址 1002 的存储单元。执行过程与 LOAD 类似,但数据流向相反。

通过这个简单的例子,可以清楚地看到指令执行的完整过程:取指、译码、执行、访存、写回。每个阶段都涉及数据在不同部件之间的流动,而控制单元负责产生正确的控制信号来协调这些流动。


五、常见误区与注意事项

5.1 误区一:时钟频率越高性能越好

时钟频率只是影响性能的因素之一。如果两个处理器的微架构不同,高频率处理器的 CPI 可能远大于低频率处理器。例如,一个 5GHz 但 CPI 为 4 的处理器,其实际性能可能不如一个 3GHz 但 CPI 为 1 的处理器。评估性能应综合考虑指令数、CPI 和时钟频率三个因素,最好使用标准化的基准测试程序。

5.2 误区二:冯诺依曼架构中指令和数据在物理上是可区分的

在冯诺依曼架构中,指令和数据以完全相同的方式存储在存储器中,物理上都是二进制位序列。计算机通过执行的上下文来区分它们:当 PC 指向某地址时,该地址的内容被当作指令;当指令需要读取数据时,指定地址的内容被当作数据。这种区分是逻辑上的而非物理上的。

5.3 误区三:总线宽度越大性能一定越好

总线宽度增加确实可以提高单次传输的数据量,但总线性能还受频率、协议开销、仲裁机制等多种因素影响。过宽的总线会增加布线难度和信号干扰,可能导致频率下降。此外,如果外设无法产生或消费足够快的数据,宽总线的带宽也无法被充分利用。系统设计需要在总线宽度、频率和成本之间取得平衡。

5.4 误区四:存储程序意味着程序可以无限大

虽然存储程序概念允许程序存储在内存中,但程序的规模受限于物理存储器的容量。在早期计算机中,内存只有几千个字,程序大小受到严格限制。现代计算机通过虚拟内存技术突破了物理内存的限制,但程序的逻辑大小仍然受限于地址空间的范围。程序员需要了解存储层次的特点,合理安排数据和代码的布局。

5.5 误区五:一条指令只需一个时钟周期就能完成

在简单的处理器中,一条指令可能需要多个时钟周期才能完成。即使在采用流水线的处理器中,虽然每条指令的吞吐量可以接近每个周期一条,但单条指令的延迟(从开始到结束的时间)仍然跨越多个周期。复杂的指令(如除法或浮点运算)可能需要更多周期。理解指令延迟和吞吐量的区别对于编写高性能代码非常重要。


六、本章小结

本章建立了计算机系统的基本视图。冯诺依曼模型以存储程序概念为核心,将计算机分为运算器、控制器、存储器、输入设备和输出设备五个部分,奠定了现代计算机的基础架构。指令执行周期描述了单条指令从取指到写回的完整过程,五级流水线模型为后续章节的深入讨论提供了框架。总线作为各部件之间的通信通道,其结构和性能直接影响系统的整体表现。层次化抽象是管理计算机复杂性的核心方法论,ISA 作为软硬件接口的角色贯穿整个课程。理解这些基本概念,是深入学习指令集设计、数据通路、控制单元和存储系统的必要前提。


七、思考题与练习

请用自己的话解释存储程序概念的含义,并说明为什么这一概念是计算机发展史上最重要的突破之一。如果没有存储程序概念,计算机的使用方式会是怎样的?

画出一个完整的五级指令执行周期的流程图,标注每个阶段涉及的硬件部件和数据流动方向。对于 Load 指令和 Store 指令,哪些阶段可以被跳过或合并?

比较单总线结构和多级总线结构的优缺点。为什么现代计算机不再使用单总线结构?多级总线结构中桥接器的作用是什么?

假设处理器 A 的时钟频率为 4GHz,CPI 为 2;处理器 B 的时钟频率为 2GHz,CPI 为 1。对于同一程序(指令数相同),哪个处理器的执行时间更短?请通过计算说明。

冯诺依曼瓶颈的本质是什么?请列举至少三种缓解冯诺依曼瓶颈的技术,并分别解释它们的工作原理。

哈佛架构和冯诺依曼架构的根本区别是什么?为什么现代通用处理器选择修正哈佛架构而不是纯粹的哈佛架构?

什么是 CPI?为什么 CPI 比时钟频率更能准确地反映处理器的性能?请举例说明。

请解释层次化抽象在计算机系统设计中的作用。以 ISA 为例,说明它是如何作为软硬件之间的接口发挥作用的。

1/7计算机的
0%