计算机发展历程

本节内容已从大纲删除

计算机硬件的发展

计算机的四代变化

  • 第一代计算机 —— 电子管时代

    逻辑元件采用电子管

    使用机器语言进行编程

    主存使用延迟线或磁鼓存储信息,容量极小

    体积庞大,成本高

    运算速度较低,一般只有几千次到几万次每秒

  • 第二代计算机 —— 晶体管时代

    逻辑元件采用晶体管

    软件开始使用高级语言,如 FORTRAN,有了操作系统的雏形

    主存使用磁芯存储器

    运算速度提升到几万次到几十万次每秒

  • 第三代计算机 —— 中小规模集成电路时代

    逻辑元件采用中小规模集成电路

    高级语言发展迅速,操作系统也进一步发展,开始有了分时操作系统

    半导体存储器开始取代磁芯存储器

  • 第四代计算机 —— 超大规模集成电路时代

    逻辑元件采用大规模集成电路和超大规模集成电路,产生了微处理器

    诸如并行、流水线、高速缓存和虚拟存储器等概念用在了这代计算机中

  • 第五代计算机 —— 智能计算机

    具备人工智能

    运算速度极快

    软件系统能够处理知识信息

    神经网络计算机是智能计算机的重要代表

  • 第六代计算机 —— 生物计算机与量子计算机

    未来计算机发展的方向和趋势

1~4 代都采用冯·诺依曼体系结构(控制器、存储器、运算器、输入输出设备)

计算机元件的更新换代

  • 摩尔定律

    当价格不变时,集成电路上可容纳的晶体管数约每 18 个月翻一番,性能也将提升一倍

  • 半导体存储器的发展

    至今半导体存储器发展了 11 代:单芯片 1 KB → 4 KB → 16 KB → …… → 1 GB(4 倍增长)

  • 微处理器的发展

    第一个微处理器 Intel 4004,经历 Intel 8008(8 位)、Intel 8086(16 位)、Intel 80386(32 位)、Pentium(32 位)、Pentium Ⅲ(64 位)、Pentium 4(64 位)、Core i7(64 位)等。这里的 32 位、64 位指的是机器字长

    微型计算机的发展以微处理器的技术为标志

  • 系列机

    具有基本相同的体系结构,使用相同基本指令系统的多个不同型号的计算机组成的一个产品系列。其基本特性是,指令系统向后兼容(指时间上向后兼容,即新机器兼容使用以前机器的指令系统)

计算机软件的发展

计算机语言的发展经历了面向机器的机器语言和汇编语言、面向问题的高级语言

高级语言的发展经历了从科学计算和工程计算的 FORTRAN、结构化程序设计的 PASCAL 到面向对象的 C++ 和适应网络环境的 Java

计算机的分类与发展方向

  • 按能够处理信号分类

    1. 数字计算机

      只能处理离散信号

      其按用途又可分为:专用计算机、通用计算机

      通用计算机又可分为巨型机、大型机、中型机、小型机、微型机和单片机 6 类。它们的体积、功耗、性能、数据存储量、指令系统的复杂程度和价格依次递减

    2. 电子模拟计算机

      处理连续信号

  • 按指令和数据流分类

    1. 单指令流和单数据流系统 SISD

      即冯·诺伊曼体系结构

    2. 单指令流和多数据流系统 SIMD

      包括阵列处理器和向量处理器系统

    3. 多指令流和单数据流系统 MISD

      不存在

    4. 多指令流和多数据流系统 MIMD

      包括多处理器和多计算机系统

  • 计算机的发展趋势 —— 向“两极”分化

    微型机向更微型化、网格化、高性能、多用途方向发展

    巨型机向更巨型化、超高速、并行处理、智能化方向发展

计算机系统层次结构

