什么是计算机体系结构?理解体系结构、组织和实现

什么是计算机体系结构?理解体系结构、组织和实现

什么是计算机体系结构?理解体系结构、组织和实现

一、计算机体系结构概述1.1、计算机体系结构分类1.2、指令系统1.2.1、CISC 和 RISC1.2.2、指令的流水线处理1.2.3、阵列处理机、并行处理机和多处理机

二、存储系统2.1、相联存储器2.2、高速缓存2.3、虚拟存储器2.4、外存储器2.5、磁盘阵列技术 (RAID)2.6、存储区域网络 (SAN)

三、输入/输出 (I/O) 技术3.1、微型计算机中内存与接口的编址方法3.2、直接程序控制3.3、中断方式3.4、直接存储器存取 (DMA)3.5、通道和外围处理机

四、总线结构五、总结

摘要:计算机体系结构是软硬件的桥梁,定义了计算机的基本属性与运行方式。本文从体系结构、组织与实现入手,探讨了指令集、存储系统、I/O技术与总线结构等关键概念。

一、计算机体系结构概述

阿姆达尔在1964年介绍IBM 360系统时,将计算机体系结构定义为程序员视角下计算机所呈现的属性,就是程序员编写正确运行程序所需了解的概念结构和功能特性。

1982年,梅尔斯在《计算机体系结构的进展》一书中,将计算机系统划分为多个层次,每个层次向上层提供功能支持,而层与层之间的接口就是某种体系结构。梅尔斯的定义扩展了阿姆达尔的概念性结构思想,明确了传统的计算机体系结构指的是硬件和软件的交界处,即指令集体系结构。

1984年,拜尔在一篇名为《计算机体系结构》的论文中,给出了更宽泛的定义,认为体系结构由结构、组织、实现和性能四个基本要素构成。其中,结构指计算机硬件间的连接方式;组织指各部件的动态协作和管理;实现指各模块的设计和组装;性能指计算机运行的表现。这个定义深化了阿姆达尔的功能特性思想。值得注意的是,在这个定义下,计算机 组织成为了计算机体系结构的一个组成部分。

计算机体系结构、计算机组织和计算机实现的关系如下:

计算机体系结构(Computer Architecture): 计算机的概念性框架和功能属性。计算机组织(Computer Organization): 计算机体系结构在逻辑上的实现方式,包括数据流、控制流的组成和逻辑设计等(即计算机组成原理)。计算机实现(Computer Implementation): 计算机组织在物理层面上的具体实现。

1.1、计算机体系结构分类

计算机体系结构可以从不同的角度进行分类。

宏观分类(按处理机数量):

单处理系统: 仅有一个处理单元,负责存储、计算、通信以及输入/输出等所有功能。并行处理与多处理系统: 多个处理机互连协同工作,通过通信和协调,并行解决同一个大型问题,以提高求解效率。分布式处理系统: 由物理上分散且松散耦合的多台计算机组成。 显著特点是远距离带来的通信延迟不可忽略,且通信线路上的数据传输速率远低于处理器内部总线速度(即松耦合的含义)。

Flynn 分类法 (1966): M.J. Flynn 根据指令流和数据流的数量对计算机系统进行分类。

SISD (单指令流单数据流): 传统的单处理器架构。SIMD (单指令流多数据流): 适用于并行处理数组或向量数据的场景,如GPU。MISD (多指令流单数据流): 理论模型,实际应用较少。MIMD (多指令流多数据流): 现代多核处理器和集群系统都属于此类。

冯泽云分类法 (1972): 冯泽云基于最大并行度 (Pm) 对计算机系统进行结构分类。Pm 指单位时间内系统能处理的最大二进制位数。

WSBS (字串行位串行): 字和位都按串行方式处理。WPBS (字并行位串行): 字并行处理,位串行处理。WSBP (字串行位并行): 字串行处理,位并行处理。WPBP (字并行位并行): 字和位都按并行方式处理。

Handler 分类法 (1977): Wolfgang Handler 基于硬件并行程度计算并行度,将计算机结构分为三个层次。

处理机级算逻单元级 (ALU)逻辑门电路级

通过计算各级可以并行或流水线处理的程序量,确定系统的并行度。

Kuck 分类法 (1978): David J. Kuck 采用类似于 Flynn 分类法的方法,使用指令流和执行流及其多重性来描述计算机系统控制结构的特征。

SISE (单指令流单执行流): 类似于 Flynn 的 SISD。SIME (单指令流多执行流): 类似于 Flynn 的 SIMD。MISE (多指令流单执行流): 类似于 Flynn 的 MISD。MIME (多指令流多执行流): 类似于 Flynn 的 MIMD。

1.2、指令系统

指令集体系结构 (Instruction Set Architecture, ISA) 定义了一个处理器所支持的指令及其对应的字节级编码。不同的处理器系列拥有不同的 ISA,因此,针对特定机器编译的程序通常无法直接在其他机器上运行。

从体系结构角度对指令集进行分类,主要考虑以下五个方面:

操作数存储位置: 操作数从内存取出后在 CPU 中的存储方式。显式操作数数量: 典型指令中明确命名的操作数个数。操作数位置灵活性: ALU 指令的操作数是否可以位于内存中,以及如何寻址。指令操作类型: 指令集中提供的操作种类,如算术、逻辑、控制等。操作数类型和大小: 支持的操作数数据类型(如整数、浮点数)及其大小(如8位、16位、32位等)。

按照 CPU 内部操作数的暂存机制,指令集体系结构可以分为三类:

堆栈 (Stack): 操作数存储在栈中,指令隐式地操作栈顶元素。累加器 (Accumulator): 有一个特殊的累加器寄存器,大部分指令使用累加器作为源或目的操作数。寄存器组 (Set of Registers): 使用一组通用寄存器来存储操作数。

通用寄存器 (General-Purpose Register Machines, GPR) 的主要优势在于编译器能够有效地利用寄存器,既可以用于计算表达式的值,也可以从全局角度存储变量。 与堆栈或累加器架构相比,GPR 架构在计算表达式时提供了更大的灵活性。 更重要的是,寄存器可以用于存储变量。 当变量分配给寄存器时,可以减少内存访问 (Memory Traffic),从而提高程序运行速度和代码密度。

可以通过以下两个主要特征区分 GPR 体系结构:

ALU 指令的操作数个数。 存在两种格式:

三操作数格式: 指令包含两个源操作数和一个目的操作数。二操作数格式: 一个操作数既是源操作数又是目的操作数。 ALU 指令中内存地址操作数的数量: 对于典型的 ALU 指令,内存操作数的数量通常在 1 到 3 之间。

1.2.1、CISC 和 RISC

CISC (复杂指令集计算机) 和 RISC (精简指令集计算机) 代表了指令集发展的两种不同方向。

(1) CISC (复杂指令集计算机): CISC 的核心理念是通过增强现有指令的功能,并引入更复杂的指令来替代原先由软件子程序完成的功能,从而实现软件功能的“硬化”。 这导致指令集变得越来越庞大和复杂。目前大多数计算机属于 CISC 类型。

CISC 的主要缺点:

指令集过于庞杂: 指令数量过多,增加了硬件设计的复杂性。依赖微程序技术: CISC 依赖微程序解释复杂指令,每条指令需要多个 CPU 周期才能完成,降低了处理速度。编译困难: 庞大的指令系统使得高级语言编译器在选择目标指令时范围过大,导致编译程序本身变得复杂,难以进行优化,无法生成真正高效的目标代码。中断控制复杂: 对完善中断控制的强调导致动作繁多、设计复杂、研发周期长。芯片设计困难: CISC 给芯片设计带来诸多困难,增加芯片种类,提高出错率,提高成本并降低成品率。

(2) RISC (精简指令集计算机): RISC 的核心理念是通过减少指令总数并简化指令功能来降低硬件设计的复杂度,使得指令能够以单周期执行。同时,通过优化编译技术来提高指令的执行速度,并采用硬布线控制逻辑。 RISC 在 20 世纪 70 年代末开始兴起,并导致机器的指令系统变得更加精简和简单。

RISC 的关键技术包括:

重叠寄存器窗口技术: 在伯克利的 RISC 项目中,首先采用了重叠寄存器窗口(Overlapping Register Windows)技术。其基本思想是在处理器中设置一个数量较大的寄存器堆,并将其划分成多个窗口。每个过程使用其中相邻的 3 个窗口和一个公共窗口。这些窗口中,有一个窗口与前一个过程共享,另一个窗口与下一个过程共享。与前一个过程共享的窗口用于存放前一个过程传递给本过程的参数,以及本过程传递给前一个过程的计算结果。与下一个过程共享的窗口则用于存放本过程传递给下一个过程的参数,以及下一个过程传递给本过程的计算结果。

优化编译技术: RISC 使用了大量的寄存器,如何合理分配寄存器、提高寄存器的使用效率以及减少内存访问次数等,都需要通过编译技术的优化来实现。

超流水及超标量技术: 为了进一步提高流水线速度而采用的技术。

硬布线逻辑与微程序相结合: RISC倾向于使用硬布线逻辑,但在某些特定场景也可能结合微程序技术。

