1. 计算机系统组成      

简单说,通常意义上的计算机系统就是硬件和软件的一个综合体。
一、计算机组成与体系结构_第1张图片

想深入研究,可以看看《计算机体系结构量化研究方法》和《数据结构与分析》再说

1.1 计算机硬件的组成
简单点说,硬件就是肉眼可见、触手可摸的物理实体

展开点说,如下图 1-1 所示,为计算机最基本的组成框图
一、计算机组成与体系结构_第2张图片
控制器:程序计数器 PC、指令寄存器 IR、指令译码器 ID、时序部件
运算器:算术逻辑单元 ALU、累加寄存器 AC、数据缓冲寄存器 DR、状态条件寄存器 PSW(存状态标志与控制标志,争议点:也有将其归为控制器的)

有些设备既可以是输入设备,同时也可以是输出设备,例如辅助存储器、网卡、数模转换装置等,而其它即使看上去是纯粹的输入设备,绝大部分都会需要接受CPU输出的控制指令、工作参数输入;纯粹的输出设备,也需要向CPU报告设备信息(例如设备类型、型号,工作状态等),所以统称为IO设备(Input/Output Devices)或者输入输出设备。

想个问题:计算机是以人为模板设计出来的吗?
控制器+运算器 = 大脑左右脑
主存储器 = 记忆力
辅助存储器 = 书本笔记
输入设备 = 耳朵眼睛
输出设备 = 嘴巴四肢

想深入学习的,可以看看《计算机组成原理》和《微机原理与接口技术》

Mark下
组成原理:怎么设计CPU,怎么设计计算机系统
体系结构:怎么设计CPU性能会高,怎么设计计算机系统性能会高
微机与接口:世界上已经设计好的CPU有千千万万,选择一个,怎么设计应用

1.2 计算机系统结构的分类
计算机的发展经历了电子管时代、晶体管时代、集成电路时代(中小规模、大规模、超大规模、甚大规模、极大规模)
先了解下计算机系统的架构:
冯·诺依曼架构(Von Neumann architecture),也称普林斯顿结构(Princeton architecture)
一、计算机组成与体系结构_第3张图片
哈佛架构(Harvard architecture)
一、计算机组成与体系结构_第4张图片
冯•诺依曼架构的计算机在结构上是以运算器为中心的,而发展到现在,已转向以存储器为中心了
改进型哈佛架构
一、计算机组成与体系结构_第5张图片

  1. 存储程序的概念
    “存储程序”的概念是冯•诺依曼等人于 1946 年 6 月首先提出来的,它可以简要地概括为以下几点:
    (1)计算机(指硬件)应由运算器、存储器、控制器、输入设备和输出设备五大基本部件组成。
    (2)计算机内部采用二进制来表示指令和数据。
    (3)将编好的程序和原始数据事先存入存储器中,然后再启动计算机工作。这就是存储程序的基本含义。
    冯•诺依曼对计算机世界的最大贡献在于“存储程序控制”概念的提出和实现。
    通常把符合存储程序概念的计算机统称为冯•诺依曼型计算机,主要弱点:存储器访问会成为瓶颈。
    非冯•诺依曼型计算机,例如,数据驱动的数据流计算机、需求驱动的归约计算机和模式匹配驱动的智能计算机等。
  2. 弗林(Flynn)分类
    1966 年,Michael.J.Flynn 提出根据指令流、数据流的多倍性特征对计算机系统进行分类(通常称为 Flynn 分类法),有关定义如下。
    (1)指令流:指机器执行的指令序列;
    (2)数据流:指由指令流调用的数据序列,包括输入数据和中间结果,但不包括输出数据。
    单指令流单数据流(SISD)、单指令流多数据流(SIMD)、多指令流单数据流(MISD)、多指令流多数据流(MIMD)
    一、计算机组成与体系结构_第6张图片

1.3 复杂指令集系统与精简指令集系统
复杂指令系统计算机(CISC):AMD、Intel、VIA 等的 x86 架构的 CPU系列
精简指令系统计算机(RISC):甲骨文 (Oracle) 公司的 SPARC 系列、 IBM 公司的 Power Architecture (包括 PowerPC) 系列、与安谋公司 (ARM Holdings) 的 ARM CPU 系列