计算机系统的组成

  • 计算机系统 = 硬件系统 + 软件系统

  • 硬件 vs 软件

    硬件实现具有更高的执行速度

    软件实现具有更好的灵活性

    执行频繁、硬件实现代价不是很大的功能通常由硬件实现,可以提高效率

    对某一功能来说,若其既可以用软件实现,又可以用硬件实现,则称为软/硬件在逻辑功能上是等价的

  • 硬件能执行的只能是机器语言(二进制编码)

  • 固件

    将程序固定在 ROM 中组成的部件

    是软硬件结合的产物,性能指标介于硬件和软件之间

    执行速度快于软件,灵活性优于硬件,算是吸取了软硬件各自的优点

    目前操作系统已实现了部分固化(把软件永恒地存储于只读存储器中)

  • 计算机体系结构 vs 计算机组成

    计算机体系结构是指机器语言或汇编语言程序员所看得到的传统机器的属性,包括指令集、数据类型、存储器寻址技术等,大都属于抽象的属性

    计算机组成是指如何实现计算机体系结构所体现的属性,它包含对许多程序员来说透明的硬件细节

    例如,指令系统属于结构的问题,但指令的实现即如何取指令、分析指令、取操作数、如何运算等都属于组成的问题

计算机硬件

冯·诺依曼机

  • “存储程序”的基本思想

    将事先编制好的程序和原始数据送入主存后才能执行,一旦程序被启动执行,就无须操作人员的干预,计算机会自动逐条执行指令,直至程序执行结束

    目前绝大多数现代计算机仍遵循冯·诺伊曼的“存储程序”思想

  • 冯·诺依曼机

    以“存储程序”思想为基础的各类计算机统称为冯·诺依曼机

  • 冯·诺伊曼机特点

    1. 工作方式:“存储程序”

      基本工作方式:控制流驱动

    2. 计算机硬件系统五大部件:运算器、存储器、控制器、输入设备、输出设备

      硬件系统五大部件也可以划分为两大部分:控制部件和执行部件

      控制部件是控制器,而运算器、存储器和外围设备相对控制器而言都是执行部件

    3. 指令和数据以同等地位存储在存储器中,并可按地址寻访

      指令和数据形式上没有区别,但计算机应能区分它们(CPU 区分数据和指令的依据:指令周期的不同阶段)

    4. 指令和数据均用二进制代码表示

    5. 指令由操作码和地址码组成。操作码指出操作的类型,地址码指出操作数的地址

    6. 指令在存储器内按顺序存放

      通常指令是顺序执行的,当然在特定条件下也可根据运算结果或设定的条件改变执行顺序

    7. 运算器为中心,输入/输出设备通过运算器与存储器传送数据(现代计算机以存储器为中心)

  • 典型的冯·诺依曼计算机结构

  • 冯·诺依曼结构计算机中数据采用二进制编码表示的主要原因

    二进制运算规则简单

    制造两个稳态的物理器件较容易

    便于用逻辑门电路实现算术运算

现代计算机组织结构

存储器为中心,使 I/O 操作尽可能绕过 CPU,直接在 I/O 设备和存储器之间完成,以提高系统的整体运行效率

计算机的功能部件