(3) 优化: 为了提高目标程序的实现效率,人们对大量的机器语言目标代码及其执行情况进行了统计。

静态使用频度: 对程序中出现的各种指令以及指令串进行统计得到的百分比。 按静态使用频度改进目标代码可以减少目标程序所占用的存储空间。动态使用频度: 在程序执行过程中,对出现的各种指令以及指令串进行统计得到的百分比。 按动态使用频度改进目标代码可以减少目标程序运行的执行时间。

大量统计表明,动态和静态使用频度两者非常接近,最常用的指令是存、取、条件转移等。 对它们加以优化,既可以减少程序所需的存储空间,又可以提高程序的执行速度。

面向高级程序语言的优化思路是尽可能缩小高级语言与机器语言之间的语义差距,以利于支持高级语言编译系统,缩短编译程序的长度和编译所需的时间。

面向操作系统的优化思路是进一步缩小操作系统与体系结构之间的语义差距,以利于减少操作系统运行所需的辅助时间,节省操作系统软件所占用的存储空间。操作系统的实现依赖于体系结构对它的支持。许多传统机器指令,例如算术逻辑指令、字符编辑指令、移位指令和控制转移指令等,都可用于操作系统的实现。 此外,还有相当一部分指令是专门为实现操作系统的各种功能而设计的。

1.2.2、指令的流水线处理

指令控制方式主要有三种:顺序方式、重叠方式和流水线方式。

顺序方式: 指令之间严格串行执行,一条指令执行完毕后才取下一条指令,并且每条指令内部的微操作也是串行执行。 优点是控制简单,缺点是速度慢,机器各部件利用率低。

重叠方式: 在第 K 条指令的操作完成之前,就可以开始解释第 K+1 条指令。通常采用一次重叠,即指令分析部件和指令执行部件只对相邻两条指令进行重叠解释。 优点是速度有所提高,控制也不太复杂。 缺点是会出现冲突、转移和相关等问题,需要在设计时加以解决。

流水线方式: 模仿工业生产的流水线 (如汽车装配线) 提出的一种指令控制方式。流水线 (Pipelining) 技术是将并行性或并发性嵌入到计算机系统中的一种形式,它将重复的顺序处理过程分解为若干个子过程,每个子过程能在专用的独立模块上有效地并发工作。

从概念上讲,“流水线”可以看作是“重叠”的延伸。 差别在于“一次重叠”将一条指令解释分解为两个子过程,而“流水线”则分解为更多的子过程。

流水线的种类:

按流水级别: 部件级、处理机级、系统级流水线。按流水功能: 单功能流水线、多功能流水线。按流水连接: 静态流水线、动态流水线。按反馈回路: 线性流水线、非线性流水线。按流动顺序: 同步流水线、异步流水线。按数据表示: 标量流水线、向量流水线。

流水的相关处理: 流水线在同一时刻处理多条指令,这些指令可能对同一主存单元或同一寄存器存在“先写后读”的要求,这时会发生相关性。 相关性分为:指令相关、访存操作数相关、通用寄存器组相关等。 它只影响相关的几条指令,并且最多影响流水线的某些段推后执行,不会改变指令缓冲器中预取的指令内容,影响是局部的,因此称为局部性相关。

解决局部性相关的方法有两种:

推后法: 推迟对相关单元的读取,直到写入完成。通路法: 设置相关专用通路,使运算结果不必先写入相关存储单元,而是通过专用通路直接使用,以加快速度。

全局性相关: 转移指令(特别是条件转移指令)与其后面的指令存在关联,导致它们不能同时解释。 执行转移指令时,可能会改变指令缓冲器中预取的指令内容,造成流水线吞吐率和效率下降,比局部性相关的影响更为严重,因此称为全局性相关。

解决全局性相关的方法有三种:

猜测转移分支: 猜测条件转移指令的结果,选择一个分支执行。 通常猜测转移不成功分支,如果猜对的概率高,流水线吞吐率和效率会大大提高。加快和提前形成条件码: 尽早获得条件码以简化流水线对条件转移的处理。例如,加快单条指令内部条件码的形成,或在一段程序内提前形成条件码。加快短循环程序的处理: 由于程序中广泛采用循环结构,因此流水线大多采用特殊措施以加快循环程序的处理。例如,将整个循环程序放入指令缓冲存储器中,以提高流水效率和吞吐率。

中断和转移一样,也会引起流水线断流。 由于中断出现的概率远低于条件转移,因此只要处理好断点现场保护及中断后的恢复,并尽量缩短断流时间即可。

RISC 中采用的流水技术 有三种:超流水线、超标量和超长指令字。

超流水线 (Super Pipeline) 技术: 通过细化流水线,增加级数和提高主频,使得每个机器周期内能完成一个甚至两个浮点操作。 其实质是以时间换空间。 超流水机器的特征是在所有功能单元都采用流水线,并有更高的时钟频率和更深的流水深度。 由于它仅限于指令级的并行,所以超流水机器的 CPI (Clock Cycles Per Instruction, 每个指令需要的机器周期数) 值稍高。

超标量 (Super Scalar) 技术: 通过内装多条流水线来同时执行多个处理,其时钟频率与一般流水线接近,但 CPI 更小。 其实质是以空间换取时间。

超长指令字 (Very Long Instruction Word, VLIW) 技术: VLIW 和超标量都是 20 世纪 80 年代出现的概念,它们的共同点是要同时执行多条指令。不同之处在于超标量依靠硬件来实现并行处理的调度,而 VLIW 则充分发挥软件的作用,从而简化硬件并提高性能。VLIW 有更小的 CPI 值,但需要有足够高的时钟频率。

吞吐率和流水线建立时间:

吞吐率是指单位时间内流水线处理器流出的结果数。 对于指令而言,就是单位时间内执行的指令数。如果流水线的子过程所用时间不一样,则吞吐率 p 应为最长子过程的倒数 ,即:

p

=

1

/

m

a

x

{

t

1

,

t

2

,

.

.

.

,

t

n

}

p = 1/max\{△t_1,△t_2,...,△t_n\}

p=1/max{△t1​,△t2​,...,△tn​}

流水线开始工作需要经过一定时间才能达到最大吞吐率,这个时间称为建立时间。 若 m 个子过程所用时间一样,均为

t

0

△t_0

△t0​,则建立时间

T

0

=

m

t

0

T_0=m△t_0

T0​=m△t0​。

1.2.3、阵列处理机、并行处理机和多处理机

并行性涵盖了同时性和并发性两种概念。 同时性是指两个或多个事件在同一时刻发生,而并发性是指两个或多个事件在同一时间间隔内连续发生。

从计算机信息处理的步骤和阶段来看,并行处理可以分为以下几类:

存储器操作并行。处理器操作步骤并行(流水线处理机)。处理器操作并行(阵列处理机)。指令、任务、作业并行(多处理机、分布式处理系统、计算机网络)。

阵列处理机: 阵列处理机将多个重复设置的处理单元 (PU) 按照一定的方式连接成阵列,在单个控制部件 (CU) 的控制下,对分配给自己的数据进行处理,并行地完成一条指令所规定的操作。 这是一种单指令流多数据流 (SIMD) 计算机,通过资源重复实现并行性。

并行处理机: SIMD 和 MIMD 是典型的并行计算机。

SIMD 有共享存储器和分布式存储器两种结构。

共享存储器的 SIMD 结构: 将若干个存储器构成统一的并行处理机存储器,通过互联网络 (ICN) 为整个并行系统的所有处理单元共享。 其中,PE 为处理单元,CU 为控制部件,M 为共享存储器,ICN 为互联网络。

分布式存储器的 SIMD 结构: 包含多个同样结构的处理单元,通过寻径网络 ICN 以一定的方式互相连接。 其中,PE 为处理单元,CU 为控制部件,PEM 为局部存储器,ICN 为互联网络。

在分布式存储器的并行处理机结构中,存在两类存储器:一类存储器附属于主处理机,主处理机实现整个并行处理机的管理,在其附属的存储器内常驻操作系统。 另一类是分布在各个处理单元上的存储器(即 PEM),这类存储器用来保存程序和数据。 在阵列控制部件的统一指挥下,实现并行操作。 程序和数据通过主机装入控制存储器。 通过控制部件的是单指令流,所以指令的执行顺序和单处理机一样,基本上是串行处理。 指令送到控制部件进行译码,划分后的数据集合通过向量数据总线分布到所有 PE 的本地存储器 PEM。 PE 通过数据寻径网络互连。 数据寻径网络执行 PE 之间的通信,控制部件通过执行程序来控制寻径网络。 PE 的同步由控制部件的硬件实现。

多处理机: 多处理机系统是由多台处理机组成的系统,每台处理机有属于自己的控制部件,可以执行独立的程序,共享一个主存储器和所有的外部设备。 它是多指令流多数据流 (MIMD) 计算机。 在多处理机系统中,机间互连技术决定了多处理机的性能。 多处理机之间的互连需要满足高频带、低成本、连接方式的多样性以及在不规则通信情况下连接的无冲突性。