比较内容 CISC RISC
指令系统 复杂,庞大 简单,精简
指令数目 通常有 100~250 条 一般小于100
指令格式 一般大于4 一般小于4
寻址方式 支持的寻址方式通常为 5~20 种 只支持寄存器寻址、立即数寻址和相对寻址
指令字长 不固定 等长
可访存指令 不加限制 只有LOAD/STORE指令
各种指令使用频率 相差很大 相差不大
各种指令执行时间 相差很大 绝大多数在一个周期内完成
优化编译实现 很难 较容易
程序源代码长度 较短 较长
控制器实现方式 绝大多数为微程序控制 绝大多数为硬布线控制
软件系统开发时间 较短 较长

1.4 总线
总线是一组能为多个部件 分时 共享 的公共信息传送线路,有并发和串行两种方式

分类 描述
内部总线 在 CPU 内部,寄存器之间和算术逻辑部件 ALU 与控制部件之间传输数据所用的总线
外部总线 CPU 与内存 RAM、ROM 和输入/输出设备接口之间进行通信的通路
地址总线 传送地址信息
数据总线 传送数据信息
控制总线 传送各种控制信号

总线速度是制约计算机整体性能的最大因素,总线的带宽(即单位时间内可以传输的总数据数)为:总线带宽 = 频率×宽度(Bytes/sec)

2. 存储器系统

存储器是用来存放程序和数据的部件
一、计算机组成与体系结构_第7张图片
传统的存储器系统一般分为高速缓冲存储器(Cache)、主存、辅存三级,计算机采用多级存储器体系,确保能够获得尽可能高的存取速率,同时保持较低的成本,这得益于局部性原理。
局部性原理是指程序在执行时呈现出局部性规律,即在一较短的时间内,程序的执行仅局限于某个部分(时间局部性)。相应地,它所访问的存储空间也仅局限于某个区域(空间局部性)。

存取方式 描述 介质
顺序存取 数据以记录的形式进行组织,对数据的访问必须按特定的线性顺序进行 磁带
直接存取 数据块都拥有唯一的地址标识,读写装置可以直接移动到目的数据块所在位置进行访问 磁盘
随机存取 数据存储在寻址单元,每个寻址单元都具有自己唯一的地址和读写装置,系统可以在相同的时间内对任意一个存储单元的数据进行访问 主存
相联存取 相联存取也是一种随机存取的形式,但是选择某一单元进行读写是取决于其内容而不是其地址,使用相联存取方式,可以对所有的存储单元的特定位进行比较,选择符合条件的单元进行访问 Cache

2.1. 主存储器
主存用来存放计算机运行期间所需要的程序和数据,CPU 可直接随机地进行读/写。

分类 描述 作用
随机存取存储器(Random Access Memory,RAM) 既可以写入也可以读出,但断电后信息无法保存,因此只能用于暂存数据 DRAM(Dynamic RAM,动态 RAM)和 SRAM(Static RAM,静态 RAM)
只读存储器(Read Only Memory,ROM) 可以看作 RAM 的一种特殊形式,其特点是:存储器的内容只能随机读出而不能写入 存放系统程序 BIOS(Basic Input Output System,基本输入输出系统)

内存编址方法在计算机系统中,存储器中每个单元的位数是相同且固定的,称为存储器编址单位。不同的计算机,存储器编址的方式不同,主要有字编址和字节编址。

