从性能角度出发也是很好的认识计算机的方式
SimpleScalar 和 SMPCache
计算机的演变和性能
计算机的发展历史主要由提高处理器速度、减小部件尺寸、增大存储容量、加快 I/O 能力和速度来表征
导致处理器速度大幅度提高的一个关键因素是,缩减微处理器部件的尺寸,即减少部件间的距离,从而提高速度。然而近年来在速度上的真正增益却是来自于处理器的组成,这包括流水线处理技术和并行执行技术的大量使用,以及推测执行技术的使用(推测执行技术可使将来可能需要的指令提前探测性的执行)。所有这些技术的出发点是,最大限度地使处理器保持运行状态。
计算机系统设计的一个关键问题是在各元器件之间的性能平衡,以便在一个领域内所获得的性能增益不被另一领域的滞后所妨碍。特别是,处理器速度的提高远超出存储器存储速度的提高,因此,包括高速缓存技术,从存储器到处理器的更宽的数据路径和更智能的存储芯片等多种技术,用来补偿这种平衡的失调。
计算机功能和互连的顶层视图
指令周期的组成如下:首先取指令,随后取零个或多个操作数,再后存零个或多个操作数,最后是中断检查(若中断允许)。
计算机系统的主要部件(处理器、主存、I/O 模块)为了交换数据和控制信号,需要进行互连。最流行的互连方式是使用多条线组成的共享系统总线。在当今系统中,通常采用层次式总线来改善性能
总线的设计要素包括:仲裁(以集中式或分布式控制来裁决是否允许把型号发送到总线上)、时序(总线上的信号是与中央时钟同步,还是基于最近传送事件的异步传送)和宽度(地址线条数和数据线条数)
cache 存储器
计算机的存储器被组织成层次结构。最顶层(最靠近处理器的一层)是处理器内的寄存器。接下来是一级或多级的高速缓存,当使用多级 cache 时,它们分别标记为 L1, L2 等。再往下的是主存,它通常由动态随机存储器 DRAM 构成,所有这些都被认为是系统内部的存储器。存储层次继续划分外部存储器,下一层通常是固定硬盘,再往下的是可装卸的存储设备,如光盘、磁带机等。
沿着存储器层次结构自顶向下,存储器成本也逐层下降,其容量在变大,而存取时间在边长。只使用最快的存储器当然好,但是它也是最昂贵的,因此我们通过使用更多较慢的存储器,以便达到存取时间与成本之间的均衡。其中的技巧是,在存储器中恰当地组织程序和数据,使需要存取的数据通常在较快的存储器中。
通常,处理器将要访问的主存位置极有可能是刚被访问过的或其临近的位置,所以 cache 会自动保存一些来自近期被使用过的 DRAM 字的副本(地址本身,或地址的一部分就是索引,索引的思维)。如果 cache 设计得合理,那么大多数时候处理器所需要的存储器数据便已经在 cache 中。
内部存储器
半导体随机存取存储器的两种基本形式是动态 RAM(DRAM)和静态 RAM(SRAM)。SRAM 比 DRAM 存取速度快、价格更昂贵,并且集成度较低,一般用于 cache 存储器。而 DRAM 一般用于主存储器。
存储器系统中通常都使用纠错技术,这包括添加一些与原数据位成函数关系的冗余位来构成纠错码。如果出现错误位,纠错码会检测并通常能纠正该错误位。
为了补偿 DRAM 相对较低的速度,现已推出几种先进的 DRAM 组织。使用最普遍的两种是同步 DRAM 和总线式 DRAM(Rambus DRAM)。两者都使用系统时钟以支持数据块传送。
外部存储器
磁盘至今仍然是最重要的外部存储器。从个人计算机到大型机,乃至超级计算机,都广泛使用活动式磁盘和固定式磁盘(硬盘)。
为了实现更高的性能和更好的可用性,服务器以及更大的系统使用 RAID 磁盘技术。RAID 使用了多个磁盘座位数据存储设备的并行阵列的一系列技术,并具有内在冗余性来弥补磁盘故障。
输入 / 输出
计算机系统的 I/O 体系结构是系统与外部世界的接口。这种体系结构提供了一种控制计算机与外部世界交互的系统化方式,并向操作系统提供有效地管理 I/O 行为的必要信息。
有 3 种基本的 I/O 技术:编程式 I/O (Programmed I/O) 技术,即在请求 I/O 操作的程序的直接和连续的控制下所发生的 I/O 操作;中断驱动式 I/O (Interrupt-driver I/O) 技术,即程序发出 I/O 命令后继续执行,直到被 I/O 硬件中断,通知它 I/O 操作完成;还有直接存储器存取(DMA) 技术,即一个专门的 I/O 处理器接管 I/O 操作的控制,在 I/O 设备与存储器之间直接传送大量数据
除了处理器和一组存储器模块外,计算机系统的第三个关键部件是一组输入 / 输出模块。每个模块连接到系统总线或中央交换器,并且控制一个或多个外围设备。一个 I/O 模块不是简单地将设备连接到系统总线的一组机械连接器,而是包含了执行设备与系统总线之间通信功能的逻辑。
为什么不把外设直接连接到系统总线上,原因如下:
- 各种外设的操作方法是不同的,将控制一定范围的外设的必要逻辑合并到某个处理器内是不现实的
- 外设的数据传送速度一般比存储器或处理器慢得多,因此,使用高速的系统总线直接与外设通信是不切实际的
- 另一方面,某些外设的数据传送速率比存储器或处理器要快,同样,若不适当管理,则速度失配将导致无效
- 外设使用的数据格式和字长度通常与处理器不同
因此 I/O 模块是必须的,它有两大主要功能
- 通过系统总线或中央交换器与处理器和存储器连接
- 通过专用数据线与一个或多个外设连接
操作系统支持
操作系统是控制程序在处理器上执行和管理该处理器资源的软件。操作系统具有许多功能,包括进程调度和存储管理,但这些功能的实现离不开处理器硬件的支持。事实上,所有处理器都或多或少具备这种能力,如虚拟存储器管理硬件和进程管理硬件。这些硬件包括专用寄存器、缓冲器以及完成基础资源管理任务的电路。
操作系统最重要的功能之一是进程或任务的调度,操作系统决定在给定时间内运行哪个进程。一般情况下,硬件不断中断运行进程,使操作系统做出新的调度裁决,从而使处理器时间被几个进程公平分配。
操作系统的另一个重要功能是存储管理。大多数当代操作系统都包含虚拟存储器的功能,虚拟存储器有两个优点:1)进程在主存中运行时不需要将程序的全部指令和数据一次性地装入主存;2)程序可用的总存储空间可以大大超过系统的实际主存容量。虽然存储管理是用软件完成的,但操作系统依赖于处理器中的硬件支持,包括分页管理硬件和分段管理硬件。
计算机算术
计算机算数涉及的两个基本方面是数的表示方法(二进制格式)和基本算术运算(加减乘除)的算法。这两个方面既适用于整数算术、也适用于浮点算术。
浮点数表示成一个数(有效值,significant)乘以一个定值(基值,base) 的某个整数幂(指数,exponent)。浮点数能够表示很大的数和很小的数。
大多数处理器都实现了 IEEE 754 标准,用于浮点表示和浮点运算。IEEE 754 定义了 32 位和 64 位两种浮点数格式。
指令集:特征和功能
计算机指令最重要的元素是操作码(opcode),它指明将完成的操作、源和目的操作数的引用方式,并通常隐式指明下一条指令的来源。
操作码指定的操作,一般可有如下类型:算术和逻辑运算,在两个寄存器、寄存器和存储器或存储器两个位置之间传送数据,输入/输出,控制。
操作数引用方式指定如何寻找被操作数据的寄存器或存储器的位置。数据类型可以是地址、数值、字符或逻辑数据。
各类处理器中的一个普遍的体系结构是栈 stack 的使用,栈对程序员是可见的或是不可见的。栈用于管理过程的调用和返回,也可用来提供另一种寻址存储器的方式。栈的基本操作是 PUSH 和 POP,以及在栈顶部一或两个位置上完成的操作。一般来说,栈都实现为从高地址向低地址增长。
字节可以寻址的处理器可分为大端(big endian)、小端(little endian)、双端(bi-endian)这几类。如果多字节的数值是以最高有效字节存于最低地址值的字节来顺序存储,则称为大端;如果它们是以最低有效字节存于最低地址值的字节来顺序存储,则称为小端。既支持大端又支持小端的处理器是双端处理器。
指令集:寻址方式和指令格式
指令的操作数引用有两种形式:一是指令中含有操作数的实际值(立即数),而是指令中含有对操作数地址的引用。各种指令集使用类型广泛的寻址方式。这包括直接寻址(操作数地址在指令的地址字段中)、间接寻址(地址字段指向一个存储位置,此位置含有操作数地址)、寄存器寻址、寄存器间接寻址,以及各种形式的偏移寻址(寄存器值加上地址值产生操作数地址)。
指令格式定义了指令中字段的布局。指令格式设计是一件非常复杂的事情,要考虑到诸多因素,如指令长度是定长还是变长,指派给操作码和每个操作数引用的位数,以及如何确定寻址方式等。
CPU 结构和功能
处理器包括用户可见的寄存器和控制/状态寄存器。用户可见寄存器是指,用户使用机器指令显式或隐式可访问的寄存器。它们可以是通用寄存器,也可以是用于定点或浮点数、地址、变址和段指针这样的专用寄存器。控制和状态寄存器用于控制 CPU 的操作。一个明显的例子是程序计数器。另一重要的例子是程序状态字(PSW),它包含各种状态和条件位,例如反映最近一次算术运算结果的标志位、中断允许位和指示 CPU 当前运行于特权模式下还是用户模式下的状态位。
处理器采用指令流水方式来加速指令的执行。从本质上讲,流水是将指令周期分解成几个连续出现的阶段,如取指令、译码指令、确定操作数地址、取操作数、执行指令和写结果操作数。指令向前移动通过这些段,就像车间的一条装配线一样;于是,不同的指令能同时在各个段上工作。不过,转移和指令间相关性的出现,使流水线的设计和使用变得复杂了。
精简指令集计算机
对设计新型处理器体系结构来说,高级语言程序行为的研究具有指导意义,成果之一就是产生了精简指令集计算机(RISC)。程序中赋值语句占最大份额,这暗示着简单的数据传送应当优化。程序中还是许多 IF 和 LOOP 语句,意味着基本的顺序控制机制需要进行优化,以便有效地使用流水技术。操作数引用样式的研究表明,在寄存器中保持适当数量的操作数会有助于性能的提高
这些研究已导出 RISC 机器的关键特征:其一,有限的指令集并具有固定格式;其二,大量的寄存器或利用编译器来优化寄存器的使用;其三,强调对指令流水线的优化。
RISC 的简单指令集便于有效的流水化,因为每条指令只有少数几种操作,并且这些操作是比较容易确定的。RISC 指令集体系结构自身也有助于实施延迟分支(delayed branch) 技术,这种技术将分支指令和其他指令重排从而提高流水线效率。
指令级并行性和超标量处理器
超标量处理器是一种使用多条相互独立的指令流水线的处理器。每条流水线由多个段(stage)组成,因此每条流水线能同时处理多条指令。多流水线引入了新一级并行性,允许同时处理多个指令流。超标量处理器利用了所谓的指令级并行性(instruction-level parallelism),指令级并行性指的是程序中的指令可以并行执行。
超标量处理器一次取多条指令,然后试图找出几条彼此不相关因而能够并行执行的指令。如果一条指令的输入取决于前面指令的输出,则这条指令不能同时,更不能先于前面指令完成执行。一旦这种相关性被确认,处理器可以以不同于原来代码的顺序发射和完成指令。
通过使用更多的寄存器,或对原代码中的寄存器引用换名,处理器可取消某些不必要的相关性
纯 RISC 处理器经常使用延迟分支来最大限度地利用指令流水线,然而,这种方法不太适用于超标量处理器,大多数超标量机器使用了传统的分支预测法来提高流水线效率。
超标量实现的处理器结构是指,在这样的结构中,包括整数和浮点运算、装载、保存以及条件分支之类的普通指令,能通水启动并独立执行。这种实现引出了涉及指令流水线的几个复杂问题。
超标量设计紧跟 RISC 体系结构的脚步。虽然 RISC 机器的精简指令集体系结构自身已倾向于应用超标量技术,但超标量方法既能用于 RISC 也能用于 CISC 体系结构。
控制器操作
一条指令的执行涉及一系列的统称为周期的子步骤。例如,一条指令的执行可由取指、间接寻址、执行和中断周期组成。每个周期又是由一系列更基本的操作(称为微操作)组成。一个单一的微操作可以完成寄存器间的一次传送,寄存器与外部总线的一次传送,或一个简单的 ALU 操作。
处理器的控制器完成两项任务:1)它使得处理器以正在运行的程序所确定的次序来执行微操作;2)它产生引起微操作执行的控制信号。
控制器产生的控制信号引起逻辑门的打开与管理,从而导致寄存器数据的传送和 ALU 的操作。
一种控制器的实现技术是硬布线技术,采用此技术实现的控制器是一个组合电路。当前机器指令支配的输出逻辑信号被转换为一组输出控制信号
并行处理
提高系统性能的传统方式是使用多个处理器,它们能并行执行,以支持给定的工作负载。两种最普遍的多处理器组织方式是对称多处理器(symmetric multiprocessor, SMP)和集群(cluster)。
SMP 由多个相同或相类似的处理器组成,以总线或某种开关阵列互连成一台计算机。SMP 所需解决的最重要问题是 cache 一致性。每个处理器都有自己的 cache,于是某一行数据可能出现在不止一个 cache 中,如果该行在一个 cache 中被修改,则主存和其他 cache 保存的将是此行的无效版本。cache 一致性协议设计用来解决这个问题
多核计算机
多核计算机或者多核处理器,在一个计算机芯片上有两个或多个处理器。由于硬件性能问题,使用更多单个处理器芯片已达到一个极限,包括指令层并行和功耗的限制。另一方面,多核体系结构给软件开发者探索多核上的多线程能力提出挑战。多核结构的主要变量是芯片处理器的数目、cache 存储器级数、cache 共享的程度。多核系统中另一个结构上的设计决策是单个内核是超标量或者实现并发多线程(SMT)
关键词
- arithmetic and logic unit, ALU: 算数逻辑单元
- control processing unit, CPU: 中央处理单元,中央处理器
- computer architecture: 计算机体系结构,计算机系统结构
- computer organization: 计算机组成,计算机组织
- control unit: 控制器,控制单元
- main memory: 主存
- processor: 处理器
- registers: 寄存器
- system bus: 系统总线
- accumulator AC: 累加器
- Amdahl’s law
- benchmark: 基准程序
- chip: 芯片
- data channel: 数据通道
- embedded system: 嵌入式系统
- execute cycle: 执行周期
- fetch cycle: 取指周期
- instruction buffer register IBR: 指令缓冲寄存器
- instruction register IR: 指令寄存器
- instruction set: 指令集
- integrated circuit IC: 集成电路
- memory address register MAR: 存储器地址寄存器
- memory buffer register MBR: 存储器缓冲寄存器
- microprocessor: 微处理器
- multicore: 多核
- multiplexor: 多路选择器
- opcode: 操作码
- original equipment manufacturer OEM: 原始设备制造商
- program control unit: 程序控制器,程序控制单元
- program counter PC: 程序计数器
- SPEC: 系统性能评估公司
- stored program computer: 存储程序式计算机
- upward compatible: 向上兼容
- wafer: 晶片
- word: 字
- address bus: 地址总线
- asynchronous timing: 异步时序
- bus arbitration: 总线仲裁
- bus width: 总线宽度
- centralized arbitration: 集中式仲裁
- data bus: 数据总线
- disable interrupt: 禁止中断
- distributed arbitration: 分布式仲裁
- instruction cycle: 指令周期
- instruction execute: 指令执行
- instruction fetch: 取指令
- interrupt: 中断
- interrupt handler: 中断处理
- interrupt service routine: 中断服务程序
- peripheral component interconnect PCI: 外设部件互连
- synchronous timing: 同步时序
- system bus: 系统总线
- associative mapping: 全相联映射
- high-performance computing, HPC: 高性能计算
- spatial locality: 空间局部性
- temporal locality: 时间局部性
- write back: 写回
- write through: 写直达
- error-correcting code, ECC: 纠错码
- Hamming code: 汉明码
- nonvolatile memory: 非易失性存储器
- single-error-correcting(SEC) code: 单纠错码
- single-error-correcting, double-error-detecting(SEC-DED) code: 单纠错双坚错码
- soft error: 软差错
- syndrome: 故障,综合故障
- volatile memory: 易失性存储器
- floppy disk: 软磁盘
- magnetoresistive: 磁阻
- multiple zoned recording: 多重区域记录
- optical memory: 光存储器
- pit: 凹坑
- platter: 盘片
- rotational delay: 旋转延迟
- sector: 扇区
- serpentine recording: 蛇形记录
- striped data: 条带数据
- substrate: 衬底
- cycle stealing: 周期窃取
- FireWire: 高速串行连接总线标准
- InfiniBand: 高端宽带 I/O 标准
- isolated I/O: 分离式 I/O
- memory-mapped I/O: 存储器映射式 I/O
- multiplexor channel: 多路转换通道
- parallel I/O: 并行 I/O
- peripheral device: 外围设备
- selector channel: 选择通道
- batch system: 批处理系统
- demand paging: 请求分页
- job control language, JCL: 作业控制语言
- process control block: 进程控制块
- resident monitor: 驻留的监控程序
- segmentation: 分段
- thrashing: 抖动
- time-sharing system: 分时系统
- arithmetic shift: 算术移位
- biased representation: 移码表示法
- denormalized number: 非规格化数
- dividend: 被除数
- divisor: 除数
- exponent overflow: 阶值上溢
- exponent underflow: 阶值下溢
- guard bits: 保护位
- mantissa: 尾数(有效值)
- minuend: 被减数
- multiplicand: 被乘数
- negative overflow: 负上溢
- negative underflow: 负下溢
- quotient: 商
- radix point: 小数点
- sign bit: 符号位
- sign-magnitude representation: 符号-幅值表示法
- subtrahend: 减数
- accumulator: 累加器
- operand: 操作数
- operation: 操作,运算
- packed decimal: 压缩的十进制数
- procedure call: 过程调用
- procedure return: 过程返回
- reentrant procedure: 可重入过程
- skip: 跳步
- autoindexing: 自动变址
- base-register addressing: 基值寄存器寻址
- displacement addressing: 偏移寻址
- effective address: 有效地址
- immediate addressing: 立即寻址
- indexing: 变址
- indirect addressing: 间接寻址
- instruction format: 指令格式
- postindexing: 后变址
- preindexing: 前变址
- register addressing: 寄存器寻址
- register indirect addressing: 寄存器间接寻址
- relative addressing: 相对寻址
- branch prediction: 分支预测
- condition code: 条件码
- delayed branch: 延迟分支
- instruction cycle: 指令周期
- instruction pipeline: 指令流水线
- instruction prefetch: 指令预取
- program status word: 程序状态字
- high-level language: 高级语言
- register file: 寄存器组
- register windows: 寄存器窗口
- SPARC: 可扩展处理器体系结构
- flow dependency: 流相关性
- in-order issue: 按序发射
- in-order completion: 按序完成
- micro-operations: 微操作
- out-of-order completion: 乱序完成
- out-of-order issue: 乱序发射
- output dependency: 输出相关性
- procedural dependency: 读写相关性
- retire: 回收
- superpipelined: 超级流水线式
- write-read dependency: 写读相关性
- write-write dependency: 写写相关性
- hardwired implementation: 硬布线实现
- simultaneous multithreading, SMT: 并发多线程
- superscalar: 超标量