其他计算机:集群。 集群通常指连接在一起的两个或多个计算机(结点)。 集群计算机是一种并行或分布式处理系统,由很多连接在一起的独立计算机组成,像一个单集成的计算机资源一样协同工作,主要用来解决大型计算问题。 计算机结点可以是一个单处理器或多处理器的系统,拥有内存、I/O 设备和操作系统。 连接在一起的计算机集群对用户和应用程序来说像一个单一的系统,这样的系统可以提供一种价格合理的且可获得所需性能以及快速而可靠的服务的解决方案。

二、存储系统

计算机系统中存在多种存储器,例如:CPU 内部的通用寄存器组、CPU 内外的高速缓存 (Cache)、主板上的主存储器、主板外的在线磁盘存储器,以及离线的磁带和光盘存储器等。 这些不同特性的存储器通过适当的硬件和软件进行有机组合,构成计算机的存储体系结构。

Cache 和主存之间的交互完全由硬件实现 ,而主存与辅存之间的交互则由硬件和软件共同完成。

存储器可以根据多种不同的标准进行分类,以下是常见的几种分类方式:

1. 按存储位置分类:

内存(主存): 位于主机内部或主板上,用于存储 CPU 当前运行所需的程序和数据,以便 CPU 能够快速访问。 其特点是容量相对较小,但访问速度快。外存(辅存): 位于主机外部,例如磁盘、磁带和光盘等,用于存储当前未运行的大量信息。 当需要时,可以将外存中的数据调入内存。

2. 按存储介质分类:

磁存储器: 使用磁性介质存储数据,例如磁芯、磁泡存储器、磁膜存储器、磁鼓、磁带和磁盘等。半导体存储器: 使用半导体器件存储数据。根据所用元件,可分为双极型和 MOS 型。 此外,根据是否需要定期刷新数据,又可分为静态存储器 (SRAM) 和动态存储器 (DRAM)。光存储器: 使用光学方法读写数据,例如光盘 (CD-ROM, DVD-ROM, Blu-ray) 等。

3. 按工作方式分类:

读/写存储器 (RAM, Random Access Memory): 既可以读取数据,也可以写入数据的存储器。只读存储器 (ROM, Read-Only Memory): 在正常工作过程中只能读取数据,不能写入数据的存储器。 根据数据写入方式,又可细分为以下几种类型:

固定只读存储器 (ROM): 数据在生产时就已经写入,用户无法更改。 通常用于存储系统启动程序 BIOS 和微程序控制代码。可编程只读存储器 (PROM, Programmable ROM): 用户可以一次性写入数据,写入后不能修改。可擦除可编程只读存储器 (EPROM, Erasable PROM): 用户可以读取和写入数据,并且可以擦除内容进行重新编程。 可使用紫外线照射擦除数据,然后使用专用设备写入新的数据。电擦除可编程只读存储器 (EEPROM, Electrically Erasable PROM): 与 EPROM 类似,但使用电信号擦除数据,无需紫外线照射,可以更方便地进行擦写操作。

4. 按访问方式分类:

按地址访问的存储器: 通过存储单元的地址来访问数据。按内容访问的存储器 (CAM, Content Addressable Memory): 通过存储单元的内容来访问数据。

5. 按寻址方式分类:

随机存储器 (RAM, Random Access Memory): 可以直接访问任何存储单元,访问任何单元所需的时间是相同的。顺序存储器 (SAM, Sequential Access Memory): 访问数据所需的时间与数据在存储介质上的位置有关,例如磁带,必须按顺序访问。直接存储器 (DAM, Direct Access Memory): 介于随机存取和顺序存取之间。 磁盘是一种直接存取存储器,它对磁道的寻址是随机的,但在一个磁道内的寻址是顺序的。

2.1、相联存储器

相联存储器是一种特殊的存储器,它不通过地址来访问数据,而是根据数据的内容(或部分内容,称为关键字)进行访问。 工作原理是将数据(包含关键字)按顺序写入存储单元,读取时,输入的关键字与存储器中所有存储单元的内容并行比较,找出所有与关键字匹配的数据。 因此,相联存储器特别适用于快速信息检索和数据更新等应用。

典型的相联存储器结构包括以下几个关键组件:

检索寄存器: 用于存放待检索的关键字。屏蔽寄存器: 用于指定关键字中哪些字段参与检索。 通过设置屏蔽位,可以忽略某些字段的比较,实现模糊匹配。比较器: 将检索寄存器中的关键字与存储体中每个存储单元的内容进行并行比较。为了实现高速检索,比较器的数量通常很大。 对于位比较,每个存储单元的每一位都需要一个比较器,因此对于一个

2

m

2^m

2m 个字,每个字

N

N

N 位的存储器,需要

2

m

×

N

2^m \times N

2m×N 个比较器。 对于字比较,每个存储单元需要一个比较器,因此对于

2

m

2^m

2m 个字的存储器,需要

2

m

2^m

2m 个比较器。匹配寄存器 (Match Register): 用于记录比较结果。 它通常是一个

2

m

2^m

2m 位的寄存器,对应于存储体中的

2

m

2^m

2m 个存储单元。 每位表示对应存储单元的匹配状态: 1 表示匹配(相等),0 表示不匹配。

相联存储器在许多领域都有广泛的应用,例如:

高速缓存 (Cache): 用于快速查找缓存中是否存在所需数据,提高CPU访问速度。虚拟存储器: 用于存储段表、页表或快表(TLB),实现虚拟地址到物理地址的快速转换。数据库和知识库: 用于快速检索和更新数据库或知识库中的信息。

2.2、高速缓存

高速缓存是一种容量小、速度快的高速存储器,位于 CPU 和主存储器(主存)之间,用于存储当前 CPU 最频繁访问的程序和数据,以提高 CPU 的数据访问速度。其主要特点如下:

位置: 位于 CPU 与主存之间,作为 CPU 访问主存的缓冲区。容量: 通常从几 KB 到几 MB 不等,远小于主存。速度: 比主存快 5-10 倍,甚至更快。实现: 由快速的半导体存储器(例如 SRAM)构成。内容: 存储的是主存中部分数据的副本,这些数据是 CPU 在一段时间内经常访问的。透明性: 对程序员来说是透明的,CPU 会自动检查 Cache 中是否存在所需数据,无需程序员干预。

Cache 系统由以下几个主要部分组成:

Cache 存储器: 存储主存数据的副本。主存 (Main Memory): 存储所有程序和数据。CPU: 执行指令并访问数据。控制逻辑: 用于管理 Cache 的数据存储、查找和替换等操作。

当 CPU 需要访问数据时,首先会检查 Cache 中是否存在该数据的副本。

命中(Hit): 如果数据存在于 Cache 中,则称为命中,CPU 直接从 Cache 中读取数据,速度非常快。未命中(Miss): 如果数据不在 Cache 中,则称为未命中,CPU 需要从速度较慢的主存中读取数据,并将该数据(通常是包含所需数据的一个数据块)复制到 Cache 中,以便下次访问。为了保证Cache能够存储最新的数据,当Cache已满,而CPU需要访问的数据又不在Cache中时,需要选择一个Cache块替换掉,选择替换哪个Cache块需要按照一定的替换算法进行。

现代 CPU 通常采用多级 Cache 结构,例如 L1 Cache、L2 Cache、L3 Cache 等,如图所示:

L1 Cache: 位于 CPU 核心附近,容量最小,速度最快。通常分为指令 Cache 和数据 Cache。L2 Cache: 容量大于 L1 Cache,速度略慢于 L1 Cache。L3 Cache: 容量最大,速度最慢。

多级 Cache 的设计是为了在容量、速度和成本之间取得平衡,使得 CPU 能够以较快的速度访问尽可能多的数据。

Cache 地址映射方法: 由于 Cache 存储的是主存数据的副本,因此需要一种机制将主存地址映射到 Cache 地址,以便 CPU 能够快速找到 Cache 中对应的数据块。常见的地址映射方法有以下三种:

直接映射 (Direct Mapping):

主存中的每个块只能映射到 Cache 中的一个特定块。优点:实现简单,地址转换速度快。缺点:灵活性差,容易发生冲突,导致 Cache 利用率低。如果主存中需要频繁访问的两个数据块恰好映射到Cache中同一个位置,那么会频繁发生替换。 全相联映射 (Fully Associative Mapping):

主存中的每个块可以映射到 Cache 中的任何一个块。优点:灵活性高,Cache 利用率高,冲突少。缺点:实现复杂,需要大量的比较器进行地址查找,速度较慢。 组相联映射 (Set Associative Mapping): 将 Cache 分成若干个组 (Set),主存中的每个块只能映射到 Cache 中的一个特定组中的任何一个块。优点:兼顾了直接映射和全相联映射的优点,在灵活性、速度和成本之间取得了平衡。

直接映射的例子:

主存和 Cache 都被分成大小相同的块。 主存块 i 只能被映射到 Cache 块 i mod (Cache 块数)。当 CPU 发出访问主存的请求时,CPU 从主存地址提取 Cache 块号 (i mod (Cache 块数)),并检查该 Cache 块是否包含请求的主存块的数据。 这需要存储在 Cache 目录中的标签来完成。 标签包含主存块地址 (i) 的一部分。 如果 Cache 块有效并且 Cache 块标签与主存地址的请求部分匹配,则 Cache 命中。