2.2. 辅助存储器
1.磁带存储器是一种顺序存取的设备,其特点包括:存取时间较长,但存储容量大,便于携带,价格便宜。磁带应用的场景越来越少,目前主要用于资料的归档保存。
2.硬盘存储器在硬盘中,信息分布呈以下层次:记录面、圆柱面、磁道和扇区,如图1-2 所示:
一、计算机组成与体系结构_第8张图片
一台硬盘驱动器中有多个磁盘片,每个盘片有两个记录面,每个记录面对应一个磁头,所以记录面号就是磁头号,如图 1-2(a)所示。所有的磁头安装在一个公用的传动设备或支架上,磁头一致地沿盘面径向移动,单个磁头不能单独地移动。在记录面上,一条条磁道形成一组同心圆,最外圈的磁道为 0 号,往内则磁道号逐步增加,如图 1-2(b)所示。在一个盘组中,各记录面上相同编号(位置)的各磁道构成一个柱面,如图 1-2(c)所示。
若每个磁盘片有 m 个磁道,则该硬盘共有 m 个柱面。引入柱面的概念是为了提高硬盘的存储速度。当主机要存入一个较大的文件时,若一条磁道存不完,就需要存放在几条磁道上。这时,应首先将一个文件尽可能地存放在同一柱面中。如果仍存放不完,再存入相邻的柱面内。
通常将一条磁道划分为若干个段,每个段称为一个扇区或扇段,每个扇区存放一个定长信息块(例如,512 个字节),如图 1-2(b)所示。一条磁道划分多少扇区,每个扇区可存放多少字节,一般由操作系统决定。磁道上的扇区编号从 1 开始,不像磁头或柱面编号从 0开始。
在磁盘上进行信息的读写时,首先需要定位到目标磁道,这个过程称之为寻道,寻道所消耗的时间称为寻道时间,定位到目标磁道后,需要定位到目标扇区,此过程通过旋转盘片完成,平均旋转半圈可到目标位置。故磁盘访问时间为:
磁盘访问时间(存取时间) = 寻道时间+旋转延迟时间