传统冯·诺依曼计算机与现代计算机的结构虽然有所不同,但功能部件是一致的

  • 输入设备

    将程序和数据以机器所能识别和接受的信息形式输入计算机

    如:键盘、鼠标、扫描仪、摄像机等

  • 输出设备

    将计算机处理的结果以人们所能接受的形式或其他系统所要求的信息形式输出

    如:显示器、打印机等

  • 存储器

    计算机的存储部件,用来存放程序和数据

    1. 主存储器/主存/内存储器/内存

      CPU 能够直接访问,也可以和高速缓冲存储器 Cache 及辅助存储器交换数据

      工作方式:按存储单元的地址进行存取(称为按地址存取方式)

      特点:容量较小、存取速度较快、每位价格较高

      存储体由许多存储单元组成,每个存储单元包含若干存储元件,每个存储元件存储一位二进制。因此存储单元可存储一串二进制代码,称这串代码为存储字,存储字的位数为存储字长,存储字长可以是 1B 或是字节的偶数倍

      MAR 用于寻址,存放访存地址,经过地址译码后找到所选的存储单元。其位数/长度反映最多可寻址的存储单元的个数(如 MAR 为 10 位,则最多有 $2^{10}$ 个存储单元)。MAR 的长度和 PC 的长度相等

      MDR 用于暂存要从存储器中读或写的信息,其位数通常和存储字长相等

      MAR 和 MDR 理论上属于主存,但现代计算机绝大多数集成于 CPU 中

      时序控制逻辑用于产生存储器操作所需的各种时序信号

    2. 辅助存储器/辅存/外存储器/外存

      帮助主存记忆更多的信息(主存的后援存储器),用来存放当前暂时不用的程序和数据,以及一些需要永久性保存的信息

      特点:容量较大、存取速度较慢、每位价格较低

      辅存中的信息必须调入主存后才能为 CPU 访问

    3. 相联存储器

      既可以按地址寻址,又可以按内容(通常是某些字段)寻址

      为与传统存储器区别,又称按内容寻址的存储器

      基本原理:把存储单元所存内容的某一部分作为检索项(即关键字项)去检索该存储器,并将存储器中与该检索项符合的存储单元内容进行读出或写入

      价格较为昂贵,一般用来制作 TLB、相联 Cache 等

      CPU 存取速度:寄存器 > Cache > 内存

  • 运算器

    计算机的执行部件,用于进行算术运算(加、减、乘、除)和逻辑运算(与、或、非、异或、比较、移位等)

    核心是算术逻辑单元 ALU (Arithmetic and Logical Unit)

    包含若干通用寄存器,用于暂存操作数和中间结果,如累加器 ACC、乘商寄存器 MQ、操作数寄存器 X、变址寄存器 IX、基址寄存器 BR 等(前 3 个必备)

    还有程序状态寄存器/标志寄存器 PSW,用于存放 ALU 运算得到的一些标志信息或处理机的状态信息,如结果是否溢出、有无产生进位或错位、结果是否为负等

  • 控制器

    计算机的指挥中心,由其“指挥”各部件自动协调地进行工作

    由程序计数器 PC、指令寄存器 IR 和控制单元 CU 组成,可再细分为:PC + IR + MAR + MDR + ID + 时序系统 + 微操作信号发生器

    PC 存放当前欲执行指令的地址,可自动加 “1” 以形成下一条指令的地址,与主存的 MAR 之间有一条直接通路

    IR 存放当前指令,其内容来自 MDR。指令中的操作码 OP(IR) 送至 CU,用以分析指令并发出各种微操作指令序列;地址码 Ad(IR) 送往 MAR,用以取操作数

一般运算器和控制器集成到同一个芯片上,称为中央处理器 CPU

CPU 和主存共同构成主机,除主机外的其他硬件装置(外存、I/O 设备等)统称为外部设备,简称外设


冯·诺依曼结构的模型机:

图中从控制器送出的虚线就是控制信号,它可以:控制如何修改 PC 以得到下一条指令的地址、控制 ALU 执行什么运算、控制主存是进行读操作还是写操作(读/写控制信号)

CPU 和主存之间通过一组总线(地址、控制和数据 3 组信号线)相连。MAR 中的地址信息会直接送到地址线上,用于指向读/写操作的主存存储单元;控制线中有读/写信号线,指出数据是从 CPU 写入主存还是从主存读出到 CPU,根据是读操作还是写操作来控制是将 MDR 中的数据直接送到数据线上还是将数据线上的数据接收到 MDR 中

计算机软件

系统软件和应用软件

  • 系统软件

    一组保证计算机系统高效、正确运行的基础软件,通常作为系统资源提供给用户使用

    主要有:操作系统 OS、数据库管理系统 DBMS、语言处理程序、分布式软件系统、网络软件系统、标准库程序、服务性程序等

    数据库 DB:长期存储在计算机内、有组织的、可共享的大量数据的集合

    数据库管理系统 DBMS:位于用户与操作系统之间的一层数据管理软件

    数据库系统 DBS:一般由数据库、数据库管理系统(及其开发工具)、数据库应用系统 DBAS 和数据库管理员 DBA 构成

  • 应用软件

    指用户为解决某个应用领域中的各类问题而编制的程序

    如各种科学计算类程序、工程设计类程序、数据统计与处理程序等

在本学科范畴内,编写诸如操作系统、编译程序等各种系统软件的人员称为系统程序员;利用计算机及所支持的系统软件来编写解决具体应用问题的人员称为应用程序员

三个级别的语言

  • 机器语言/二进制代码语言

    计算机唯一可以直接识别和执行的语言

  • 汇编语言

    用英文单词或其缩写代替二进制的指令代码

  • 高级语言

    为方便程序设计人员写出解决问题的处理方案和解题过程的程序

    机器语言和汇编语言与机器指令对应,而高级语言不与指令直接对应,具有较好的可移植性