全相联映射的例子:

如果主存为 64MB,Cache 为 32KB,块的大小为 4KB(块内地址需要 12 位),因此主存分为 16384 块,块号从 0~16383,表示块号需要 14 位,Cache 分为 8 块,块号为 0~7,表示块号需 3 位。存放主存块号的相联存储器需要有 Cache 块个数相同数目的单元(该例中为 8),相联存储器中每个单元记录所存储的主存块的块号,该例中相联存储器每个单元应为 14 位,共 8 个单元。

在地址变换时,利用主存地址高位表示的主存块号与Cache中相联存储器所有单元中记录的主存块号进行比较,若相同即为命中。这时相联存储器单元的编号就对应要访问Cache的块号,从而在相应的Cache块中根据块内地址(上例中块内地址是12位,Cache与主存的块内地址是相同的)访问到相应的存储单元。

组相联映射的例子:

假定 Cache 有 16 块,再将每两块分为 1 组,则 Cache 就分为 8 组。主存同样分区,每区 16 块,再将每两块分为 1 组,则每区就分为 8 组。

组相联映像就是规定组采用直接映像方式而块采用全相联映像方式。也就是说,主存任何区的 0 组只能存到 Cache 的 0 组中,1 组只能存到 Cache 的 1 组中,依此类推。组内的块则采用全相联映像方式,即一组内的块可以任意存放。也就是说,主存一组中的任一块可以存入Cache相应组的任一块中。

在这种方式下,通过直接映像方式来决定组号,在一组内再用全相联映像方式来决定Cache中的块号。由主存地址高位决定的主存区号与Cache中区号比较可决定是否命中。主存后面的地址即为组号。

替换算法:Cache 替换算法的目标是尽可能提高 Cache 的命中率,从而减少 CPU 访问主存的次数,提高系统性能。 常见的 Cache 替换算法有以下几种:

随机替换算法 (Random Replacement, RR): 当需要替换 Cache 中的块时,使用随机数生成器随机选择一个块进行替换。优点是实现简单;缺点:命中率较低,因为无法保证替换掉的是最不常用的块。先进先出算法 (First-In, First-Out, FIFO): 替换最早进入 Cache 的块。 类似于排队,先进入 Cache 的块先被替换出去。缺点:可能会替换掉虽然进入 Cache 时间早,但仍然经常被访问的块。近期最少使用算法 (Least Recently Used, LRU): 替换最近最少使用的块。 认为最近一段时间内没有被访问的块,将来被访问的可能性也较小。优点是能获得较高的命中率。缺点:实现相对复杂,需要记录每个块的使用情况。优化替换算法 (Optimal Replacement Algorithm, OPT): 替换将来最长时间内不会被访问的块。优点是能够达到理论上的最高命中率。缺点:无法在实际系统中实现,因为需要预知未来程序的执行情况,只能用于理论分析和性能评估。实际使用:OPT 算法通过离线分析程序执行轨迹,获得 Cache 替换情况,在第二次执行该程序时便可以用最有效的方式来替换。这在特定场景下是可以实现的,例如嵌入式系统。

Cache 的性能是影响计算机系统性能的关键因素。 命中率是衡量 Cache 性能的重要指标,但不是唯一的指标。 Cache 设计的目标是在成本允许的范围内,尽可能提高命中率,并缩短存储系统的平均访问时间。

H

c

H_c

Hc​ 为 Cache 的命中率,

t

c

t_c

tc​ 为 Cache 的存取时间,

t

m

t_m

tm​ 为主存的访问时间,则 Cache 存储器的等效加权平均访问时间

t

a

t_a

ta​ 为:

假设 Cache 访问和主存访问是同时启动 (并行访问):

t

a

=

H

c

t

c

+

(

1

H

c

)

t

m

=

t

c

+

(

1

H

c

)

(

t

m

t

c

)

t_a = H_ct_c + (1-H_c)t_m = t_c + (1-H_c)(t_m-t_c)

ta​=Hc​tc​+(1−Hc​)tm​=tc​+(1−Hc​)(tm​−tc​) 其中,

t

c

t_c

tc​ 为 Cache 命中时的访问时间,

t

m

t

c

t_m-t_c

tm​−tc​ 为 Cache 未命中时的额外访问时间 (因为要访问主存)。

假设在 Cache 不命中时才启动主存访问 (串行访问):

t

a

=

t

c

+

(

1

H

c

)

t

m

t_a = t_c + (1-H_c)t_m

ta​=tc​+(1−Hc​)tm​

Cache 失效与流水线: 在指令流水线中,Cache 访问通常作为一个流水线阶段。 Cache 失效会导致流水线暂停,从而降低指令的执行效率。 因此,降低 Cache 失效率是提高 Cache 性能的重要措施。

影响 Cache 失效率的因素:

容量 (Capacity): 当 Cache 容量较小时,容量因素在 Cache 失效中占有较大的比例。 增加 Cache 容量可以提高命中率。块容量 (Block Size): 选择合适的块容量可以减少失效。相联度 (Associativity): 提高 Cache 的相联度可以减少冲突失效。

Cache 容量与命中率的关系:

下图展示了 Cache 命中率与 Cache 容量的关系:

Cache 容量越大,命中率越高,但随着 Cache 容量的增加,命中率的提升幅度会逐渐减小。 此外,增加 Cache 容量还会增加 Cache 的成本和命中时间。

为了进一步提高性能,现代 CPU 通常采用多级 Cache 结构,例如 L1 Cache、L2 Cache、L3 Cache 等。 CPU 访问存储器时,首先查找 L1 Cache,如果 L1 Cache 未命中,则访问 L2 Cache,依此类推,直到所有级别的 Cache 都未命中,才访问主存。

L1 Cache: 速度最快,容量最小,通常集成在 CPU 核心中。 L1 Cache 通常分为指令 Cache (I-Cache) 和数据 Cache (D-Cache),分别用于存储指令和数据。L2 Cache: 速度次之,容量比 L1 Cache 大,通常集成在 CPU 核心附近。L3 Cache: 速度相对较慢,容量最大,通常位于 CPU 核心共享。

多级 Cache 的设计目标是在速度、容量和成本之间取得平衡。 通常要求 L1 Cache 的速度足够快,以匹配 CPU 的主频。 为了获得较高的命中率,L2 Cache 和 L3 Cache 的容量通常较大。 例如,L1 Cache 的容量通常为几 KB 到几十 KB,L2 Cache 的容量通常为几百 KB 到几 MB。

2.3、虚拟存储器

从概念上讲,主存储器(主存)可以被视为一个由大量连续字节组成的线性存储空间,每个字节称为一个存储单元。 每个存储单元都拥有唯一的地址编号,这个地址被称为物理地址 (Physical Address)。 当 CPU 需要访问主存中的数据时,它会提供目标存储单元的物理地址。 然后,主存的读写控制部件会根据该物理地址定位到对应的存储单元,并执行读(或写)操作,完成数据访问。

虚拟存储器:主存的抽象。

现代操作系统提供了一种主存的抽象机制,称为虚拟存储 (Virtual Memory)。 它引入了虚拟地址 (Virtual Address) 的概念,由 CPU 生成。 与直接使用物理地址不同,CPU 使用虚拟地址来访问主存。

为了实现虚拟地址到物理地址的转换,系统使用专门的硬件单元,称为 内存管理单元 (Memory Management Unit, MMU)。 MMU 的核心功能是将 CPU 生成的虚拟地址转换为实际的物理地址。 完成转换后,才会真正使用物理地址访问主存。

假设主存容量为 4GB,下图简化展示了虚拟存储器的访问流程和内存模型:

虚拟存储器本质上是一种逻辑存储器。 它的核心思想是对物理存储设备进行逻辑上的处理,并向用户呈现一个统一的、逻辑化的视图。 因此,用户在使用时,实际上操作的是虚拟的存储空间,无需关心底层复杂的物理环境。

虚拟存储器的优势:

简化编程: 程序员可以使用连续的虚拟地址空间,而无需考虑物理内存的布局和管理。地址空间隔离: 每个进程拥有独立的虚拟地址空间,进程之间无法直接访问彼此的内存,提高了系统的安全性。更大的地址空间: 虚拟地址空间可以大于实际的物理内存大小,使得进程可以使用比物理内存更大的地址空间。内存共享: 多个进程可以共享相同的物理内存页面,从而减少内存占用。充分利用异构存储: 虚拟存储器允许系统将不同的存储设备(例如,内存、硬盘)组合成一个统一的存储空间,从而充分利用异构平台的存储资源,达到最优化的使用效率。例如,可以利用硬盘空间作为内存的扩展(交换空间)。

2.4、外存储器

外存储器(辅助存储器)用于存储暂时不用的程序和数据,这些信息以文件的形式存储。CPU 无法直接访问外存中的信息,必须先将需要的数据从外存以文件为单位调入主存后才能访问。常见的外存储器类型包括:

磁表面存储器: 例如传统的硬盘驱动器 (HDD) 和磁带。光盘存储器: 例如 CD-ROM、DVD 和蓝光光盘。固态硬盘 (SSD): 使用闪存芯片作为存储介质,速度更快,更耐用。