2.3. Cache 存储器
Cache 的功能是提高 CPU 数据输入输出的速率,突破所谓的“冯•诺依曼瓶颈”,即 CPU与存储系统间数据传送带宽限制。高速存储器能以极高的速率进行数据访问,但因其价格高昂,如果计算机的内存完全由这种高速存储器组成,则会大大增加计算机的成本。通常在CPU 和内存之间设置小容量的 Cache。Cache 容量小但速度快,内存速度较低但容量大,通过优化调度算法,系统的性能会大大改善,仿佛其存储系统容量与内存相当而访问速度近似 Cache。
Cache 通常采用相联存储器(ContentAddressable Memory,CAM)。CAM 是一种基于数据内容进行访问的存储设备。当对其写入数据时,CAM 能够自动选择一个未用的空单元进行存储;当要读出数据时,不是给出其存储单元的地址,而是直接给出该数据或者该数据的一部分内容,CAM 对所有存储单元中的数据同时进行比较,并标记符合条件的所有数据以供读取。由于比较是同时、并行进行的,所以,这种基于数据内容进行读写的机制,其速度比基于地址进行读写的方式要快很多。
1.Cache 基本原理
使用 Cache 改善系统性能的依据是程序的局部性原理。根据程序的局部性原理,最近的、未来要用的指令和数据大多局限于正在用的指令和数据,或是存放在与这些指令和数据位置上邻近的单元中。这样,就可以把目前常用或将要用到的信息预先放在 Cache 中。当CPU 需要读取数据时,首先在 Cache 中查找是否有所需内容,如果有,则直接从 Cache 中读取;若没有,再从内存中读取该数据,然后同时送往 CPU 和 Cache。如果 CPU 需要访问的内容大多都能在 Cache 中找到(称为访问命中),则可以大大提高系统性能。
如果以 h 代表对 Cache 的访问命中率(“1-h”称为失效率,或者称为未命中率),t1 表示 cache 的周期时间,t2 表示内存的周期时间,以读操作为例,使用“Cache+主存储器”的系统的平均周期为 t3。则:
t3 =t1′h+t2′(1-h)
系统的平均存储周期与命中率有很密切的关系,命中率的提高即使很小也能导致性能上的较大改善。
例如,设某计算机主存的读/写时间为 l00ns,有一个指令和数据合一的 Cache,已知该Cache 的读/写时间为 10ns,取指令的命中率为 98%,取数的命中率为 95%。在执行某类程序时,约有 1/5 指令需要存/取一个操作数。假设指令流水线在任何时候都不阻塞,则设置 Cache 后,每条指令的平均访存时间约为:
(2%′100ns+98%′10ns)+1/5′(5%′100ns+95%′10ns)=14.7ns
2.映射机制
当 CPU 发出访存请求后,存储器地址先被送到 Cache 控制器以确定所需数据是否已在 Cache 中,若命中则直接对 Cache 进行访问。这个过程称为 Cache 的地址映射(映像)。在 Cache 的地址映射中,主存和 Cache 将均分成容量相同的块(页)。常见的映射方法有直接映射、全相联映射和组相联映射。
(1)直接映像
直接映像方式以随机存取存储器作为 Cache 存储器,硬件电路较简单。在进行映像时,主存地址被分成三个部分,从高到低依次为:区号、页号以及页内地址,如图 1-3 所示:
一、计算机组成与体系结构_第9张图片
在本例中,内存容量为 1GB,Cache 容量为 8MB,页面的大小为 512KB。直接映像中,先分区,再分页。一个区的大小就是 Cache 容量的大小,所以一共分:1GB/8MB=128 个区,区号 7 位。每个区分:8MB/512KB=16 个页,所以页号为 4 位。
在直接映像方式中,每个主存页只能复制到某一固定的 Cache 页中,如图 1-4 所示:
一、计算机组成与体系结构_第10张图片
直接映像方式的映像规律是:主存中每个区的第 0 页,只能进入到 Cache 的第 0 页。即:若当前时刻 Cache 中 0 号页已被占据,而 1-15 号页空闲,现在要将 1 区第 0 页(即内存的 16 页)调入 Cache 是会发生冲突的。所以直接映像的块冲突率非常高。
在 Cache 中,为每一个页设立一个 Cache 标记,该标记用于识别当前的 Cache 块来自于哪个内存页。直接映像中,由于每个区的 N 号页,都必须进入到 Cache 的 N 号页,所以只需要记录区号即可。所以此时标记位的长度是 7 位。
直接映像方式的优点是比较容易实现,缺点是不够灵活,有可能使 Cache 的存储空间得不到充分利用。
(2)全相联映像
全相联映像使用相联存储器组成的 Cache 存储器。在全相联映像方式中,主存的每一页可以映像到 Cache 的任一页。如果淘汰 Cache 中某一页的内容,则可调入任一主存页的内容,因而较直接映像方式灵活。
在全相联映像方式中,主存地址分为两个部分,分别为地址部分(主存页标记)和数据部分(页内地址)。数据部分用于存放数据,而地址部分则存放该数据的存储器地址。如图 1-5所示:
一、计算机组成与体系结构_第11张图片
全相联映像方式的 Cache 组织如图 1-6 所示:
一、计算机组成与体系结构_第12张图片
当进行映像时,在我们给定的例子中,当程序访存时,则高 11 位给出主存页号,低19 位给出页内地址。因为每个 Cache 页可映像到 2048 个主存页中的任一页,所以每页的Cache 标记也需要 11 位,以表明它现在所映像的主存页号。因此,Cache 标记信息位数增加,比较逻辑成本随之增加。
在全相联映像方式中,主存地址不能直接提取 Cache 页号,而是需要将主存页标记与Cache 各页的标记逐个比较,直到找到标记符合的页(访问 Cache 命中),或者全部比较完后仍无符合的标记(访问 Cache 失败)。因此这种映像方式速度很慢,失掉了高速缓存的作用,这是全相联映像方式的最大缺点。如果让主存页标记与各 Cache 标记同时比较,则成本又太高。全相联映像方式因比较器电路难于设计和实现,只适用于小容量 Cache。
(3)组相联映像
组相联映像(页组映像)介于直接映像和全相联映像之间,是这两种映像的一种折衷方案。全相联映像方式以页为单位,可自由映像,没Cache 中。在组相联映像方式中,主存与 Cache 都分组,主存中一个组内的页数与 Cache 的分组数相同,如图 1-7 所示:
一、计算机组成与体系结构_第13张图片
在图 1-7 给出的例子中,主存分 128 个区,每个区 8 个组,每个组 2 个页。组相联映像方式的主存地址组织如图 1-8 所示:
一、计算机组成与体系结构_第14张图片
组相联映像的规则是:主存中的组与 Cache 的组形成直接映像关系,而每个组内的页是全相联映像关系。如主存 1 区 0 页,他在 0 组中,所以只能进入 Cache 的 0 组中,至于进入到 Cache 的 0 组 0 页,还是 0 组 1 页,并无强制要求,可任意放置。
在组相联映像中,Cache 中每一页的标记位长度为 8 位,因为此时除了要记录区号,还得记录组号,即区号 7 位加组号 1 位等于 8 位。
容易看出,如果 Cache 中每组只有一页,则组相联映像方式就变成了直接映像方式。如果 Cache 中每组页数为 16 页(即 Cache 只分一组),则就是全相联映像。因此,在具体设计组相联映像时,可以根据设计目标选取某一折衷值。
在组相联映像中,由于 Cache 中每组有若干可供选择的页,因而它在映像定位方面较直接映像方式灵活;每组页数有限,因此付出的代价不是很大,可以根据设计目标选择组内页数。
希赛教育专家提示:为保障性能,内存与 Cache 之间的映射往往采用硬件完成,所以Cache 对于程序员而言是透明的,程序员编程时,完全不用考虑 Cache。
3.替换算法
当 Cache 产生了一次访问未命中之后,相应的数据应同时读入 CPU 和 Cache。但是当Cache 已存满数据后,新数据必须替换(淘汰)Cache 中的某些旧数据。最常用的替换算法有以下三种:
(1)随机算法。这是最简单的替换算法。随机法完全不管 Cache 块过去、现在及将来的使用情况,简单地根据一个随机数,选择一块替换掉。
(2)先进先出(First In and First Out,FIFO)算法。按调入 Cache 的先后决定淘汰的顺序,即在需要更新时,将最先进入 Cache 的块作为被替换的块。这种方法要求为每块做一记录,记下它们进入 Cache 的先后次序。这种方法容易实现,而且系统开销小。其缺点是可能会把一些需要经常使用的程序块(如循环程序)替换掉。
(3)近期最少使用(Least Recently Used,LRU)算法。LRU 算法是把 CPU 近期最少使用的块作为被替换的块。这种替换方法需要随时记录 Cache 中各块的使用情况,以便确定哪个块是近期最少使用的块。LRU 算法相对合理,但实现起来比较复杂,系统开销较大。通常需要对每一块设置一个称为“年龄计数器”的硬件或软件计数器,用以记录其被使用的情况。
4.写操作
因为需要保证缓存在 Cache 中的数据与内存中的内容一致,相对读操作而言,Cache 的写操作比较复杂,常用的有以下几种方法。
(1)写直达(write through)。当要写 Cache 时,数据同时写回内存,有时也称为写通。当某一块需要替换时,也不必把这一块写回到主存中去,新调入的块可以立即把这一块覆盖掉。这种方法实现简单,而且能随时保持主存数据的正确性,但可能增加多次不必要的主存写入,会降低存取速度。
(2)写回(write back)。CPU 修改 Cache 的某一块后,相应的数据并不立即写入内存单元,而是当该块从 cache 中被淘汰时,才把数据写回到内存中。在采用这种更新策略的cache 块表中,一般有一个标志位,当一块中的任何一个单元被修改时,标志位被置“1”。在需要替换掉这一块时,如果标志位为“1”,则必须先把这一块写回到主存中去之后,才能再调入新的块;如果标志位为“0”,则这一块不必写回主存,只要用新调入的块覆盖掉这一块即可。这种方法的优点是操作速度快,缺点是因主存中的字块未随时修改而有可能出错。
(3)标记法。对 Cache 中的每一个数据设置一个有效位。当数据进入 Cache 后,有效位置“1”;而当 CPU 要对该数据进行修改时,数据只需写入内存并同时将该有效位置“0”。当要从 Cache 中读取数据时需要测试其有效位,若为“l”则直接从 Cache 中取数,否则,从内存中取数。