翻译程序:

  1. 编译程序/编译器(高级 → 机器/汇编)

  2. 汇编程序/汇编器(汇编 → 机器)

  3. 解释程序/解释器(高级 → 机器)

    将源程序中的语句按执行顺序逐条翻译成机器指令并立即执行(翻译一句执行一句,不会生成目标程序),一般速度较编译程序慢

Java 和 Python 都需要把代码编译成字节码,再由虚拟机解释运行,为什么 Python 算解释型语言而 Java 不算呢?

现在很多语言到底是解释型还是编译型都没分的那么开了,因为现在的语言编译器基本都是会先由前端生成 IR,再决定之后是编译成 native,还是 JIT 执行,还是全部解释执行,都是可选的。要说编译到 IR,那基本所有语言都有这个过程,比如 Java 编译成字节码就是,然后由 JVM 自己决定要怎么对待字节码,是全部解释?还是全部编译?还是用 JIT 边解释执行边编译部分热点以及进行运行时优化?

所以纠结解释型还是编译型这个属实没啥意思。

软件和硬件的逻辑功能等价性

对某一功能来说,既可由硬件实现又可由软件实现,从用户的角度看,它们在功能上是等价的。这一等价性被称为软/硬件逻辑功能的等价性

硬件实现的往往是最基本的算术和逻辑运算功能,而其他功能大多通过软件的扩充得以实现

软件和硬件功能界面的划分是由设计目标、性能价格比、技术水平等综合因素决定的

计算机系统的层次结构

上层实现对下层的功能扩展,下层是实现上层的基础

在高级语言层之上,还可以有应用程序层,它由解决实际问题的处理程序组成

虚拟机器只对该层的观察者存在,对于某层的观察者来说,只能通过该层的语言来了解和使用计算机,而不必关心下层是如何工作的

软/硬件交界面就是指令集体系结构 ISA,ISA 定义了一台计算机可以执行的所有指令的集合,每条指令规定了计算机执行什么操作,以及所处理的操作数存放的地址空间和操作数类型。ISA 是指软件能感知到的部分,也称软件可见部分

软/硬件交界面的划分也不是绝对的:随着超大规模集成电路的不断发展,部分软件功能将由硬件实现

计算机系统的工作原理

“存储程序”工作方式

“存储程序”工作方式规定,程序执行前,需要将程序所含的指令和数据送入主存储器,一旦程序被启动执行,就无须操作人员的干预,自动逐条完成指令的取出和执行任务

一个程序的执行就是周而复始地执行一条一条指令的过程

从源程序到可执行文件

以 UNIX 系统中的 GCC 编译器程序为例:

1)预处理阶段

cpp 对源程序中以字符 # 开头的命令进行处理

例如将 #include 命令后的 .h 文件内容插入程序文件

2)编译阶段

ccl 对预处理后的源程序进行编译,生成一个汇编语言源程序

3)汇编阶段

as 将汇编语言源程序翻译成机器语言指令,并把这些指令打包成一个称为可重定位目标文件的二进制文件

4)链接阶段

ld 将多个可重定位目标文件和标准库函数合并为一个可执行目标文件(简称可执行文件)。最终生成的可执行文件被保存在磁盘上


在 UNIX 系统中通过 shell 命令行解释器运行可执行文件 hello:

1
2
3
4
unix> ./hello
hello, world

unix>

① shell 程序将用户从键盘输入的每个字符逐一读入 CPU 寄存器

② 然后保存到主存中,在主存的缓冲区形成字符串“./hello”

③ 接收到 Enter 键时,shell 调出操作系统内核程序,由内核来加载磁盘上的可执行文件 hello 到主存中

④ 内核加载完可执行文件中的代码和数据后,将 hello 的第一条指令的地址送至 PC,CPU 随后开始执行 hello 程序,它将已加载到主存的字符串“hello, world\n”中的每个字符从主存取到 CPU 的寄存器中

⑤ 将 CPU 寄存器中的字符送到显示器

程序的执行过程就是数据在 CPU、主存和 I/O 设备之间流动的过程,所有数据的流动都是通过总线、I/O 接口等进行的