(1)磁盘存储器,特别是硬盘驱动器 (HDD),由于其较快的存取速度和较大的存储容量,是目前广泛使用的外存储器。

硬盘驱动器 (HDD) 的组成:

盘片: 用于存储信息的圆形磁盘,通常一个硬盘中包含多个盘片。驱动器: 包含驱动盘片旋转的电机、控制磁头移动的执行器以及读写磁头。控制器: 接收来自主机的命令,将其转换为驱动器的控制信号,并管理数据传输和格式转换。一个控制器可以控制一个或多个驱动器。接口: 连接主机和磁盘存储器的逻辑电路,例如 SATA、NVMe 等。

硬盘驱动器 (HDD) 的结构和寻址:

磁道 (Track): 盘片表面上一系列同心圆,用于存储数据。磁道从外向内编号,最外圈为 0 道。扇区 (Sector): 将每个磁道沿圆周方向划分为若干个扇区,每个扇区存储固定大小的数据块,通常为 512 字节或 4KB。圆柱面 (Cylinder): 所有盘片上相同编号的磁道构成一个圆柱面。磁头 (Head): 每个盘片表面都有一个对应的读写磁头,用于读取和写入数据。寻址信息: 为了访问硬盘上的特定数据块,需要提供以下寻址信息:硬盘驱动器号、圆柱面号、磁头号(或盘面号)、扇区号。

优化文件存储: 为了提高访问速度,文件在硬盘上存储时,应尽可能将其数据块放置在同一个圆柱面上,或相邻的圆柱面上,以减少磁头寻道时间。

磁盘存储器的关键参数:

道密度 (Track Density, TPI): 沿径向单位距离(通常为每英寸)的磁道数量。位密度 (Bit Density, BPI): 磁道上单位距离(通常为每英寸)可记录的位数。由于内圈磁道的周长较短,为了存储相同数量的数据,内圈磁道的位密度高于外圈磁道。最大位密度指最内圈磁道的位密度。非格式化容量: 磁盘可以存储的总位数,计算公式为:面数 × (磁道数/面) × 内圆周长 × 最大位密度。需要注意的是,这个公式在实际应用中较少使用,因为现代硬盘的结构和存储方式更为复杂。格式化容量: 磁盘上所有扇区中数据区容量的总和,计算公式为:面数 × (磁道数/面) × (扇区数/道) × (字节数/扇区)。这是用户实际可用的存储空间。

传统的 HDD 分类方式包括:

移动磁头固定盘片的磁盘存储器: 这是最常见的 HDD 类型。固定磁头的磁盘存储器: 每个磁道都有一个独立的磁头,寻道时间几乎为零,但成本较高。移动磁头可换盘片的磁盘存储器: 例如早期的软盘驱动器。温彻斯特磁盘存储器 (Winchester Disk,简称温盘): 将磁头、盘片和驱动机构密封在一个无尘的壳体内,提高了可靠性和存储密度,是现代 HDD 的基础。

现代硬盘几乎都是温彻斯特磁盘结构,并采用移动磁头固定盘片的设计。其他类型的硬盘已经逐渐淘汰。 因此,在讨论现代硬盘时,通常直接称之为 HDD,而无需区分这些具体的类型。

(2)光盘存储器是一种利用聚焦激光束在光盘介质上进行非接触式数据读写的高密度存储设备。与磁表面存储器相比,光盘存储器具有更高的存储密度和更长的数据保存寿命。

根据其读写特性,光盘存储器可以分为以下几类:

只读光盘 (CD-ROM, Compact Disc Read-Only Memory): 由生产厂家预先使用激光在盘片上刻录数据,用户只能读取数据,不能写入或修改数据。CD-ROM 是目前应用最广泛的光盘类型之一,常用于软件分发、音乐和视频存储等。一次写入多次读取光盘 (WORM, Write Once Read Many): 用户可以一次性写入数据,之后可以多次读取,但不能擦除或修改已写入的数据。 WORM 光盘利用激光束的热能使光盘表面发生永久性物理变化来记录信息,适用于数据归档和长期保存。可擦写光盘: 用户可以多次写入、读取和擦除数据。可擦写光盘利用激光照射引起介质的可逆性物理变化来记录信息。常见的可擦写光盘包括 CD-RW、DVD-RW、DVD-RAM、BD-RE 等。

光盘存储器的结构和工作原理:

光盘存储器由光学、电子和机械组件构成。其核心部件包括激光器、透镜、光电检测器和驱动电机等。数据读取时,激光束照射到光盘表面,反射光线的强度变化被光电检测器感知,并转换为数字信号。数据写入时,激光束改变光盘表面的物理或化学特性,以记录数据。

光盘存储器的特点:

高存储密度: 光盘存储器可以存储大量数据,尤其是在采用多层和多通道技术的情况下。大存储容量: 相比于早期的存储介质,光盘可以存储更大的数据量。非接触式读/写: 光头与光盘表面不接触,减少了磨损,延长了光盘的寿命。数据长期保存: 光盘上的数据可以保存很长时间,通常可达 10 年以上,甚至更久。高数据传输率 (对于多通道光盘): 采用多通道记录时,数据传输率可以达到很高的水平,例如 200Mb/s 或更高。低制造成本: 光盘的制造成本相对较低,尤其对于大规模生产而言。对机械结构精度要求不高: 相比于硬盘,光盘驱动器对机械结构的精度要求相对较低。存取时间较长: 由于需要移动光头进行寻道,光盘的存取时间通常比硬盘更长。

随着固态硬盘 (SSD) 技术的快速发展和普及,光盘存储器在很多应用场景中逐渐被取代。 然而,由于其低成本、长期保存特性以及良好的便携性,光盘在某些领域仍然具有一定的应用价值,例如数据备份、影音光盘发行等。

(3)固态硬盘 (SSD) 是一种使用闪存芯片(FLASH芯片)或 DRAM 作为存储介质的非易失性存储设备。与传统的机械硬盘 (HDD) 相比,SSD 具有更快的读写速度、更低的功耗、更小的体积和重量以及更高的耐用性。

固态硬盘的类型:

基于闪存的固态硬盘: 这是目前市场上最主要的 SSD 类型,使用 NAND 闪存芯片作为存储介质。基于 DRAM 的固态硬盘: 使用 DRAM 作为存储介质,速度非常快,但成本高,且需要持续供电才能保存数据,通常用于对性能要求极高的特定应用场景。

基于闪存的固态硬盘的组成:

闪存芯片 (NAND Flash): 用于存储数据的核心组件。控制器 (Controller): SSD 的核心控制单元,负责数据管理、损耗均衡、垃圾回收、错误纠正等功能,并连接闪存芯片和外部接口。控制器的性能直接影响 SSD 的整体性能。缓存 (Cache, 通常为 DRAM): 用于缓存常用的数据,提高读写速度。PCB 板 (Printed Circuit Board): 用于连接和支撑各个组件。

固态硬盘的特点:

读写速度快: 相比于 HDD,SSD 的读写速度显著提升,可以大幅加快系统启动、应用程序加载和文件访问速度。重量轻、体积小: SSD 通常比 HDD 更轻更小,更适合用于便携式设备。功耗低: SSD 的功耗低于 HDD,有助于延长电池续航时间。静音: SSD 没有机械部件,工作时不会产生噪音。抗震性强: SSD 不像 HDD 那样容易受到震动和冲击的影响,数据更安全。价格较高: 尽管 SSD 的价格在不断下降,但仍然比相同容量的 HDD 更贵。容量相对较低: 虽然 SSD 的容量也在不断提升,但目前仍然低于 HDD 的最高容量。数据恢复难度较大: SSD 的数据恢复比 HDD 更为复杂和困难。

固态硬盘的接口和兼容性:

大多数固态硬盘采用与传统 HDD 相同的接口规范,例如 SATA、SAS 和 NVMe,因此可以很容易地替换或升级现有的 HDD。 常见的 SSD 外形尺寸也与 2.5 英寸 HDD 相同,方便安装。 NVMe (Non-Volatile Memory Express) 是一种新的高速接口规范,专为 SSD 设计,可以充分发挥 SSD 的性能优势。

随着技术的进步和成本的下降,固态硬盘正逐渐成为主流存储设备,广泛应用于各种计算机系统和移动设备中。

2.5、磁盘阵列技术 (RAID)

磁盘阵列 (Disk Array) 是一种将多个物理磁盘组合成一个逻辑单元,以提高存储性能、容量、可靠性和数据安全性的技术。 现在常见的磁盘阵列通常被称为独立磁盘冗余阵列 (Redundant Array of Independent Disks, RAID)。

RAID 通过数据条带化 (Striping)、镜像 (Mirroring) 和校验 (Parity) 等技术,来实现不同的性能和容错级别。 以下列出了常见的 RAID 级别及其说明:

