1. 计算系统概论
文章目录
- 1. 计算系统概论
- 1.0 课程概貌
- 1.1 计算机系统简介
- 1.2 计算机的硬件框图
- 1.3 计算机的工作步骤
- 1.4 计算机硬件的主要技术指标
- 本笔记参考哈工大刘宏伟老师的MOOC《计算机组成原理(上)_哈尔滨工业大学》、《计算机组成原理(下)_哈尔滨工业大学》。
- 或者是B站《计算机组成原理(哈工大刘宏伟)135讲(全)高清》,大家一起听比较热闹。
- 中文教材:《计算机组成原理(第二版)-唐朔飞.pdf》、《学习指导与习题解答(第2版)-唐朔飞.pdf》
1.0 课程概貌
“计算机组成原理”是计算机专业课程体系中,唯一一门讲解计算机硬件的逻辑实现的课程,是计算机课程体系中“硬件系列”的上层。本门课程名称拆解:
- 计算机:发展历史上有许多类型的计算机。包括机械式计算机、模拟电子计算机、数字电子计算机。现在的计算机几乎都是“数字电子计算机”,也是本门课程的讲解对象。
- 组成(organization):指计算机硬件系统的逻辑实现,而非物理实现。就是使用门电路、触发器等数字电路元器件,实现计算机的硬件系统。
- 原理:指的是“数字电子计算机”的逻辑实现的一般原理,而不会特指某种机型。
于是本门课程讲授内容分为以下三大部分:
- 基本部件的结构和组织方式:使用数字电路对计算机的基本部件进行逻辑实现。
- 基本运算的操作原理:计算机的基本功能就是实现加、减、乘、除。讲解如何使用数字电路实现这些运算的硬件电路。
- 基本部件和单元的设计思想:如何将上述部件连接起来,形成一个整体的、协调的系统。
课程特色:讲解计算机组成的一般原理,不以具体机型为依托。自顶向下、层层细化。
课程缺点:没有具体实验。可以跟随下面的推荐教材实现一个基本的处理器逻辑设计。
下左图是现代计算机专业的课程体系结构,右图则是对应的具体课程名称。可以看到左图中的蓝色方框“指令集体系结构”是计算机软硬件系统的交界面,是“计算机体系结构”的课程内容。在它的下一层则是“计算机组成原理”的课程内容,包括如何实现处理器、内存、I/O、数据路径等,是计算机硬件原理的最上层:
- “计算机体系结构”:设计架构。采用“分析+评测”的方式,分析计算机的结构,同时也是并行计算机系统结构的入门。
- “计算机组成原理”:具体实现。是计算机硬件原理的最上层。
两者的关系:“计算机体系结构”设计计算机架构,“计算机组成原理”的成员则负责具体实现。
最后来介绍一下课程内容的组织,也就是“自顶向下”的原则。如下图所示,教材内容主要分为4篇:
- 概论:给出计算机系统硬件的概貌,以及程序在计算机硬件系统中是如何执行的。
- 计算机系统的硬件结构:下图“上侧圆圈”,囊括中文教材前五章。
- 中央处理器:下图“左侧圆圈”,中文教材6~8章。CPU是计算机系统的核心组件,所以专门用一篇讲解。
- 控制单元:下图“右侧圆圈”,中文教材9、10章。CU是CPU的控制核心,专门一篇介绍。会分析指令的微操作,并使用两种方式来实现CPU的控制器,分别是“硬连方式”、“微程序设计方式”。
课程则一共设置10章,章节设置如下图,分为“机器”、“数字”、“CPU”三大部分:
1.1 计算机系统简介
现代计算机的类型非常多,包括从最小的传感器、到个人手机、个人电脑、服务器、高性能计算机(超算),甚至是“地球规模的物联网”。但一般来说,现代计算机系统都由“硬件”、“软件”这两部分构成。并且“软件”可以再细分为“系统软件”、“应用软件”:
- 硬件:计算机的实体,如主板、CPU、内存、硬盘等。提供了一些指令集供“软件”调用。
- 软件:由具有各类特殊功能的信息(程序)组成。利用“硬件”提供的结构完成某些功能。
- 系统软件:方便用户管理整个计算机系统,比如对系统的软硬件进行管理、提供人机交互界面等。如语言处理程序、操作系统、服务性程序、数据库管理系统、网络软件等。
- 应用软件:使用“系统软件”提供的接口,按任务需要编制成的各种程序,比如各种游戏。
注:早期计算机没有“系统软件”。
上图对计算机结构进行了简单的抽象,下图则分别从物理构成角度、程序员编程角度,对计算机系统进行抽象。本门课程主要研究下左图“物理构成角度”中的“逻辑层”、“微体系结构层”,也就是计算机主要部件的实现和连接,来实现“数据路径(datapaths)”和“控制(control)”。
- 微指令系统:程序语言也在向下发展。“微指令”就是控制硬件最基本的操作,比如取指令、传地址、读数据、译码等。这些指令按照一定顺序执行,就可以执行相应的机器语言。
- 机器语言:是最早出现的语言,可以直接在机器上运行。早期程序员直接使用二进制代码对硬件机器进行编程,但是非常不便于书写。
- 操作系统:“汇编程序”可以利用“操作系统”的接口实现相应的功能,“操作系统”也可以管理软硬件资源。“上右图”的“虚线”也就表示计算机系统软件、硬件之间的接口,划分了两者的功能。
- 汇编语言:将机器语言符号化,降低编程难度。但是要想实际在机器上运行,还需要进行“汇编(assemble)”,将汇编程序转化成二进制代码。
- 高级语言:汇编语言和机器语言一一对应,和人类语言差异较大,于是进一步封装成“高级语言”,大大降低了编程难度。要想执行程序,需要“编译器”将高级语言程序“编译(compile)”成“汇编程序”。
最后补充一下,“计算机体系结构”课程就是定义上述软件、硬件上的分界线,也就是程序员所见到的计算机系统的属性、概念性的结构与功能特性(指令系统、数据类型、寻址技术、I/0机理),比如“决定有无乘法指令”。而“计算机组成原理”课程则是实现“计算机体系结构”决定的属性,比如“实现乘法指令”。
系统复杂性管理法1——抽象
- 百度百科:抽象是对于一个过程或者一件制品的某些细节有目的的隐藏,以便把其他方面、细节或者结构表达得更加清楚。
- 维基百科:抽象指高级的模型,和低级的实体相对。
- David Harris(英文教材):抽象指隐藏系统中不重要的细节。
1.2 计算机的硬件框图
现代计算机都是“存储程序”结构的计算机,数据、程序都是以二进制的方式存储在计算机中。也就是“冯·诺伊曼计算机”,其特点如下:
- 计算机由五大部件组成。运算器,存储器,控制器,输入设备,输出设备。
- 指令和数据以同等地位存于存储器,可按地址寻访。——>“哈弗结构”将指令和数据放在不同的cache。
- 指令和数据用二进制表示。
- “指令”由“操作码”和“地址码”组成。操作码指明了操作,地址码给出了要操作的数据的所在地址。——>在其他结构中,操作码还可以指明寻址方式、数据类型、数据长度、数据基值等,比如“IBM360”中根据基值、长度的不同,有8种不同的加法运算。
- 存储程序。程序存放在存储器中,是冯·诺依曼结构的核心。
- 以运算器为中心。
注:采用“存储程序”思想设计的机器,都被称为“冯·诺依曼结构”的机器。
注:世界上第一台“冯·诺依曼结构”的机器是edvac(Electronic Discrete Variable Automatic Computer)。
注:冯·诺依曼(John von Neumann)被称为计算机之父,是计算机专业的祖师爷。给大佬上香🙏。
上图是冯·诺依曼计算机硬件框图,以及五大部分的功能:
- 实线表示数据通路,虚线表示反馈/控制回路。
- 运算器:整个结构的核心。为了完成算术运算和逻辑运算。
- 存储器:用于存储数据和程序。
- 控制器:指挥、控制程序的运行。也就是完成一条指令的执行,完成指令之间先后顺序的控制。
- 输入设备:将信息转成机器能识别的形式,然后通过运算器将数据保存到存储器中。
- 输出设备:将计算机处理结果转化成人类熟悉的形式。
不难发现,冯·诺伊曼结构有一个很大的缺陷,就是“运算器”的负担很重,不仅要进行数据的运算,还要进行数据的输入、输出,所以 “运算器”很容易成为系统瓶颈。于是下面给出一种可能改进架构——“以存储器为中心”,数据的输入、输出直接与存储器相连:
- 空心箭头表示数据回路,实线表示控制回路,虚线表示反馈回路。
另外,上述“冯·诺依曼”硬件框图比较混乱,下图则进行整理。左侧将五大组成部分继续给出具体的名称,右侧则是最终的现代计算机系统框图,将整个计算机的硬件系统划分成“主机”和“I/O设备”:
- 运算器也被称为ALU(算术逻辑单元),控制器也被称为CU(控制单元),两者组合在一起就是CPU。
- 存储器可以进一步分为主存(内存条)、辅存(硬盘/磁盘)。
- 输入设备、输出设备、辅存都是I/O设备。
后面我们将进一步细化“主存”、“ALU”、“CU”、“I/O设备”的实现,再将其组合起来就可以实现完整的计算机系统。
系统复杂性管理法2——3y
- 层次化(Hierachy):将被设计的系统划分为多个模块或子模块,然后分别设计。
- 模块化(Modularity):有明确定义(well-defined)的功能和接口,保证不同的模块可以组装在一起。
- 规则性(Regularity):模块更容易被重用,满足工业标准/国际标准。
1.3 计算机的工作步骤
现在我们通过介绍计算机解决某问题的工作步骤,来进一步理解前面介绍的框图。首先要明确,不是所有的问题都可以用计算机来解决(如“图灵机停机”问题),具体可以参考“算法理论”的相关知识,现在假设我们讨论的问题都是“可计算的”。比如我们要计算“正弦交流电的实时电压”,那么我们首先要进行“上机前的准备”:
- 建立数学模型: u = U m sin ( ω t ) u=U_m\sin(\omega t) u=Umsin(ωt)
- 确定计算方法:计算机只能进行四则运算,于是将 sin \sin sin函数 泰勒展开 sin x = x − x 3 3 ! + x 5 5 ! − x 7 7 ! + x 9 9 ! − . . . \sin x=x-\frac{x^3}{3!}+\frac{x^5}{5!}-\frac{x^7}{7!}+\frac{x^9}{9!}-... sinx=x−3!x3+5!x5−7!x7+9!x9−...。直到相邻两次计算结果之差满足用户精度要求,即可停止运算。
- 编制解题程序:也就是运算的全部步骤,每个指令都对应一个步骤。比如下面是计算 a x 2 + b x + c ax^2+bx+c ax2+bx+c 用到的操作码和程序清单,最后的运算结果存储在主存地址12:
注:上述程序可以看到,“指令”由“操作码”和“地址码”组成。
完成上述准备,就可以将“指令和数据”都保存在“存储器”中,然后计算机就可以进行实际的运算。那么具体来说,存储器、运算器、控制器的结构是什么?计算机是如何执行上述指令的呢?下面来分析“计算机的工作过程”,一一介绍下图的模块。
“存储器”的结构如上图中间所示。指令和数据都需要存储在存储器中,所以存储器的核心结构就是一个存储体。结构组成由大到小时,存储体(内存条)——>存储单元/存储字(单个地址对应的数据)——>存储元件(单比特0/1)。存储单元按地址寻址,存储单元的位宽也被称为“存储字长”。MAR是“存储器地址寄存器”,其位宽反映了存储单元的最大个数。MDR是“存储器数据寄存器”,临时存储需要中转的数据,其位宽也就是存储字长。
“运算器”的结构如上图CPU中左侧所示,是“累加器型运算器”,其他结构如“通用寄存器型运算器”和上述有所不同。运算器的核心功能完成运算,所以其核心是 ALU (算术逻辑运算单元),通常由组合电路构成。由于组合电路的输入输出都是实时的,无法保存数据,所以还需要额外的寄存器保存数据,于是 X(数据寄存器) 作为输入、ACC 作为输出/输入保存中间结果、MQ(乘商寄存器) 则扩展ACC保证完成乘/除运算。下面给出 寄存器存放操作数的位置,以及具体的加、减、乘、除指令的操作过程:
加法 减法 乘法 除法 ACC 被加数及和 被减数及差 乘积高位 被除数及余数 MQ 乘数及乘积低位 商 X 加数 减数 被乘数 除数
- 加法指令【加|M】:初态将被加数–>ACC。[M]–>X、[ACC]+[X]–>ACC。
- 减法指令【减|M】:初态将被减数–>ACC。[M]–>X、[ACC]-[X]–>ACC。
- 乘法指令【乘|M】:初态将被乘数–>ACC。[M]–>MQ、[ACC]–>X、0–>ACC(清零)、[X]×[MQ]–>ACC//MQ。
- 除法指令【除|M】:初态将被除数–>ACC。[M]–>X、[ACC]÷[X]–>MQ、余数–>ACC。
注:上述寄存器名称带“方括号[]”表示地址里面的数据,不带“方括号[]”则表示该地址的寄存器。
注:上述具体的操作过程是有先后顺序的,由控制器控制。
“控制器”的结构如上图CPU中右侧所示。控制器的功能包括解释指令(上述运算器的全过程),并保证指令的按序执行,也就是控制“取指令(PC)”、“分析指令(IR)”、“执行指令(CU)”:
- PC(程序计数器):存放当前欲执行指令的地址,具有自动计数功能,如(PC)+1–>PC指向下一个指令的地址。
- IR(指令寄存器):存放当前欲执行的指令。
- CU(控制单元):发送控制信号,是控制器的核心。
下面将上述“存储器”、“运算器”、“控制器”结合起来组成“主机”,介绍主机如何完成一条指令。分成下面三个阶段:
取数指令【取|M】:将存储体中M地址数据取到ACC中,[M]–>ACC。
- 取指令【1~4】:“控制器”PC传 取指令地址 给“存储器”MAR,MAR从存储体取出指令放到MDR中,MDR再将指令传给“控制器”IR,取指令完成。
- 分析指令【5】:“控制器”IR将指令的操作码传递给CU进行分析,CU再控制执行相应指令,CU内部的具体分析过程后面再介绍。
- 执行指令【6~9】:“控制器”CU分析完毕,控制IR将指令的地址码传递给MAR–>存储体–>MDR,最后MDR将数据传递给ACC结束。
存储指令【存|M】:将ACC数据保存到存储体的地址M中,[ACC]–>M。
- 取指令【1~4】:和上述“取数指令”相同,将“存储指令”取到IR。
- 分析指令【5】:IR将指令的操作码传递给CU进行分析,CU再控制执行相应指令。
- 执行指令【6~9】:“控制器”CU分析完毕,控制IR将指令的地址码传递给MAR,告知存储体将有数据存储到相应的地址。同时控制ACC将数据传递给MDR,存储体读取MDR并存储,结束。
最后介绍程序是如何在主机上执行的。以主机执行程序 a x 2 + b x + c ax^2+bx+c ax2+bx+c 为例:
- 将程序通过输入设备送至计算机。
- 程序首地址–>控制器PC。
- 启动程序运行,按照下面的顺序依次执行所有指令:
- 取指令:PC–>MAR–>M–>MDR–>IR,(PC)+1–>PC
- 分析指令:OP(IR)–>CU
- 执行指令:Ad(IR)–>MAR–>M–>MDR–>ACC
- 执行所有指令…
- 打印结果(打印指令)。
- 停机。
注:OP(IR)表示IR中的操作码,Ad(IR)表示IR中的地址码,M表示存储体中的地址为M的存储单元。
1.4 计算机硬件的主要技术指标
计算机专业的肯定还是想自己装机,那么在确定了自己的要求和预算后,就需要挑选配件了,可以看看我的文章🤪:“装机注意事项”。最后一节来介绍计算机硬件的三个主要指标:
机器字长:决定了CPU单次运算范围。
- CPU一次能处理数据的位数,与CPU中的寄存器位宽有关。通常CPU位宽和操作系统位宽相同。
运算速度:
- CPU主频:也就是CPU的运算速度,目前个人电脑通常在2~4GHz左右。
- 核数、线程数:决定了计算机是并行运算能力。
- 吉普森法: T M = ∑ i = 1 n f i t i T_M=\sum_{i=1}^n f_it_i TM=∑i=1nfiti。将所有指令按照出现概率加权求和,也就是平均单条指令执行时间。
- CPI:执行一条指令所需时钟周期数。和上述“辛普森法”一样,是加权平均值。
- MIPS:每秒执行几百万条指令。
- FLOPS:每秒浮点运算次数,“超算”常用单位。上述三个指标都是“指令”不合理,改成“运算”更合理。
- 实机测试:比如买电脑是为了打艾尔登法环,那就实际安装一个试试。
存储容量:存放二进制信息的总位数(常用单位:字节)。
- 主存容量(内存条):存储单元个数×存储字长,比如给出MAR宽度为32、MDR宽度为32,那么最大内存容量为 2 32 × 4 Byte = 16 GB 2^{32}\times 4\text{Byte}=16\text{GB} 232×4Byte=16GB。当然实际上买内存条时也是一般看字节数。
- 辅存容量(硬盘/磁盘):一般直接看字节数,比如512GB。