3. 流水线

流水线技术把一个任务分解为若干顺序执行的子任务,不同的子任务由不同的执行机构负责执行,而这些机构可以同时并行工作。在任一时刻,任一任务只占用其中一个执行机构,这样就可以实现多个任务的重叠执行,以提高工作效率。

3.1. 流水线周期
流水线应用过程中,会将需要处理的工作分为 N 个阶段,最耗时的那一段所消耗的时间为流水线周期。如:使用流水线技术执行 100 条指令,每条指令取指 2ms,分析 4ms,执行 1ms,则流水线周期为 4ms。

3.2. 计算流水线执行时间
延续上面的场景,将 1 个任务的执行过程可分成 N 个阶段,假设每个阶段完成时间为 t,则完成该任务所需的时间即为 Nt。若以传统的方式,则完成 k 个任务所需的时间是kNt;而使用流水线技术执行,且花费的时间是 Nt+(k-1)t。也就是说,除了第 1 个任务需要完整的时间外,其他都通过并行,节省下了大量的时间。所以流水线的执行时间可通俗的表达为:
流水线执行时间=第 1 条指令的执行时间+(n-1)流水线周期
注:n 代表需要处理的任务数量。
在考试时,又需要特别注意一个细节问题,流水线的执行时间计算,其实进一步可以分理论情况与实践情况两种不同的处理方式。下面以实例进行说明。
例:某计算机系统,一条指令的执行需要经历取指(2ms)、分析(4ms)、执行(1ms)三个阶段,现要执行 100 条指令,利用流水线技术需要多长时间?
理论上来说,1 条指令的执行时间为:2ms+4ms+1ms=7ms。
所以:理论流水线执行时间=2ms+4ms+1ms+(100-1)
4=403ms。
而实际上,真正做流水线处理时,考虑到处理的复杂性,会将指令的每个执行阶段的时间都统一为流水线周期,即 1 条指令的执行时间为:4ms+4ms+4ms=12ms。 所以:实际流水线执行时间=4ms+4ms+4ms+(100-1)*4=408ms。
希赛教育专家提示:考试时 80%以上的概率采用理论公式计算,所以考试时需要以理论公式计算,若计算的结果无正确选项才考虑采用实际公式计算。