在程序的执行过程中,必须依靠操作系统的支持,特别是在涉及对键盘、磁盘等外设的操作时,用户程序不能直接访问这些底层硬件,需要依靠操作系统内核来完成

指令执行过程的描述

以取数指令(送至运算器的 ACC 中)为例:

  1. 取指令:(PC) → MAR → M → MDR → IR

    根据 PC 取指令到 IR:将 PC 内容送 MAR,MAR 内容直接送地址线,同时 CU 将读信号送读/写信号线,主存根据地址线上的地址和读信号,从指定存储单元读出指令,送到数据线上,MDR 从数据线接收指令信息,并传送到 IR 中

  2. 分析指令:OP(IR) → CU

    指令译码并送出控制信号:CU 根据 IR 中指令的操作码,生成相应的控制信号,送到不同的执行部件

    在本例中,IR 中是取数指令,因此读控制信号被送到总线的控制线上

  3. 执行指令:Ad(IR) → MAR → M → MDR → ACC

    取数操作:将 IR 中指令的地址码送 MAR,MAR 内容地址线,同时控制线将读信号送读/写信号线,从主存读出操作数,并通过数据线送 MDR,再传送到 ACC 中

每取完一条指令,(PC) + 1 → PC

计算机性能指标

字长

  • 机器字长

    简称字长,指计算机进行一次整数运算(即定点整数运算)所能处理的二进制数据的位数,反映了计算机处理信息的能力

    通常与 CPU 的寄存器位数、加法器有关,一般等于内部寄存器的大小,通常选定为字节的整数倍

    机器字长越长,数的表示范围越大、计算精度越高

    通常所说的“某 16 位或 32 位机器”,其中的 16、32 指的就是机器字长

  • 存储字长

    一个存储单元中的二进制代码的位数,等于 MDR 的位数

  • 数据字长

    数据总线一次能并行传送信息的位数(数据通路带宽),可以不等于 MDR 的位数

  • 指令字长

    一个指令字中包含的二进制代码的位数

    一般取存储字长的整数倍,若指令字长等于存储字长的 2 倍,则需要 2 个访存周期来取出一条指令;若指令字长等于存储字长,则取指周期等于机器周期

    单字长指令:指令字长度等于机器字长的指令。类似的还有半字长指令、双字长指令

  • 字和字长的概念不同。字用来表示被处理信息的单位,用来度量数据类型的宽度,如 x86 机器中将一个字定义为 16 位

数据通路带宽

外部数据总线一次所能并行传送信息的位数

外部数据总线宽度与 CPU 内部的数据总线宽度(内部寄存器的大小)有可能不同

数据通路:各个子系统通过数据总线连接形成的数据传送路径

主存容量

主存储器所能存储信息的最大容量

通常以字节来衡量,也可用字数 × 字长来表示(如 512K × 16 位)。其中,字数(存储单元个数)= $2^{MAR位数}$,MAR 的位数反映可寻址范围的最大值;字长为 MDR 位数,即存储字长

