计组笔记第一章
1.1 计算机的发展
什么是计算机系统?
计算机系统 = 硬件 + 软件
硬件:计算机的实体,如主机、外设等。
软件:由具有各类特殊功能的程序组成。
\[软件
\begin{cases}
系统软件, 用来管理整个计算机系统,如OS, DBMS\\
应用软件, 按任务需求编制成的各种程序,如微信,QQ
\end{cases}
\]
硬件的发展
发展阶段 | 时间 | 逻辑元件 | 速度(次/秒) | 内存 | 外存 | 注 |
---|---|---|---|---|---|---|
第一代 | 1946-1957 | 电子管 | 几千-几万 | 汞延迟线、磁鼓 | 穿孔卡片、纸带 | |
第二代 | 1958-1964 | 晶体管 | 几万-几十万 | 磁芯存储器 | 磁带 | 出现FORTRAN语言,有了OS雏形 |
第三代 | 1964-1971 | 中小规模集成电路 | 几十万-几百万 | 半导体存储器 | 磁带、磁盘 | 各种高级语言快速发展,有了分时OS,计算机主要用于科学计算 |
第四代 | 1971-今 | 大规模、超大规模集成电路 | 上千万-万亿 | 半导体存储器 | 磁盘、磁带、光盘、半导体存储器 | 出现微处理器(CPU)、微型计算机。个人计算机萌芽,有了OS:Windows, linux |
- 机器字长 :计算机一次整数运算能处理的二级制位数。
- 摩尔定律:集成电路上可容纳的晶体管数目,约每隔18个月会增加一倍,整体性能也将提升一倍。
软件的发展
- 编程语言的发展:
机器语言、汇编语言 --> FORTRAN、PASCAL、C++ --> java…… - 操作系统的发展:
DOS --> Windows --> 安卓、苹果……
目前的发展趋势
“两极”分化:
一极是微型计算机更微型化、网络化、高性能、多用途。
一极是巨型计算机更巨型化、超高速、并行处理、智能化。
1.2.1 计算机硬件的基本组成
早期冯诺依曼机的结构
- 冯·诺依曼首先提出了存储程序的概念。
- 存储程序:指将指令以二进制代码的形式事先输入计算机的主存储器,然后按其在存储器中的首地址执行程序的第一条指令,以后就按该程序的规定顺序执行其他指令,直至程序执行结束。程序员不需要逐条输入,大幅提高了效率。
- 世界上第一台冯诺依曼结构的计算机EDVAC。
- 冯诺依曼机结构如下:
控制器发出电信号协调各部件,也负责解析存储器中的指令。
输入的数据是软件模块,框内的部分是硬件部分。在计算机系统中,软件和硬件在逻辑上是等效的。通常情况下软件实现的成本更低,但是效率也低;硬件实现成本高、效率也高。 - 冯诺依曼机的特点:
- 计算机由五大部件组成:输入设备、输出设备、存储器、运算器、控制器。
- 指令和数据以同等地位存于存储器中,可按地址寻访。
- 指令和数据用二进制表示。
- 指令由操作码和地址码组成。
- 采用存储程序的方式。
- 以运算器为中心。指令和数据要通过运算器才能存进存储器中,输入设备的输入内容要首先发给运算器,输出设备从运算器处获得数据。数据计算和中转都通过运算器。缺点是会降低运算器的效率。
现代计算机的结构(冯结构的优化)
- 现代计算机的结构图如下:
现代计算机的特点是以存储器为核心,数据通过存储器中转,而由于运算器和控制器的功能十分紧密,所以现代计算机通常把这两个部分整合到一个芯片上,称为CPU。
上图中主存储器可以向CPU传递数据和程序,控制器控制主存的读写、运算器的运算符、输入输出设备的启动等。I/O设备直接与主存储器进行数据交换。其中在计组的范畴内CPU和主存储器称为主机。 - 辨析概念:“主存”和“辅存”
主存就是主机里的主存储器。
辅存是硬盘等辅助存储单元,相当于计算机的外设。
1.2.2 各个硬件的工作原理
主存储器
- 主存储器的结构如下图:
- MAR(memory address register):存储地址寄存器
- MDR(memory data register):存储数据寄存器
- 数据在存储器按地址号有序的排列。
读取数据时CPU将地址号传入MAR,主存会根据MAR中的地址从存储体中读取对应地址的数据,并将数据传到MDR上。
写入数据时CPU把要写入的数据存放地址放在MAR上,把待写入数据存放道MDR上,主存就可以把数据存入对应位置。 - 存储体被分为若干带地址编号的存储单元。每个存储单元存放一串二进制代码。
存储字(word):存储单元中的二进制代码的组合。
存储字长:存储单元中二进制代码的位数。一般为8bit的整数倍。
存储元:存储二进制的电子元件,每个存储元可存1bit。 - MAR的位数反应存储单元的个数
MDR的位数 = 存储字长
例如MAR = 4位,说明存储体有\(2^4\)个存储单元,MDR = 16位,说明每个存储单元可存放16bit的数据,机器字为16位。一个字就是16bit。 - 注:一个字节(Byte) = 8bit
一个字的长度不一定,要看具体机器,可能时8、32、64位。
1B = 1Byte = 8bit = 8b
运算器的基本组成
- 运算器:用于实现算术运算(+-*/)、逻辑运算(&|!)
- 主要部件:
- ACC(accumulator):累加器,用于存放操作数或运算结果。
- MQ(multiple-quotient register):乘商寄存器,在乘除运算时存放操作数或运算结果。
- X:通用的操作数寄存器,存放操作数。一般有多个。
- ALU(arithmetic and logic unit):算数逻辑单元,是运算器的核心部件,通过内部复杂的电路实现算术、逻辑运算。
- 运算器的结构如下图所示:
- 运算器内3个特定寄存器的用法如下表所示:
加 | 减 | 乘 | 除 | |
---|---|---|---|---|
ACC | 被加数、和 | 被减数、差 | 乘积高位 | 被除数、余数 |
MQ | 乘数、乘积低位 | 商 | ||
X | 加数 | 减数 | 被乘数 | 除数 |
控制器的基本组成
- 控制器的基本结构如图:
- 主要部件:
- CU(control unit):控制单元,控制器核心部件,负责分析指令,给出控制信号。
- IR(instruction register):指令寄存器,存放当前执行的指令。
- PC(program counter):程序计数器,存放下一条指令地址,有自动加一功能。
- 每完成一条指令,控制器会根据PC取指令放在IR中,IR把指令交给CU分析生成控制信号。
计算机的工作过程
假设有如下C语言代码:
int a = 2, b = 3, c = 1, y = 0;
void main(){
y = a * b + c;
}
这段程序经过编译之后,生成一段计算机能读懂的语言,存入主存。
- 执行过程:
提前说明:
(寄存器)表示该寄存器的内容;
data->寄存器 表示将data存入寄存器中;
M表示主存;
M(MAR)表示MAR的地址对应主存存储体的内容。
OP表示取指令的操作码。
Ad表示指令的地址码
- (PC) = 0,指向第一条指令数据。
- (PC)->MAR,此时(MAR) = 0
- (PC) + 1 -> PC,PC所指的指令取出后,PC自动加一。
- M(MAR)->MDR,此时(MDR) = 0000010000000101
- (MDR)->IR,此时(IR) = 0000010000000101
- OP(IR)->CU,指令的操作码送到CU,CU分析后得知这是取数指令。
- Ad(IR)->MAR,将指令的地址码送到MAR中,此时MAR = 5
- M(MAR)->MDR,此时(MDR) = 0000000000000010 = 2
- (MDR)->ACC,此时(ACC) = 0000000000000010 = 2
- (PC)->MAR,此时(MAR) = 1
- (PC) + 1 -> PC,此时(PC) = 2。
- M(MAR)->MDR,此时(MDR) = 0001000000000110
- (MDR)->IR,此时(IR) = 0001000000000110
- OP(IR)->CU,指令的操作码送到CU,CU分析后得知这是乘法指令。
- Ad(IR)->MAR,将指令的地址码送到MAR中,此时MAR = 6.
- M(MAR)->MDR,此时(MDR) = 0000000000000011 = 3.
- (MDR)->MQ,此时(MQ) = 0000000000000011 = 3.
- (ACC) -> X,(X) = 2
- (MQ) * (X) -> ACC,乘法运算由ALU实现,结果高位存在ACC中,低位存在MQ中。此时(ACC) = 6,(MQ) = 0。
- (PC)->MAR,此时(MAR) = 2
- (PC) + 1 -> PC,此时(PC) = 3。
- M(MAR)->MDR,此时(MDR) = 0000110000000111
- (MDR)->IR,此时(IR) = 0000110000000111
- OP(IR)->CU,指令的操作码送到CU,CU分析后得知这是加法指令。
- Ad(IR)->MAR,将指令的地址码送到MAR中,此时(MAR) = 7.
- M(MAR)->MDR,此时(MDR) = 0000000000000001 = 1.
- (MDR)->X,此时(X) = 0000000000000001 = 1.
- (ACC) + (X) -> ACC, (ACC) = 7
- (PC)->MAR,此时(MAR) = 3
- (PC) + 1 -> PC,此时(PC) = 4。
- M(MAR)->MDR,此时(MDR) = 0000100000001000
- (MDR)->IR,此时(IR) = 0000100000001000
- OP(IR)->CU,指令的操作码送到CU,CU分析后得知这是存数指令。
- Ad(IR)->MAR,将指令的地址码送到MAR中,此时(MAR) = 8.
- (ACC) -> MDR, (MDR) = 7
- (MDR) -> 地址位8的存储单元,最终结果y = 7
- (PC)->MAR,此时(MAR) = 4
- (PC) + 1 -> PC,此时(PC) = 5。
- M(MAR)->MDR,此时(MDR) = 0001100000000000
- (MDR)->IR,此时(IR) = 0001100000000000
- OP(IR)->CU,指令的操作码送到CU,CU分析后得知这是停机指令。
- 利用中断机制通知OS终止该进程。
- 指令执行的3个阶段:
\[指令执行的3个阶段
\begin{cases}
取指令\\
分析指令\\
执行指令
\end{cases}
\]
其中,取指令和分析指令为必经步骤,执行指令根据具体指令的不同执行步骤也不同。
CPU区分指令和数据的依据:指令周期的不同阶段
1.2.3 计算机系统的层次结构
计算机系统层次结构
结构层次 | 注释 |
---|---|
虚拟机器M4(高级语言机器) | 用编译程序翻译成汇编语言程序 |
虚拟机器M3(汇编语言机器) | 用汇编程序翻译成机器语言程序。(因为所有机器理论上最终都只能执行机器语言,所以这里称为虚拟机器) |
虚拟机器M2(操作系统(OS)机器) | 向上提供“广义指令”(系统调用) |
传统机器M1(用机器语言的机器) | 执行二进制指令 |
微程序机器M0(使用微指令系统) | 由硬件直接执行微指令 |
- OS及以上属于软件部分,以下属于硬件部分。
- 下层是上层的基础,上层是下层的扩展。
三种级别的语言
- 高级语言需要用编译程序编译成汇编语言。
- 汇编语言需要用汇编程序翻译成机器语言。
- 有的高级语言可以直接编译成机器语言。
- 有的高级语言(python)不通过编译,而是通过解释程序转变为机器语言。
- 编译程序:将高级语言源程序全部语句一次全部编译成机器语言程序,而后再执行。(只需编译一次)
解释程序:将高级语言源程序的一条语句翻译成对应机器语言后立即执行,紧接着翻译下一句。(每次执行都要翻译)
二者区别:编译的效率更高
1.3 计算机的性能指标
存储器的性能指标
- 存储器容量:
MAR反映有多少个存储单元,MDRF反映每个存储单元有多少位。
总容量 = 存数单元个数 * 存储字长(bit) = 存数单元个数 * 存储字长 / 8 (Byte)
现实中可能总容量小于存数单元个数 * 存储字长,但是做题的时候可以直接这由计算。
CPU的性能指标
- CPU主频:CPU内数字信号脉冲信号振荡的频率。如下图所示:
信号的一次振荡称为时钟周期
\(CPU主频(时钟频率) = \frac {1} {CPU时钟周期}\)
其他条件相同的情况下,CPU主频越高,计算机速度越快。 - CPI(Clock cycle Per Instruction):执行一条指令所需的时钟周期数。不同指令,CPI不同;甚至相同质量,CPI也可能发生变化(如取数指令可能与主存当前状态有关)。我们讨论CPI一般为平均情况。
\(执行一条指令的耗时 = CPI \times CPU时钟周期\)
例题:某CPU主频1000Hz,某程序包含100条指令,平均CPI = 3,该程序在CPU该上需要执行多久?
解:
\(CPU时钟周期 = \frac {1}{CPU主频} = \frac {1}{1000} (s)\)
\(平均一条指令耗时 = CPI \times CPU时钟周期 = 3 \times \frac {1}{1000} = \frac {3}{1000}(s)\)
\(总用时 = 指令数 \times 平均一条指令耗时 = 100 \times \frac {3}{1000} = 0.3(s)\)
答:该程序在CPU该上需要执行0.3秒。
注:整个程序耗时有时也被称作CPU执行时间。 - IPS(Instruction Per Second):每秒执行多少条指令。
\(IPS = \frac {主频}{平均CPI}\) - FLOPS(Floating-point Per Second):每秒执行多少次浮点运算。
IPS和FLOPS前常加K、M等数量单位KIPS、MIPS,KFLOPS、MFLOPS、GFLOPS、TFLOPS等。这里的K、M、G、T与存储器容量和文件大小部分的含义不同。这里的:
\(K = 10^3\)
\(M = 10^6\)
\(G = 10^9\)
\(T = 10^{12}\)
存储器容量部分:
\(K = 2^{10}\)
\(M = 2^{20}\)
\(G = 2^{30}\)
\(T = 2^{40}\)
系统整体性能指标
- 数据通路带宽:数据总线一次所能并行传送信息的位数(各硬件部件通过数据总线传输数据)(CPU<->内存、内存<->I/O设备之间的信息传输都是靠数据总线)
- 吞吐量:指系统在单位时间内处理请求的数量。
这个请求是一个较为抽象的概念,可以是一条指令、一段程序、一个HTTP请求。不同功能的系统处理的请求可能不同。
吞吐量主要取决于主存的存取周期。 - 响应时间:指从用户向计算机发送一个请求,到系统对该请求做出响应并获取它所需结果的等待时间。
- 基准程序:用来测量计算机处理速度的一种实用程序,以便于被测计算机性能可与运行相同程序的其他计算机性能进行比较。(e.g.跑分软件)
- 注:
- 主频高的计算机不一定比主频低的快。因为CPI可能不同。
- 当CPI一定时,主频高的计算机也不一定比主频低的快(因为计算机的指令系统不同)。
- 基准程序越快不见得机器性能越好,因为基准程序中的语句存在频度差异。