# 计算机组成原理
# 计算机系统概述
# 计算机的发展历程
计算机按照用途可以分为:
- 专用计算机: 可以更高效地解决某些特定的问题, 但是适应性强较差;
- 通用计算机: 适应性强, 应用范围很广, 但是针对某些特定问题性能差于专用计算机;
# 计算机系统层次结构
计算机系统是由『 硬件 』和『 软件 』组成的.
软件和硬件在逻辑上是可以『 等效的 』
- 对于某一个功能, 其既可以用硬件实现, 也可以用软件实现.
- 一般来讲, 硬件实现效率高, 但是成本也高. 软件实现效率低, 但是成本低;
1945 年, 数学家冯诺依曼提出了『 存储程序 』的概念, 也就是用一个存储器即存放数据也存放指令 ( 之前是分开存放的 ) 以此概念为基础的各种计算机统称为『 冯-诺依曼 』计算机. 它的特点如下 👇:
# 计算机硬件的基本组成
✏️『 存储器 』:
存储器分为:
- 主存储器:
- 简称 "主存", 也称为 "内存储器". 用来存放程序和数据;
- CPU 可以直接访问;
- 辅助存储器:
- 简称 "辅存", 也称为 "外存储器". 用来帮助主存去记忆更多的信息;
- 辅存中的信息需要被调入主存后, 才能让 CPU 访问;
- "存储字长" 一般为一个字节或字节的偶数倍长度;
数据和指令在主存中以 "地址" 作为标识进行存储:
- 地址线: 用来传输地址信息, CPU 在存储器中寻找一个数据时,先通过地址线找到地址,然后再通过 "数据线" 将数据取出来;
- 寻址范围: 表示能寻址区间的大小;
- 寻址空间: 间指能够寻址最大容量;
存储器中数据的编址方式可以分为:
- 按字编址: 最小编址单位是字, 每一个地址指向一个储存字, 通过地址只能将一字长的信息读出或写入存储器;
- 按字节编址: 最小编址单位是字节, 通过地址可以访问存储器中的任何一个字节;
- 按照字节编址时, 一个储存字里可能包含多个字节, "字地址" 指的就是这几个连续的字节地址的最小值.
- 🌰 一个字的长度为 32 位, 字地址指的就是具有 4 的倍数的那些地址, 0, 4, 8, 16, ... 除此之外, 对应的还有 "半字地址", 也就是 2 的倍数, 0, 2, 4, 6, 8, ... "双字地址", 8 的倍数 0, 8, 16, 24, ...
🌰 假如储存字长为 32 位, 内存的大小为 64KB ( 512Kbit )
- 按字编址:
- 寻址空间: 就是内存的大小 64 KB;
- 寻址范围: 1 个字长等于 4 个字节, 地址长度为 14 位, 需要 14 根地址线;
- 按字节编址:
- 寻址空间: 就是内存的大小 64 KB;
- 寻址范围: 地址长度为 16 位, 需要 16 根地址线;
- 地址寄存器 MAR: 存放访存地址, 经过 "地址译码器" 译码后找到所选的 "存储单元";
- 数据寄存器 MDR: 暂存从主存中读或写的信息;
MAR 和 MDR 虽然是存储器的一部分, 但是在现代计算机中存在于 CPU 里;
✏️『 运算器 』:
运算器是对信息进行处理和运算的部件, 其核心是『 算术逻辑单元 ALU 』主要功能是进行:
- 算术运算: 主要包括, 加, 减, 乘, 除;
- 逻辑运算: 主要包括, 与, 或, 非, 异或, 比较, 移位, 等;
运算器中包含若干『 通用寄存器 』用于暂时存放操作数和中间结果.
✏️『 控制器 』:
控制器是整个计算机的指挥中心, 使计算机各部件能自动协调工作.
计算机中有两种信息在流动: 控制信息 和 数据信息;
控制器由如下部件组成:
- 程序计数器 PC:
- 存放当前预执行指令的地址;
- 内容来自主存的 MAR;
- 指令寄存器 IR:
- 存放当前的指令的内容;
- 内容来自主存的 MDR;
- 控制单元 CU:
- 指令中的 "操作码" 字段 OP ( 来自 IR ) 会被送至 CU 用以分析指令, 并向硬件发出各种微操作命令序列;
- 指令中的 "地址码" 字段 Ad ( 来自 IR ) 被送往 MAR 来提取操作数;
计算机读取一条指令时, 分为两个阶段:
- 取指阶段: 在此阶段, 通过访问存储器将指令取出;
- 执行阶段: 在此阶段, 通过访问存储器将操作数取出;
虽然指令和数据在储存器中都以二进制的形式存储, 但是计算机可以根据阶段的不同的, 来判断取出的内容是什么;
✏️『 I/O 设备 』:
输入设备, 将人类熟悉的信息形式转换成计算机可以接收并识别的信息形式.
输出设备, 将计算机中存储信息形式 ( 二进制 ) 转换成人类或其他设备可以接收并识别的信息形式.
五大部件之间的关系:
- "输入设备" 发送信号给 "控制器" 请求输入信息到计算机中. "控制器" 发送控制信号让 "输入设备" 把信息输入到 "存储器" 中. 输入的信息一定包含 "数据" 和 "指令" 两者;
- "控制器" 从 "存储器" 中读取指令, 然后发送响应的操作命令给 "运算器". "控制器" 再把指令中的地址码交给 "存储器" 的地址译码器去读取操作数, 然后再送到 "运算器" 进行运算;
- 运算结果返回给 "存储器", 然后 "输出设备" 向 "控制器" 发送信号请求输出结果;
# 计算机软件的分类
计算机的软件通常可以分为两大类:
- 系统软件 ( 系统程序 ) : 主要用来管理整个计算机系统, 如操作系统, 编译程序, 文件系统, etc.
- 应用软件 ( 应用程序 ) : 用户根据自己的需求编写的各种程序, 如 QQ, Word, etc.
计算机的编程语言可以分为三大类:
- 机器语言:
- 用二进制数值 "0" 或 "1" 去描述不同的指令. 机器可以直接识别和执行;
- 汇编语言:
- 采用英文缩写的标识符去代表用二进制写的机器码, 更容易让开发者识别和记忆;
- 必须通过汇编程序翻译成机器语言, 才能让计算机硬件识别和执行;
- 高级语言:
- 通过更进一步地抽象和封装, 使得开发更简便, 并且可使用的功能也更多;
- 需要经过编译程序编译成汇编语言, 然后在通过汇编程序翻译成机器语言才能执行. 或者有的高级语言可以由编译程序直接翻译成机器语言;
高级语言的执行方式可以分为两种:
- 编译执行:
- 将源代码作为输入, 通过编译程序最终翻译成用机器语言写的目标程序, 然后再让计算机去执行;
- 可以类比为 "笔译", 把外文文件翻译成中文文件;
- 解释执行:
- 将源代码作为输入, 解释程序解释一句就提交给计算机去执行一句, 然后再解释写一句. 不会形成一个机器语言写的目标程序;
- 可以类比为 "口译", 外国人说一句翻译一句;
计算机系统采用多级的层次结构, 每一层都可以进行程序设计:
# 计算机性能指标
# 数据的表示和运算
# 存储器层次结构
# 存储器的分类
存储器的种类非常多, 根据不同角度可以给存储器做不同分类:
✏️ 按储存介质分类:
- 半导体存储器: 主要包括 "随机存储器" 和 "只读存储器";
- 磁表面存储器: 磁带, 磁盘;
- 光盘存储器: 也叫 "光存储器", 一般指 "光盘";
- 磁心存储器: 基本上已被半导体存储器给取代;
✏️ 按存取方式分类:
- 随机访问存储器 Random Access Memory, RAM:
- 可以随机存取信息, 意思是可以随时地访问存储器的任意存储单元.
- 🌰 就像数组一样, 可以通过下标任意访问;
- 优点: 读写方便, 使用灵活;
- 缺点: 断点信息会丢失;
- 分为静态 RAM ( SRAM ) 和动态 RAM ( DRAM ), 静态 RAM 常作为高速缓冲存储区, 动态 RAM 常作为主存;
- 可以随机存取信息, 意思是可以随时地访问存储器的任意存储单元.
- 只读存储器 Read-Only Memory, ROM:
- 可以随机读取信息, 但是不能写入, 信息断电后仍能够保存, 一般把一些固定, 不变的信息存储在这里;
- 只读存储器 ROM 和随机访问存储器 RAM 一起构成主存;
- 串行访问存储器:
- 对存储单元按照物理位置的顺序依次进行访问;
- 主要包括 "顺序访问存储器" ( 磁带 ) 和 "直接访问存储器" ( 磁盘 )
✏️ 按在计算机中的作用分类: 按照在计算机系统中的作用不同, 可以分为 "主存储器", "辅助存储器", "缓冲存储器"
# 存储器的性能指标
主要有三个性能指标: 存储容量, 单位成本, 存储速度;
一般来说, 速度越快, 价格越高; 容量越大, 单位空间价格越低, 但速度也越低;
存储器的带宽: 单位时间内存储器存取的信息量, 等于 "存储周期" 乘上每个存储周期可访问的比特位数;
- 🌰 存储周期 , 每个存储周期可访问 位比特, 则带宽为
# 存储器的层次化结构
存储器的容量, 价格, 速度之间存在矛盾关系, 计算机中采用多级存储器结构:
存储系统的层次结构主要体现在 "缓存 - 主存" 和 "主存 - 辅存" 这两个存储层次上:
- CPU, 缓存, 主存之间都可以互相直接交换信息;
- 缓存 - 主存层次主要解决 CPU 和主存速度不匹配的问题;
- 主存 - 辅存侧面会从主要解决存储系统的容量问题;
# 半导体随机访问存储器
# 半导体随机访问存储器的基本结构
半导体存储芯片主要由 "存储矩阵" "译码驱动电路" "读写电路" 组成:
- "地址线" 是单向的, "数据线" 是双向的;
- "控制线" 分为:
- 读/写控制线: 用来控制读写操作;
- 片选线: 用来选择存储芯片;
# 半导体存储芯片的 "译码驱动方式"
通过进行 "译码", 地址线送来的 "地址信号" 转换成对应存储单元的 "选择信号". 半导体存储芯片的译码驱动方式主要有: "线选法" 和 "重合法":
线选法 ( 单译码 ) :
存储单元一个个地排列起来构成一个矩阵, 假设矩阵有 行, 每一行代表一个 "存储字", 那么需要的地址线根数等于 :
- 假设矩阵有 16 行, 也就是有 16 个储存字, 那么需要的数据线根数为 ,
通过地址找到对应的储存字后, 在用 "读/写控制电路" 进行读写操作即可.
重合法 ( 双译码 ) :
重合法比线选法操作的粒度更加精细, 可以选中矩阵中的任意一个 "存储元", 也就是可以进行 "位 Bit" 级别的读写;
- 🌰 一个 32 x 32 的矩阵, 行地址线需要 5 根, 列地址线需要 5 根, 通过这 10 根地址线就可以定位到任意一个比特位了.
# SRAM 存储器
# DRAM 存储器
# 只读存储器
# Flash 存储器
- Flash 存储器也称为 "闪存";
- 在没有电流供应的情况下数据也可以得到保存, 其集合了 ROM 和 RAM 的长处;
- 因其特性, 闪存也称为各类便携型数字设备的存储介质基础;
- Flash 存储器都是按块来读写数据的, 而不是字节;
# 存储器容量扩充
单片存储芯片的容量是有限的, 若干存储芯片连接在一起能组成具有更大的容量的存储器, 这称为存储器容量的扩充.
存储器容量扩充通常有 3 类: 位扩充, 字扩充, 字位扩充;
# 双口 RAM 和多模块存储器
- 双口 RAM 具有两组相互独立的地址线, 数据线, 读/写控制线.
- 可以让两个 CPU 进行并行的操作;
- 为了防止出现互斥的冲突, 设置了 "BUSY 标志", 来防止两个 CPU 同时对一个存储单元进行写操作, 但是不阻止同时的读操作. 一方读一方写也是不可以同时进行的;
随着 CPU 的运算速度不断变快, 各种 I/O 设备不断变多, 存储速度称为了计算机系统速度的瓶颈. 为了解决这一问题, 处理寻找 "更高速的元件" 和采用 "存储器层次结构" 外, 还可以通过 "调整主存的结构" 来提高存储速度,
# 单体多字存储器
单体多字存储器中把存储器的 "存储字长" 增加了 倍, 以存放 个指令字或数据字, "单体多字存储器" 的最大带宽比 "单体单字存储器" 的最大带宽提高了 倍.
要使单体多字存储器发挥其效能, 前提是 指令或数据在主存内必须连续存放, 一旦遇到转移指令或操作数不能连续存放, 性能提升的效果就不明显了.
单体多字存储器要求必须凑齐了 个数据字后才能作为一个 "存储字" 写入存储器.
# 多体并行存储器
多体并行存储器是 "多个模块组成的存储器", 每个模块有相同的容量和存取速度, 可以看作是一个独立的存储器. 各模块有独立的地址寄存器, 数据寄存器, 地址译码器, 读/写电路.
通过使用多体并行存储器, 使得 同一时间内不同的请求源同时访问不同的体
多体并行存储器有两种: "高位交叉编制的多体存储器" 和 "低位交叉编制的多体存储器"
✏️ 高位交叉编制的多体存储器:
下图中有 4 个体 ( 模块 ), 每个体内有 8 个存储单元, 可以通过 5 个地址位来确定唯一的存储单元:
存储单元的地址中, 高位表示 "体号", 低位来定位体内具体的存储单元.
优点: 每个模块内的存储单元的地址是连续的. 一个体满了, 只需要地址加 1 就跳到下一个体了;
缺点: 各个模块一个接一个地串行工作, 存储器的带宽收到了限制;
✏️ 低位交叉编制的多体存储器:
🌰 例子:
# 高速缓冲储存区 Cache
# Cache 产生的背景 & 局部性原理
在计算机中可能有多个请求源同时会向存储器请求数据, 存储器会让请求源按照优先级进行排队, 外部设备的优先级高于 CPU, 这会导致 CPU 等待外部设备访存的现象, 从而降低了 CPU 的工作效率.
为了减少 CPU 与 I/0 设备争抢访存, 人们在 CPU 和主存中间加了一个 Cache 缓存. 它会提前把 CPU 近期需要的数据从内存中取出并存起来, 这样 CPU 需要数据时就不用去访问主存了, 直接找 Cache 就行了.
人们根据 "局部性原理" 来猜测哪些数据是 CPU 可能马上会用到的.
# Cache 的基本工作原理
主存和 Cache 的编址:
Cache 的基本结构:
- 地址映射变换机构: 将主存地址转换成对应的 Cache 地址;
- 替换机构: Cache 已满时给 Cache 腾出新的位置来接收主存中的块;
# Cache 和主存之间的映射方式
# Cache 中主存块的替换算法
# Cache 写操作策略
# 虚拟存储器
# 页式虚拟存储器
# 段式虚拟存储器
# 段页式虚拟存储器
# TLB 快表
# 外存储器
# 硬盘存储器
# 磁盘序列
# 光盘存储器
# 指令系统
# 指令格式
计算机硬件识别和执行 "机器语言", 机器语言是由一条条语句构成的, 人们习惯把这些语句称为 "机器指令". 机器指令的集合构成了机器的 "指令系统".
一条指令由 "操作码" 和 "地址码" 两部分组成. 操作码告诉机器要执行什么操作, 地址码告诉对谁进行操作.
# 指令的分类
# 不定长操作码指令格式
定长操作码指令在指令字的最高位部分分配固定的若干位表示操作码.
# 指令寻址方式
# 数据寻址 & 指令寻址
# 常见数据寻址方式
🌰 例子:
# CISC 和 RISC
CISC 的英文全称为 “Complex Instruction Set Computer”,即 "复杂指令系统计算机":
- 从计算机诞生以来,人们 一直沿用 CISC 指令集方式。早期的桌面软件是按 CISC 设计的,并一直沿续到现在。目前,桌面计算机流行的 x86 体系结构即使用 CISC。微处理器(CPU)厂商一直在走 CISC 的发展道路,包括 Intel、AMD,还有其他一些现在已经更名的厂商;
- 在 CISC 微处理器中,程序的各条指令按 顺序串行执行,顺序执行的优点是控制简单,但计算机各部分的利用率不高,执行速度慢;
RISC 的英文全称为 “Reduced Instruction Set Computer”,即 "精简指令集计算机":
- 是一种执行较少类型计算机指令的微处理器,这样它能够以更快的速度执行操作;
# 中央处理器
# CPU 的功能 & 基本结构
# CPU 功能
# CPU 基本结构
# CPU 主要寄存器
# 指令执行过程
# 指令周期
指令周期: CPU 取出并执行一条指令所需的全部时间, 即 CPU 完成一条指令的时间.
指令周期被划分为几个不同的阶段, 每个阶段所需的时间成为 "机器周期", 又称为 "CPU 工作周期" 或 "基本周期"
每个机器周期由若干个 "时钟周期" 组成, 时钟周期是 "时钟频率" 的倒数, 也可以称为 "节拍脉冲" 或 "T 周期"
# 指令执行方案
# 指令的执行过程 & 信息流
信息流 是根据指令要求依次访问的数据序列, 在指令执行的不同阶段, 要求访问的数据序列也是不同的.
# 数据通路的功能 & 基本结构
数据通路: 数据在功能部件之间传送的路径.
- 🌰 CPU 中运算器和寄存器之间的传送数据的路径就是 CPU 内部的数据通路;
# 控制器的功能 & 工作原理
# 控制单元的功能
4. 多级时序系统
# 控制单元的设计
实现控制单元 CU 的方法有两类:
DETAILS-OPEN
2. 微程序设计
🌰 例子:
# 指令流水线
# 指令流水线的基本概念
# 指令流水线的基本实现
🌰 例子:
# 超标量 & 动态流水线的基本概念
# 中断系统
# 总线
# 总线概述
# 总线的基本概念
# 总线的分类
# 总线的组成及性能指标
# 总线的结构
# 总线仲裁
# 集中仲裁方式
# 分布仲裁方式
# 总线操作 & 定时
# 总线周期的概念
# 同步定时方式
# 异步定时方式
# 总线标准
# I/O 设备
# I/O 系统基本概念
# I/O 系统的演变过程
# I/O 系统的基本概念
# 外部设备
输入设备:
- 键盘;
- 鼠标;
输出设备:
- 显示器;
- 打印机;
# I/O 接口 ( 控制器 )
# I/O 接口的功能
每一台 I/O 设备都是通过 I/O 接口连接到系统总线山疙瘩, 并且总线包括数据线, 设备选择线, 命令线, 状态线.
# I/O 接口的基本结构
# I/O 端口及其编址
# I/O 方式
# 程序查询方式
# 程序中断方式
# DMA 方式