3.3. 流水线的吞吐率
流水线的吞吐率(Though Put rate,TP)是指在单位时间内流水线所完成的任务数量或输出的结果数量。有些文献也称为平均吞吐率、实际吞吐率。计算流水线吞吐率的最基本的公式如下:
一、计算机组成与体系结构_第15张图片

3.4. 流水线的加速比
在流水线中,因为在同一时刻,有多个任务在重叠地执行,虽然完成一个任务的时间与单独执行该任务相近(甚至由于分段的缘故,可能更多一些),但是从整体上看完成多个任务所需的时间则大大减少。
完成同样一批任务,不使用流水线所用的时间与使用流水线所用的时间之比称为流水线的加速比(speedup ratio)。如果不使用流水线,即顺序执行所用的时间为 T0 ,使用流水线的执行时间为 Tk ,则计算流水线加速比的基本公式如下:
一、计算机组成与体系结构_第16张图片
如果流水线各个流水段的执行时间都相等(设为 Dt),则一条 k 段流水线完成 n 个连续任务所需要的时间为(k+n-1)Dt。如果不使用流水线,即顺序执行这 n 个任务,则所需要的时间为 nkDt。因此,各个流水段执行时间均相等的一条 k 段流水线完成 n 个连续任务 时的实际加速比为:
一、计算机组成与体系结构_第17张图片

考点梳理:

例题:
1、内存地址从 AC000H 到 C7FFFH,则共有 C7FFFFH-AC000H=1BFFFH 个地址单元(转换为十进制后,为 112KB)。如果该内存地址按字(16bit)编址,则共有 112KB16 位。假设该内存由 28 片存储器芯片构成,已知构成此内存的芯片每片有 16KB 个存储单元,则该芯片每个存储单元存储(112KB16)/(28*16KB)=4 位。