RAID 级别说明RAID-0条带化 (Striping): 将数据分散存储在多个磁盘上,没有冗余,因此没有容错能力。 性能最高,读写速度是单个磁盘的 N 倍(N 为磁盘数量),但可靠性最低,阵列中任何一个磁盘损坏,所有数据都会丢失。 平均故障间隔时间 (MTBF) 是单个磁盘的 1/N。RAID-1镜像 (Mirroring): 将数据完全复制到两个或多个磁盘上,提供完全的数据冗余。 性能与单个磁盘相当,但可靠性非常高,可以承受阵列中一半的磁盘同时损坏。 磁盘利用率低,存储容量为单个磁盘的容量。RAID-2海明码校验 (Hamming Code Parity): 使用海明码进行错误检测和纠正。 这种 RAID 级别比较复杂,很少使用。RAID-3专用校验盘条带化 (Striping with Dedicated Parity): 数据条带化存储在多个磁盘上,校验信息存储在专用的校验盘上。 提高了有效存储容量。 如果校验盘损坏,所有数据都将丢失。RAID-4独立数据磁盘条带化与专用校验盘 (Independent Data Disks with Dedicated Parity): 允许对组内各磁盘进行独立读写操作。 数据条带化存储,校验信息存储在专用的校验盘上。 容易出现校验盘的性能瓶颈。RAID-5分布式校验条带化 (Distributed Parity Striping): 对 RAID-4 的改进,不再设置专门的校验盘,校验信息均匀分布在所有磁盘上。 解决了 RAID-4 中校验盘的性能瓶颈问题。 允许一个磁盘损坏,数据可以通过校验信息恢复。 读性能好,写性能相对较差。RAID-6双重分布式校验 (Dual Parity Striping): 在 RAID-5 的基础上增加了额外的校验信息,允许阵列中同时损坏两个磁盘,仍然可以保证数据完整性。 提供更高的数据安全性,但写性能更差。RAID-10 (RAID-1+0)镜像条带化 (Mirrored Striping): 先将数据镜像,然后在镜像后的磁盘上进行条带化。 结合了 RAID-1 的高可靠性和 RAID-0 的高性能。 需要至少 4 个磁盘,数据安全性高,性能好,但磁盘利用率较低。

复合 RAID:

上述 RAID 级别还可以组合使用,形成复合 RAID 级别,例如 RAID 10 (RAID 1+0)、RAID 50 (RAID 5+0) 等。 复合 RAID 能够结合不同 RAID 级别的优点,满足特定的性能、容量和可靠性需求。 具体的复合 RAID 级别的实现方式和优缺点比较复杂,这里不再详细介绍。

选择合适的 RAID 级别需要综合考虑以下因素:

数据的重要性: 重要数据需要选择具有更高冗余级别的 RAID,例如 RAID 1、RAID 6 或 RAID 10。性能需求: 对性能要求高的应用可以选择 RAID 0、RAID 5 或 RAID 10。预算限制: RAID 级别越高,所需的磁盘数量越多,成本也越高。存储容量需求: 不同的 RAID 级别对磁盘的利用率不同,需要根据实际的存储容量需求进行选择。

通过合理选择 RAID 级别,可以有效地提高存储系统的性能、可靠性和数据安全性,从而满足不同应用场景的需求。

2.6、存储区域网络 (SAN)

在大型服务器系统后端,通常部署着一个专门的网络,用于连接一台或多台服务器与多个存储设备,这种网络被称为存储区域网络 (Storage Area Network, SAN)。 这些存储设备可以是 RAID 阵列、磁带备份系统、磁带库、CD-ROM 库等各种类型的存储介质。

SAN 的主要目标是:

满足服务器对存储容量的需求: 提供可扩展的、大容量的存储解决方案,满足不断增长的数据存储需求。实现多个服务器之间共享文件系统和辅助存储空间: 允许多个服务器访问和共享同一个存储池,避免数据和程序代码的重复存储,提高存储资源的利用率。实现分布式存储系统的集中管理: 通过集中的管理平台,简化存储设备的配置、监控和维护,降低管理成本,提高管理效率。

SAN 本质上是一个连接服务器和存储设备的专用网络。 它能够将分布在不同地点的 RAID 阵列等存储资源组织成一个逻辑上的存储设备,供多个服务器共享访问。 这种架构使得服务器可以像访问本地磁盘一样访问 SAN 中的存储资源,而无需关心底层存储设备的物理位置和具体配置。

SAN 的优势:

高可用性: 通过冗余的存储设备和网络连接,提高系统的可用性,避免单点故障导致的数据丢失。高性能: 采用高速的网络协议 (如光纤通道) 和优化的存储架构,提供高性能的存储访问能力。可扩展性: 可以根据业务需求灵活地扩展存储容量和性能,满足不断增长的数据存储需求。集中管理: 提供集中的管理平台,简化存储设备的配置、监控和维护,降低管理成本,提高管理效率。资源共享: 允许多个服务器共享存储资源,提高存储资源的利用率。

三、输入/输出 (I/O) 技术

3.1、微型计算机中内存与接口的编址方法

计算机系统中,内存和 I/O 接口需要分配地址,以便 CPU 能够访问和控制它们。常见的编址方法有两种:内存与接口地址独立编址 和 内存与接口地址统一编址。

1) 内存与接口地址独立编址 (Isolated I/O)

原理: 内存地址和 I/O 接口地址使用完全独立的两个地址空间。 访问内存和访问 I/O 接口使用不同的指令集,I/O 指令专门用于接口的读/写操作,而其他指令则用于内存操作。CPU通过不同的控制信号线(例如:memory read/write和I/O read/write信号线)区分是对内存还是接口进行访问。优点: 编程和阅读程序时更容易区分内存访问和 I/O 访问,逻辑清晰。地址空间互相独立,互不影响。缺点: I/O 指令通常较少,功能相对较弱,对 I/O 接口的操作能力受到限制。需要更多的控制信号线。

2) 内存与接口地址统一编址 (Memory-Mapped I/O)

原理: 内存地址和 I/O 接口地址共享同一个地址空间,即内存单元和 I/O 接口共用地址空间。 地址空间被划分成两部分:一部分分配给 I/O 接口使用,另一部分分配给内存单元使用。 分配给内存的地址区间只能用于内存单元,接口不能使用,反之亦然。CPU通过地址总线上的地址来区分是对内存还是接口进行访问,不需要额外的控制信号。优点: 理论上,用于内存的指令都可以用于 I/O 接口,极大地增强了对接口的操作功能,灵活性更高。指令集统一,编程模型更加简单。缺点: 整个地址空间被分割成两部分,可能导致内存地址不连续,降低内存的使用效率。 由于内存指令和 I/O 指令没有明确区分,维护程序时需要仔细查看参数定义表,增加了代码阅读和维护的难度。可能与内存地址冲突,需要 careful planning。

3.2、直接程序控制

直接程序控制是指外设数据的输入/输出过程完全在 CPU 执行程序的控制下完成。 这种方式可以分为无条件传送和**程序查询方式 (轮询)**两种情况。

1) 无条件传送

原理: 外设始终处于准备就绪状态,可以随时接收 CPU 发送的输出数据,也可以随时向 CPU 提供需要输入的数据,不需要额外的状态检查。适用场景: 适用于速度匹配的、可靠性高的设备,例如某些简单的LED指示灯控制等。

2) 程序查询方式 :CPU 通过执行程序来周期性地查询外设的状态,判断外设是否准备好接收数据或准备好了向 CPU 输入的数据。 根据外设的状态,CPU 有针对性地为外设的输入/输出服务。 这种方式也称为轮询 (Polling)。 实现步骤:

CPU 发送状态查询指令到外设。外设返回其状态信息。CPU 根据返回的状态信息判断外设是否准备就绪。如果外设准备就绪,CPU 则执行相应的 I/O 操作。否则,CPU 继续查询外设的状态。

程序查询方式的缺点:

通常,一个计算机系统中可以存在多种不同的外设,如果这些外设都采用程序查询方式工作,CPU 需要对这些外设逐一进行查询,才能确定哪个外设已经准备就绪并需要服务。 这种轮询机制存在以下主要缺点:

CPU 效率低下: CPU 在大部分时间里都在不断地查询外设的状态,而无法执行其他任务,造成 CPU 资源的浪费。 对于低速外设,CPU 大量时间都用于等待,效率极低。实时性差: 对外部突发事件的响应不及时。 由于 CPU 必须按照预定的顺序依次查询各个外设,即使某个外设需要立即处理,CPU 也必须等到轮询到该外设时才能做出响应,无法实现实时响应。

由于上述缺点,直接程序控制方式(特别是程序查询方式)适用于简单的、低速的外设,而对于需要高效率和实时性的外设,通常会采用中断方式或 DMA 方式进行 I/O 操作。

3.3、中断方式

程序控制 I/O (例如轮询) 的主要缺点在于 CPU 必须花费大量时间等待 I/O 系统完成数据传输,并且需要定期查询 I/O 系统的状态以确认传输是否完成。 这显著降低了整个系统的性能。

