【计组】第一章:计算机系统组成概述
章节纲要:
- 发展历程
- 计算机系统的层次结构
-
- 计算机硬件的基本组成
-
- 计算机软件的分类
-
- 计算机的工作过程
- 计算机性能的指标:吞吐量,响应时间,CPU时钟周期,主频,CPI,CPU的执行时间,MIPS,MFLOPS
1. 发展历程
1. 计算机硬件的发展经历了四代:
- 电子管时代:机器语言编程(40年代出现的时候,第一台计算机是1946年)
- 晶体管时代:高级语言的出现,磁芯存储器(大概50,60年代的时候)
- 中小规模的集成电路时代:半导体存储器,分时操作系统的出现(60-70年代的时候)
- 超大规模的集成电路:微处理器(70年代之后至今)
2. 每种指令系统的分类:
- SISD:单指令单数据流,也就是我们常说的冯诺依曼架构,使用控制流驱动方式
- MIMD:多指令多数据流,多用于分布式计算机
3. 编译,汇编,解释:
- 编译:把高级语言转成机器语言
- 汇编:把汇编语言转成机器语言
- 解释:程序执行的时候才翻译成机器语言,动态转换
使用二进制是由物理器件的性质和性能决定的
2. 计算机的层次结构:硬件的基本组成
2.1 计算机的层次结构:
- (1)计算机系统由“软件”和“硬件”组成
- (2)软件和硬件在逻辑上是等效的,硬件注重的是效率,软件注重的是灵活性
- (3)硬件的组成:【1】运算器【2】存储器【3】控制器【4】IO设备
- (4)指令和数据以同等的地位存放在存储器当中
- (5)指令由:“指令码”+“地址码”,在存储器当中顺序存放
- (6)存储程序:将指令存放在主存当中,按在主存当中的首地址开始执行第一条指令,顺序执行,直到结束。
- (7)早期的计算机是以运算器作为中心的,后期为减少IO和CPU的关联,发展为以存储器为中心。
- (8)存储器包括:主存和辅存。主存是由多个存储单元组成的,存储单元含有多个存储的元件,每个存储元件存储一位的0或者1。存储字:一串二进制的代码,存储字长:8-bit 的0或者偶数倍
[存储元件…]=存储单元,存储单元 = 存储字(他的长度是存储字长),需要注意的是:机器字长和存储字长的概念是不一样的。
- (9)按地址存储:按照存储单元的地址进行存取
- (10)相联存储器既可以按址访存,也可以按照内容寻址。
2.2 常见的缩写:
- MAR:主存地址寄存器。存放准备访问的存储单元的地址
- MDR:主存数据寄存器。存放从存储单元取来的数据
- IR:指令寄存器。存放当前准备执行的指令
- PC:程序计数器,是寄存器。存放下条指令的地址
- CU:控制单元。分析指令
我们可以看到,我们的寄存器分为存内容的寄存器和存地址的寄存器,我们所说的存内容分为两者:数据和指令。
2.3 MAR和MDR:
- MAR:用于寻址,其位数对应存储单元的个数,比如我们说MAR的位数是10位,那么我们的存储单元的数量是 2 10 = 1024 2^{10}=1024 210=1024
- MDR:用来存拿回来的数据,因此他的位数等于存储单元的存储字长。
2.4 运算器:
核心是ALU,还含有其他通用的寄存器,如:ACC(累加器),MQ(乘商器),X(操作数寄存器),IX(变址寄存器),BR(基址寄存器),PSW(程序状态字寄存器)
2.5 控制器:
- PC:程序计数器(存地址),存放下一条准备执行的指令的地址
- IR:指令寄存器(存内容)存放当前准备执行的指令,他的内容来自于MDR
- CU:控制单元,分析指令
IR的指令的操作码会被送到CU,操作数地址码会送到MAR,然后去取内容。
2.6 一个传统CPU的示例:
这个是传统的CPU,现代的CPU会把MDR和MAR也包含进去了。
3. 计算机的层次结构:软件的分类
3.1 系统软件和应用软件:
- 系统软件:OS,DBMS,语言处理软件,分布式软件,网络软件(基建)
- 应用软件:科学计算类的软件,工程设计的软件,数据统计的软件
需要注意的是:DBMS ≠ \neq =DBS,DBMS是系统数据库管理系统,是管理用户和操作系统之间的数据交互的,而DBS是我们常见的数据库系统是属于应用类的软件。
3.2 语言之间的转换可能
4. 计算机的工作过程
4.1 四步工作
- step1:程序和数据 → \rightarrow →主存
- step2:从起始地址开始执行指令
- step3:计算下条指令的地址
- step4:取出指令并执行直到结束
4.2 取指令,分析指令,执行指令:
- 取指令:PC → \rightarrow →MAR → \rightarrow →M → \rightarrow →MDR → \rightarrow →IR
- 分析指令:OP(IR) → \rightarrow →CU
- 执行指令:AD(IR) → \rightarrow →MAR → \rightarrow →M → \rightarrow →MDR → \rightarrow →ACC(示例代指运算部件)
每取完一条指令:(PC)+1 → \rightarrow →PC
OP是操作码的意思,AD是数据地址码的意思,(…)就 是把这个部件的内容怎样怎样。
4.3 计算机系统的多级层次结构:
上层是对下层的功能拓展,下层是上层的基础
计算机应具备的功能:数据传送,数据存储,数据处理,操作控制,操作判断
5. 计算机的性能指标
5.1 字长
- 机器字长:指计算机一次整形运算所能处理的位数,一般等于内部寄存器的字长
- 指令字长:指令的位数,一定是存储字长的整数倍
- 存储字长:存储单元的位数,一定是Byte的整数倍
假如:指令字长 = 2 存储字长,则取指周期 = 2 机器周期
5.2 数据通路带宽:
指的是数据总线一次能传达的位数
5.3 存储量指标:
- 方法1:xxx 字节
- 方法2:字数x存储字长,比如:512K ∗ * ∗ 16bit。512K就是存储单元的数量,16bit就是存储字长。
我们需要注意的是这里的K单位,实际上,有两种换算方法:一种KiB的换算法: 1 K i B = 2 10 = 1024 B 1KiB = 2^{10}=1024 B 1KiB=210=1024B,一种是KB换算法: 1 K B = 1000 B 1KB=1000B 1KB=1000B,但是由于各种原因,至今这俩个单位经常被通俗地混淆,我们只有在考试遇到题目的时候才需要较真的考虑。当我们发现当前的场景需要考虑二进制位数的时候,我们就使用KiB的方式,如果像在计网里面计算一些明显很难换算成2的次方的数据的时候我们就直接使用1000换算。或者,我们研究速度的时候,一般使用1000作为换算,研究存储数据的时候使用1024的换算。
比如,我们这里512K,我们研究的是非常严谨的存储单元,因此是需要严格考虑位数的, K = 2 10 K=2^{10} K=210, 512 = 2 9 512=2^9 512=29,对这个存储器访存的MAR位数是 19 19 19。
假如我们知道主存大小是64K*32位,而且存储字长和机器字长相等,写出MAR,MDR,PC的位数。
64K = 2 16 2^{16} 216,MAR = 16位,MDR = 32位,PC(存地址)存放的是下一条指令的地址,因此也是16位
5.4 运算速度:
- K=1000,M=1000K,G=1000M,T=1000G。M我们叫百万
- CPU主频:每秒能产生的时钟周期数量
- CPI:每条指令消耗的时钟周期数量
- 程序执行耗时:(指令总数*CPI)/CPU主频
- MIPS:每秒执行多少M的指令
- MFLOPS:每秒执行多少M次的浮点运算
- 【计组】吞吐量:在单位时间能处理请求的数量
- 响应时间:请求之后的需要等待时间
5.5 其他:
- (1)系列机:相同的体系结构,相同的指令系统,型号不一样
- (2)兼容:软件或者硬件的通用性,在不同型号通用
- (3)固件:具有软件特性的硬件,比如:ROM,就一个软硬结合的产物
- (4)缩短程序执行时间我们可以对程序进行编译优化,得到更优的指令序列
- (5)机器字长,指令字长,存储字长,三者可以相等,也可以不等
- (6)数据字长:指的数据总线一次并行能传送的数据位数
- (7)标志系统性能最有用的参数:MFLOPS。综合参数看:吞吐率
- (8)在CPU寄存器中,指令寄存器IR对用户是透明的。(透明的意思是看不到)
- (9)机器字长 4字节=4B=32Bit,因此计算机每次可以处理32位
- (10)计算机最小的单位时间是时钟周期
- (11)在实际运行当中可能出现主频较搞但是实际速度低的情况
- (12)汇编程序员是能对PC,PSW,UR这些寄存器可见的,不透明,但是对于高级程序员就透明了。
- (13)优化执行速度,我们希望:CPI 越少越好(每吃一口消耗的时间),CPU主频越高越好(吃饭的时间越多越好),总指令数越少越好(步骤数越少越好)
- (14)在CPU里面最小的资源单位也是时钟单位,我们的执行一条指令需要消耗多个时钟周期。在宏观的时间观念上:1秒>多条指令(M,G级别的倍数),一条指令>多个时钟周期(可能是个位数的倍数)
5.6 性能计算题型技巧
方法诀窍:抓住不变量列等式
- 三个量:CPI(每条指令消耗的时钟),总指令数,主频(每秒产生的时钟数)
- 关系1:总指令数 * CPI = 总时钟数
- 关系2:总时间 * 主频 = 总时钟数
例题1:程序P执行耗时20s,优化之后,指令数变成原来的70%,CPI增加到原来的1.2倍,则限制P耗时多少秒?
解:这种问题我们需要抓住不变量,三个东西你看哪个不变的:CPI,总指令数,CPU主频,明显是CPU主频不变了,也就是每秒产生的时钟周期是一样的。
我们设原来的指令数是 I I I,设原来的CPI是 X X X,设当前消耗的时间是 t t t
X ∗ I = 执 行 程 序 需 要 的 全 部 时 钟 周 期 X*I=执行程序需要的全部时钟周期 X∗I=执行程序需要的全部时钟周期
主频等式: X ∗ I 20 = 0.7 ∗ 1.2 ∗ X ∗ I t \frac{X*I}{20}=\frac{0.7*1.2*X*I}{t} 20X∗I=t0.7∗1.2∗X∗I
所以可以解得 t = 20 ∗ 0.84 = 16.8 s t=20*0.84=16.8s t=20∗0.84=16.8s
例题2:假设M1和M2具有相同的指令集,主频分别为1.5GHz,1.2GHz,在M1和M2运行程序P,CPI分别为2和1,则P在M1和M2运行时间之比是?
解:你需要熟记主频,CPI,总指令数之间的关系,三个量,你看哪个不变,明显是:总指令数嘛,因此拿他来列等式。
主频 1.5GHz,在研究速度,因此使用1000换算法。
每秒产生的时钟周期数量。
1.5
G
H
z
=
1.5
∗
1000
M
=
1.5
∗
1000
∗
1000
K
=
1.5
∗
1000
∗
1000
∗
1000
=
1.5
∗
1
0
9
1.5GHz = 1.5*1000M=1.5*1000*1000K=1.5*1000*1000*1000=1.5*10^{9}
1.5GHz=1.5∗1000M=1.5∗1000∗1000K=1.5∗1000∗1000∗1000=1.5∗109
1.2
G
H
z
=
1.2
∗
1000
M
=
1.2
∗
1000
∗
1000
K
=
1.2
∗
1000
∗
1000
∗
1000
=
1.2
∗
1
0
9
1.2GHz = 1.2*1000M=1.2*1000*1000K=1.2*1000*1000*1000=1.2*10^{9}
1.2GHz=1.2∗1000M=1.2∗1000∗1000K=1.2∗1000∗1000∗1000=1.2∗109
总
指
令
数
=
耗
费
的
总
时
钟
周
期
/
C
P
I
总指令数 = 耗费的总时钟周期 / CPI
总指令数=耗费的总时钟周期/CPI
主
频
=
耗
费
的
总
时
钟
周
期
/
总
时
间
主频 = 耗费的总时钟周期 / 总时间
主频=耗费的总时钟周期/总时间
因此我们有等式:
1.5
∗
1
0
9
∗
t
1
2
=
1.2
∗
1
0
9
∗
t
2
1
\frac{1.5*10^9*t_1}{2}=\frac{1.2*10^9*t_2}{1}
21.5∗109∗t1=11.2∗109∗t2
∴
t
1
t
2
=
8
5
\therefore \frac{t_1}{t_2}=\frac{8}{5}
∴t2t1=58