运算速度

  • 吞吐量

    系统在单位时间内处理请求的数量

    主要取决于主存的存取周期

    优化数据通路可以有效提高吞吐量

  • 响应时间

    从用户发出一个请求,到系统对该请求作出响应并获得所需结果的等待时间,是计算机完成一项任务所需的总时间

    通常包括 CPU 执行时间(运行一个程序所花费时间)和等待时间(用于磁盘访问、存储器访问、I/O 操作、操作系统开销等时间)

  • 主频(CPU 时钟频率)

    机器内部主时钟的频率(CPU 内数字脉冲信号振荡的速度)

    CPU 的一切操作都是在系统时钟的控制下按节拍有序进行的

    通常以 Hz 为单位,常见 CPU 主频有 1.8 GHz、2.4 GHz、2.8 GHz

    对于同一个型号的计算机,其主频越高,完成指令的一个执行步骤所用的时间越短,执行指令的速度越快

    为了节省功耗或临时提升性能,当今的处理器可以调整时钟频率。例如,Intel Core i7 处理器可以临时将时钟频率提高 10%,Intel 称之为涡轮增压模式(Turbo mode)

    主频并不是性能的体现,也不能直接代表运算速度,在一定情况下很可能会出现主频较高的 CPU 实际运算速度较低的现象

    时钟脉冲信号:由机器脉冲源发出的脉冲信号经整形和分频后形成

  • CPU 时钟周期

    机器内部主时钟脉冲信号的宽度,即主频的倒数

    CPU 中最小的基本时间计量单位,执行指令的每个动作至少需要一个时钟周期

    时钟周期以相邻状态单元间组合逻辑电路的最大延迟为基准确定,也以指令流水线的每个流水线的最大延迟时间确定

  • CPI (Clock cycles Per Instruction)

    执行一条指令所需的时钟周期数

    不同指令需要的时间可能不同。因此对于一个程序或一台机器来说,其 CPI 指该程序或该机器指令集中的全部指令执行所需的平均时钟周期数

    系统结构、指令集、计算机组织会影响 CPI。时钟频率不会影响 CPI,但可加快指令的执行速度

    理想情况下,单周期 CPU 和基本流水线 CPU 的 CPI 为 1

    IPC (Instruction Per Clock cycle):每个时钟周期执行多少条指令。有些处理器在每个时钟周期是可以对多条指令取指并执行的,所以 CPI 可能小于 1,因而有些设计者反过来用 IPC 来代替 CPI

    IPS (Instruction Per Second):每秒执行多少条指令

  • CPU 执行时间

    运行一个程序所花费时间

    CPU 执行时间 = $\frac{\text{CPU 时钟周期数}}{\text{主频}}$ = $\frac{\text{指令条数 } \times \text{ CPI}}{\text{主频}}$

    上式表明,CPU 性能(即 CPU 执行时间)取决于三个要素:主频、CPI、指令条数。三者相互制约,例如,更改指令集可以减少程序所含的指令条数,但同时可能引起 CPU 结构的调整,从而可能降低主频

  • 每秒百万条指令 MIPS (Million Instruction Per Second)

    即每秒执行多少百万条指令

    MIPS = $\frac{\text{指令条数}}{\text{执行时间 }\times 10^6}$ = $\frac{\text{主频}}{\text{CPI }\times 10^6}$

    MIPS 对不同机器进行性能比较是有缺陷的,因为不同机器的指令集不同,指令的功能也就不同,比如在机器 M1 上某条指令的功能也许在机器 M2 上要用多条指令来完成。不同机器的 CPI 和时钟周期也不同,因而同一条指令在不同机器上所用的时间也不同。即使在同一台计算机上,不同程序也会有不同的 MIPS

  • FLOPS (Floating-point Operations Per Second) 每秒执行多少次浮点运算

    MFLOPS (Million FLOPS) 每秒执行多少百万次浮点运算,MFLOPS = $\frac{\text{浮点操作次数}}{\text{执行时间 }\times10^6}$

    GFLOPS (Giga FLOPS) 每秒执行多少十亿次浮点运算,GFLOPS = $\frac{\text{浮点操作次数}}{\text{执行时间 }\times10^9}$

    TFLOPS (Tera FLOPS) 每秒执行多少万亿次浮点运算,TFLOPS = $\frac{\text{浮点操作次数}}{\text{执行时间 }\times10^{12}}$

    PFLOPS (Peta FLOPS) 每秒执行多少千万亿次浮点运算,PFLOPS = $\frac{\text{浮点操作次数}}{\text{执行时间 }\times10^{15}}$

    EFLOPS (Exa FLOPS) 每秒执行多少百亿亿次浮点运算,EFLOPS = $\frac{\text{浮点操作次数}}{\text{执行时间 }\times10^{18}}$

    ZFLOPS (Zetta FLOPS) 每秒执行多少十万京次浮点运算,ZFLOPS = $\frac{\text{浮点操作次数}}{\text{执行时间 }\times10^{21}}$

  • 基准程序(Benchmarks)

    专门用来进行性能评价的一组程序

    通过在不同机器上运行相同的基准程序来比较在不同机器上的运行时间,从而评测其性能

    对于不同的应用场合,应该选择不同的基准程序

    缺陷:基准程序的性能可能与某一小段的短代码密切相关,而硬件系统设计人员或编译器开发者可能针对这些代码片段进行特殊的优化,以至于得不到准确的性能评测结果

提高主频、扩大主存容量等硬件上的优化对性能的提升是有限度的。采用并行处理技术是当前实现高性能计算的重要途径