中断方式的出现是为了解决程序控制 I/O 的低效问题。 在中断方式下,当 I/O 系统与外设交换数据时,CPU 无需等待或查询 I/O 状态,而是可以执行其他任务。 当 I/O 系统准备就绪后,它会发出中断请求信号 (Interrupt Request, IRQ) 通知 CPU。 CPU 接收到中断请求信号后,会暂停当前正在执行的程序,保存其状态 (例如,程序计数器和寄存器内容),然后跳转到中断服务程序 (Interrupt Service Routine, ISR) 的执行,完成与 I/O 系统的数据交换。 数据交换完成后,CPU 会恢复之前保存的状态,继续执行被中断的程序。 与程序控制方式相比,中断方式提高了 CPU 的利用率,从而提高了系统整体效率。

在具有多个中断源的系统中,需要一种机制来处理来自不同中断源的中断请求。 常用的中断处理方法包括:

(1) 多中断信号线法 (Multiple Interrupt Lines): 每个中断源都拥有独立的中断请求线,直接连接到 CPU。 不同的中断线对应不同的中断优先级。

优点: 硬件实现简单,响应速度快,优先级处理直接。缺点: 需要大量的中断线,扩展性差,适用于中断源数量较少的系统。

(2) 中断软件查询法 (Software Polling): 所有中断源共享一根中断请求线。 当 CPU 检测到中断请求信号时,会进入中断服务程序,然后通过软件轮询每个中断源,检查其状态寄存器,以确定哪个中断源发出了中断请求。 对各个设备的响应优先级由软件设定。

优点: 硬件成本低,只需要一根中断线。缺点: 响应速度慢,因为需要软件轮询,效率低。

(3) 菊花链法 (Daisy Chain): 所有 I/O 模块共享一根共同的中断请求线,而中断确认信号 (Interrupt Acknowledge, INTA) 则以链式结构在各模块间相连。 当 CPU 检测到中断请求信号时,会发出中断确认信号。 中断确认信号依次在 I/O 模块间传递,直到到达发出请求的模块。 该模块接收到中断确认信号后,会将自己的中断向量 (Interrupt Vector) 或 设备 ID 放到数据总线上,供 CPU 读取。

优点: 硬件实现相对简单,只需要少量控制线。缺点: 响应速度取决于设备在链中的位置,离 CPU 越远的设备响应越慢。优先级处理隐含在链式结构中。

(4) 总线仲裁法 (Bus Arbitration): I/O 设备在发出中断请求之前,必须先通过总线仲裁机制获得总线控制权。 当 I/O 设备获得总线控制权后,才能发出中断请求信号。 当 CPU 发出中断响应信号后,该设备会将自己的 中断向量 (Interrupt Vector) 或 设备 ID 发送到数据总线上。

优点: 优先级处理通过总线仲裁机制实现,比较灵活。缺点: 硬件实现复杂,需要总线仲裁逻辑。

(5) 中断向量表法 (Interrupt Vector Table): 中断向量表 是一个存储各个中断源的中断服务程序入口地址的表格。 当外设发出中断请求信号 (INTR) 之后,中断控制器 (Interrupt Controller, INTC) 会确定中断号,并根据中断号查找中断向量表,获取对应中断服务程序的入口地址。 同时,INTC 会将中断请求信号提交给 CPU。 中断源的优先级由 INTC 控制。

优点: 响应速度快,中断处理灵活,优先级控制方便,易于扩展。 是现代计算机系统中最常用的中断处理方法。缺点: 需要维护中断向量表,占用一定的内存空间。

在具有多个中断源的计算机系统中,各个中断源对服务的紧急程度可能不同。 因此,需要根据中断源的紧急程度来安排对它们的服务顺序,这就是中断优先级控制。

在中断优先级控制系统中,通常给最紧急的中断源分配最高的优先级,而给那些紧急程度相对较低的中断源分配较低的优先级。 在进行优先级控制时,需要解决以下两种情况:

(1) 同时中断请求: 当不同优先级的多个中断源同时提出中断请求时,CPU 应该优先响应优先级最高的中断源。

(2) 中断嵌套: 当 CPU 正在为一个中断源服务时,又有比它优先级更高的中断源提出中断请求,CPU 应该能够暂停当前正在执行的中断服务程序,转而为优先级更高的中断源服务。 服务完成后,CPU 再返回到先前被中断的优先级较低的中断服务程序继续执行。 这种情况称为中断嵌套 (Interrupt Nesting),即一个中断服务程序中嵌套着另一个中断服务程序。为了正确处理中断嵌套,需要使用堆栈来保存被中断的程序的上下文信息。

3.4、直接存储器存取 (DMA)

在计算机与外设交换数据的过程中,无论是无条件传送、轮询方式传送还是中断方式传送,都涉及到 CPU 执行程序来控制数据传输,这会限制数据传输的速度。这些方式都需要 CPU 的参与,CPU 需要发出指令、处理中断,因此影响了 CPU 的效率,限制了传输速度。

直接存储器存取 (Direct Memory Access, DMA) 是一种允许外设直接访问系统内存的技术,从而实现高速数据传输,而无需 CPU 的持续干预。 DMA 的核心思想是将数据在内存和 I/O 设备之间进行成块传送的工作交给一个专门的硬件单元——DMA 控制器 (DMAC) 完成。 CPU 只需要在传输过程开始时启动 DMAC,并设置好传输参数 (例如,源地址、目标地址、传输长度等),以及在传输过程结束时接收 DMAC 发出的通知即可。 在数据块传输期间,CPU 可以执行其他任务,从而大大提高了系统的整体效率。

DMA 工作流程:

外设发出 DMA 请求: 需要进行数据传输的外设向 DMAC 发出 DMA 请求信号 (DMA Request, DREQ)。DMAC 向 CPU 发出总线请求: DMAC 接收到外设的 DMA 请求后,向 CPU 发出总线请求信号 (Hold Request, HOLD)。 这个信号通常连接到 CPU 的保持请求输入端 HOLD。CPU 响应总线请求: CPU 在完成当前的总线周期后,会立即响应 DMAC 的请求。 CPU 的响应主要体现在两个方面:

发出保持响应信号 (Hold Acknowledge, HLDA): CPU 将有效的保持响应信号 HLDA 输出到 DMAC,告知 DMAC 它的请求已得到响应,总线即将释放。释放总线控制权: CPU 将其输出的总线信号置为高阻态,意味着 CPU 放弃了对系统总线的控制权,包括地址总线、数据总线和控制总线。 DMAC 控制总线: 此时,DMAC 获得了对系统总线的控制权,开始执行数据传输。 DMAC 同时向提出请求的外设发送 DMAC 响应信号,告知外设其请求已得到响应,可以开始数据传输。DMAC 执行数据传输: DMAC 控制地址总线和控制总线,从源地址读取数据,然后将数据写入目标地址。 DMAC 根据预先设定的传输参数 (例如,传输长度) 控制数据传输的进行。传输完成: 当 DMAC 完成指定数量字节的数据传输后,它会使 HOLD 信号变为无效并加到 CPU 上,撤销对 CPU 的总线请求。CPU 恢复总线控制: CPU 检测到无效的 HOLD 信号,就知道 DMAC 已完成数据传输。 CPU 随后送出无效的 HLDA 响应信号,并重新获得对系统总线的控制权。 CPU 接着从 DMA 过程之前被打断的地方继续执行程序。

关键点强调:

(1)在 DMA 传输过程中,CPU 无需干预。 整个系统总线完全交由 DMAC 控制,由它完成数据传输。 (2)在 DMA 传输数据时,DMAC 要占用系统总线。 根据占用总线方法的不同,DMA 可以分为以下几种模式:

CPU 停止法 (Burst Mode/Block Transfer): DMAC 在整个数据块传输过程中一直占用总线,CPU 必须等待 DMAC 完成整个数据块的传输才能重新获得总线控制权。 这种方式传输速度最快,但 CPU 的等待时间也最长。总线周期分时法 (Cycle Stealing): DMAC 在 CPU 不使用总线 (例如,CPU 执行内部操作) 的空闲周期内占用总线进行数据传输。 这种方式不会让 CPU 完全停止工作,但传输速度相对较慢。总线周期挪用法 (Transparent DMA): DMAC 只有在 CPU 访问内存之外的地址时才能使用总线。 这种方式对 CPU 的影响最小,但传输速度最慢。

无论采用哪种方式,在 DMA 传输数据期间,CPU 都不能使用总线进行内存访问,这会对 CPU 的执行效率产生一定的影响。 选择合适的 DMA 模式需要在传输速度和 CPU 效率之间进行权衡。

3.5、通道和外围处理机

直接存储器存取 (DMA) 方式通过允许外设直接访问内存,极大地减轻了 CPU 对 I/O 操作的控制负担,从而显著提高了 CPU 的效率。 然而,通道的出现进一步提升了 CPU 的效率和 I/O 系统的性能。

通道 是一种具有特殊功能的处理器,通常被称为 输入/输出处理器 (Input/Output Processor, IOP)。 它可以视为一个专用于管理 I/O 操作的迷你 CPU。 通道分担了 CPU 的一部分 I/O 控制功能,负责外围设备的统一管理,并完成外围设备与主存之间的数据传送,而无需 CPU 的直接干预。 CPU 只需要向通道发出 I/O 指令,指定需要执行的操作 (例如,读取数据、写入数据、设备地址、内存地址、传输长度等),然后通道就可以独立地完成数据的传输。

与 DMA 相比,通道的主要优势在于其具有更强的独立性和智能性。 DMA 通常只能完成简单的数据块传输,而通道则可以执行更复杂的 I/O 操作,例如:

设备寻址和选择: 通道可以根据 CPU 的指令选择特定的 I/O 设备进行操作。数据格式转换: 通道可以在不同的数据格式之间进行转换,以适应不同的 I/O 设备和内存存储格式。错误检测和处理: 通道可以检测 I/O 操作中的错误,并采取相应的处理措施,例如,重试传输或向 CPU 报告错误。多个 I/O 设备并行操作: 一个通道可以同时管理多个 I/O 设备,实现并行的数据传输,进一步提高 I/O 系统的吞吐量。

通道方式大大提高了 CPU 的工作效率,使得 CPU 可以专注于计算任务,而无需花费大量时间来处理 I/O 操作。 然而,这种效率的提高是以增加更多的硬件为代价的。 通道的引入意味着系统需要额外的处理器和控制电路,增加了系统的成本和复杂性。

外围处理机 (Peripheral Processor Unit, PPU) 方式是通道方式的进一步发展。 PPU 是专用的处理机,它根据主机的 I/O 命令,完成对外设数据的输入输出以及更复杂的 I/O 相关处理。 PPU 比传统的通道具有更强的处理能力和更大的灵活性。

在一些系统中,会设置多台 PPU,分别承担不同的 I/O 控制任务、通信任务、维护诊断任务等。 例如,一台 PPU 可以负责管理磁盘 I/O,另一台 PPU 可以负责管理网络通信。 这种多 PPU 的系统实际上已经演变成了一种分布式的多机系统。 从某种意义上说,主机负责执行主要的计算任务,而 PPU 则负责执行各种 I/O 相关的辅助任务,从而形成一个分工明确、协同工作的系统。

从 CPU 直接控制 I/O,到 DMA,再到通道和 PPU,体现了 I/O 系统发展的一种趋势,即:

减少 CPU 的参与: 越来越多的 I/O 控制功能被转移到专门的硬件单元 (例如,DMAC、通道、PPU) 上,从而减轻 CPU 的负担。提高 I/O 系统的智能性: I/O 系统能够执行更复杂的 I/O 操作,而无需 CPU 的干预。提高 I/O 系统的并行性: I/O 系统能够同时管理多个 I/O 设备,实现并行的数据传输,从而提高 I/O 系统的吞吐量。

四、总线结构

总线 (Bus) 是计算机系统中用于连接各种设备并传输信息的共享通信通道。 它是计算机硬件系统内部多种设备之间的通信线路,其核心特征是所有连接到总线上的设备都共享该通道。 这使得计算机系统能够将各种设备连接到总线上,实现设备间的数据交换。

总线的分类

从功能上划分,微机中的总线主要分为三大类:

数据总线 (Data Bus, DB): 用于在 CPU、内存和 I/O 设备之间传输数据信息。 DB 是双向总线,CPU 可以通过 DB 从内存或输入设备读取数据,也可以通过 DB 将内部数据发送到内存或输出设备。 DB 的宽度 (位数) 决定了 CPU 和计算机其他设备之间每次能够交换的数据量。 数据总线是衡量计算机数据传输能力的重要指标。

地址总线 (Address Bus, AB): 用于 CPU 发送地址信息,以指定需要访问的内存单元或 I/O 设备。 AB 是单向总线,地址信息只能由 CPU 发送给内存或 I/O 设备。 内存是按地址访问的,每个存储单元都有唯一的地址。 地址总线的宽度 (位数) 决定了 CPU 的最大寻址能力。 例如,要访问 1MB (220 字节) 的内存,需要 20 根地址线。

控制总线 (Control Bus, CB): 用于传输控制信号、时序信号和状态信息,以协调 CPU、内存和 I/O 设备之间的操作。 CB 包含多种控制信号线,例如读信号、写信号、中断请求信号等。 CB 中的每一条信号线的信息传输方向是单向且确定的,但 CB 作为一个整体是双向的,因为既有 CPU 向内存/设备发出的控制信号,也有内存/设备向 CPU 发出的状态信号。 在各种结构框图中,控制总线 CB 通常以双向线表示。

总线的性能直接影响到整个计算机系统的性能。 任何系统和外围模块的开发都必须符合所采用的总线规范。 总线技术随着微机结构的改进而不断发展和完善。

以下是一些常见的总线类型,按照出现时间或应用场景进行大致排序:

ISA (Industry Standard Architecture) 总线: 早期工业标准总线,主要用于连接声卡、网卡等低速 I/O 设备。 只能支持 16 位的 I/O 设备,数据传输率较低,已被淘汰。

EISA (Extended Industry Standard Architecture) 总线: 在 ISA 总线基础上发展起来的 32 位总线,提高了数据传输率,但由于成本较高,未能成为主流。

PCI (Peripheral Component Interconnect) 总线: 一种高性能的并行总线,广泛应用于连接显卡、网卡、声卡等高速 I/O 设备。 PCI 总线工作与 CPU 的工作相互独立,可以实现即插即用。 PCI 总线上的设备可以请求成为主控设备,进行点对点的数据传输。 PCI 总线还能进行奇偶校验检测,提高数据传输的可靠性。

AGP (Accelerated Graphics Port) 总线: 专门为显卡设计的高速总线,是 PCI 总线的一种变体,用于提高显卡的性能。 随着 PCI-Express 总线的普及,AGP 总线也逐渐被淘汰。

PCIe (Peripheral Component Interconnect Express) 总线: 一种高速串行总线,采用点对点连接,每个设备都有自己的专用连接,无需共享带宽。 PCIe 总线具有更高的传输速率和更好的可扩展性,已经成为主流的计算机总线。 PCIe 接口根据总线位宽不同而有所差异,包括 x1、x4、x8 和 x16 等,不同的位宽对应不同的传输速度。 PCIe 支持热插拔和双向全双工传输。

前端总线 (Front-Side Bus, FSB): 连接 CPU 和北桥芯片的总线。 FSB 的数据传输能力对计算机整体性能影响很大。 选购主板和 CPU 时,需要注意两者是否兼容,即主板需要支持 CPU 所需的 FSB 频率。

RS-232C: 一种常用的串行外总线,主要用于连接调制解调器、打印机等低速外设。 RS-232C 只需要较少的传输线即可实现全双工通信,传输距离较远,抗干扰能力较好。

SCSI (Small Computer System Interface) 总线: 一种并行外总线,广泛用于连接硬盘、光盘驱动器、扫描仪等。 SCSI 总线具有较高的传输速率和良好的可扩展性,但成本较高。

SATA (Serial ATA) 总线: 一种串行 ATA 总线,主要用于连接硬盘和光盘驱动器。 SATA 总线具有结构简单、支持热插拔、纠错能力强等优点,已成为主流的硬盘接口。

USB (Universal Serial Bus): 一种通用的串行总线,广泛应用于连接键盘、鼠标、打印机、移动硬盘等各种外设。 USB 支持即插即用和热插拔,具有使用方便、易于扩展等优点。 USB 可以通过集线器 (Hub) 进行树状连接,连接多个设备。

IEEE 1394 (FireWire): 一种高速串行外总线,主要用于连接数码摄像机、数码相机等设备。 IEEE 1394 支持热插拔,可以为外设提供电源,并支持同步和异步数据传输。

IEEE 488 (GPIB): 一种并行总线接口标准,主要用于连接仪器仪表等设备。 IEEE 488 按照位并行、字节串行的方式传输信号,连接方式为总线方式。

这些总线各有特点,适用于不同的应用场景。 随着技术的不断发展,新的总线技术也不断涌现,以满足计算机系统对更高性能、更高带宽的需求。

五、总结

计算机体系结构是连接硬件与软件世界的桥梁,它定义了程序员眼中的计算机属性,也规范了硬件设计的蓝图。 从阿姆达尔最初的定义,到拜尔提出的包含结构、组织、实现和性能的四要素模型,计算机体系结构的概念不断演进,日趋完善。 本文深入探讨了计算机体系结构的各个方面,从宏观的系统分类到微观的指令集设计,再到 I/O 技术的演进和存储系统的优化,力求为读者呈现一幅全面而深入的计算机体系结构图景。

回顾核心概念:

体系结构、组织与实现: 体系结构是概念性的蓝图,组织是逻辑上的实现,而实现则是物理层面的构建。 理解这三者之间的关系是理解计算机系统的关键。指令集体系结构 (ISA): ISA 定义了处理器所能执行的指令集及其编码方式,是硬件与软件交互的界面。 CISC 和 RISC 代表了指令集设计的两种不同方向,各有优劣。存储层次结构: 存储系统由多种存储器组成,包括高速缓存、主存、外存等。 通过有效的组织和管理,可以提高存储系统的整体性能。I/O 技术: 从程序控制 I/O 到中断,再到 DMA 和通道,I/O 技术不断演进,以减轻 CPU 负担,提高系统效率。总线结构: 总线是连接计算机各部件的通信线路,其性能直接影响整个系统的性能。

相关推荐