什么是计算机系统
计算机系统 = 硬件 + 软件
硬件:计算机的实体,比如说CPU,内存条,硬盘等
软件:具有各类特殊功能,而软件又分为系统软件和应用软件
- 系统软件:用来管理整个计算机系统,比如说Windows系统,Linux系统等
- 应用软件:任务需要编织成的各种程序,比如QQ,微信,支付宝等
硬件的发展
发展阶段`` | 时间 | 逻辑元件 | 速度 | 内存 | 外存 |
---|---|---|---|---|---|
第一代 | 1946-1957 | 电子管 | 几千-几万 | 汞延迟线、磁鼓 | 穿孔卡片、纸带 |
第二代 | 1958-1964 | 晶体管 | 几万-几十万 | 磁芯存储器 | 磁带 |
第三代 | 1964-1971 | 中小规模集成电路 | 几十万-几百万 | 半导体存储器 | 磁带、磁盘 |
第四代 | 1972-现在 | 大规模、超大规模集成电路 | 上千万-上亿 | 半导体存储器 | 磁带、磁盘、光盘、半导体光盘 |
软件的发展
分为计算机语言的发展和操作系统的发展
计算机语言:机器语言,汇编语言,高级语言
操作系统:Windows,Linux,安卓等
计算机硬件组成
计算机层次结构
冯诺依曼机特点
- 计算机硬件由运算器、存储器、控制器、输入和输出设备5个部分组成
- 指令和数据以同等地位存储在存储器,并可按地址寻访
- 指令是由操作码和地址码组成,操作码用于表示这是一个什么类型的操作,地址码用于表示操作数存储中的存放位置
- 指令在存储器内按顺序存放(一般情况下是这样的,但在特定条件下也可以进行设定)
- 早期的冯诺依曼机器以运算器为中心,输入输出设备通过运算器与存储器传送数据
- 上图中,实线是数据线,虚线是控制线(双向)
冯诺依曼机缺陷(早期)
在控制器的指挥下,输入和输出设备输入一些数据交给运算器,如果产生中间结果,就会传送给存储器,计算完成后最终结果会给输出设备。
可以发现这种层次结构容易收到输入和输出设备的牵制,因为他们的速度相较于运算器太慢了(短板效应)
现代计算机的组织结构
为了解决I/O设备的速度和CPU速度差异悬殊的问题,现如今的计算机则采用以存储器为中心的计算机结构组织,这种结果使I/O操作尽可能绕过CPU,直接在I/O设备和存储器之间完成,以提高系统的整体运行效率
计算机硬件概述
存储器
存储器的基本结构
存储器基本结构:存储器主要分为主存(内存)与辅存(外存)
- 主存:CPU可以直接访问;主要存放程序和数据;是计算机实现“存储程序”控制的基础;外存中信息必须加载进主存之后CPU才可以访问;
- 辅存:CPU不可以直接访问
主存的结构如下所示
- 存储体M:存放二进制
- MAR(地址寄存器):存放的是访存地址(经过地址译码后找到所选存储单元)
- MDR(数据寄存器):存放的是要从存储器中读入或写入的信息
存储器相关基本定义
存储器相关基本定义:目前我们采用的半导体器件来承担存储任务,一个半导体触发器由于有0和1两个状态,就可以记忆一个二进制代码,关于存储器有如下五个非常重要的概念。
- 存储元:也可称为存储元件和存储基元,用来存放一位二进制信息
- 存储单元:由若干个存储元组成,能存放多位二进制信息
- 存储体:许多存储单元可组成存储体,也即存储矩阵
- 存储字:每个存储单元中二进制代码的组合即为存储字,可代表数值、指令和地址等
- 存储字长:每个存储单元中二进制代码的位数就是存储字长
上述概念可以这样记忆:主存储器由许多存储单元组成,每个存储单元包含多个存储元,每个存储元存储1位二进制代码0或1,故存储单元可存储一串二进制代码,称这串代码为存储字,而这串代码的位数称为存储字长,存储字长一般是一个字节(8位)或字节的偶数倍。
存储器相关小考点
- 数据在存储体中是按照地址存储的,每个地址对应一个存储单元
- 存储单元数目=2 M A R 位数 2^{MAR位数}2
- MAR位数(如果MAR为10位,则存储单元数目为2 10 = 1024 2^{10}=10242 10 =1024)。它用于寻址,其长度和PC(程序计数器)长度一致
- MDR的位数表示存储字长(例如MDR为16,表示存储字长为16,也表示1个字(word)=16bit)
- 注意区分字(word)和字节(Byte),1个字节等于8个bit,而1个字的大小取决于机器
- 1B=1个字节,1b=1个bit
运算器
运算器:是计算机的执行部件,主要进行
- 算数运算:比如加减乘除
- 逻辑运算:比如与、或、非、异或、比较等等
运算器基本结构
运算器基本结构:由以下四部分构成
- ALU(算数逻辑单元):运算器中造价最为高昂的部分,本质是一对电路
- ACC(累加器):用于存放操作数,或运算结果
- MQ(乘商寄存器):在乘除运算式,用于存放操作数或运算结果
- X(操作数寄存器):用于存放操作数
运算器过程伪代码描述(了解)
设M为主存中的某一个存储单元,(M)表示取M中的数据,->表示将内容送入寄存器
加法实现:假设ACC中已经存在一个数,那么首先取M的内容送入操作数寄存器X,即(M)->X;然后两者相加重新送入寄存器ACC中,即(ACC)+(M)->(ACC)
乘法实现:假设ACC中已经存在一个数,那么首先取M的内容送入乘商寄存器MQ作为乘数,即(M)->MQ,再取ACC寄存器的内容放入X寄存器作为被乘数,即ACC->X,接着将ACC清零,即0->ACC,然后乘数乘以被乘数,一个送入乘积高位,一个送入乘积低位,即(X)×(MQ)->ACC//MQ
除法实现:假设ACC中已经存在一个数,首先取M的内容送入X作为除数,即(M)->X,ACC中的内容作为被除数,结果一个放入MQ作为整数部分,即(ACC)/(X)->MQ,另一个放入ACC作为余数,即(ACC)%(X)->ACC
控制器
运算器:是计算机的指挥中心,由其指挥各部分自动协调地进行工作
指令:是指指挥机器工作的指示和命令,程序本质就是一系列按照一定顺序排列的指令。人们用程序表达自己的意图,控制器则通过指令指挥机器工作,指令 = 操作码 + 地址码
- 操作码:指示计算机要干什么
- 地址码:干这些事情需要的原材料在哪里
控制器基本结构
- 控制单元(CU):分析指令、发出信号、协调操作
- 指令寄存器(IR):存放当前要执行的指令。注意其内容来源MDR,因为指令和数据本质是一样的,都被存放在存储器
- 程序计数器(PC):存放当前要执行的指令地址。注意其与MAR直接连通,并且可以自动+1
控制器过程伪代码描述
完成一条指令的过程为:取指令(PC)->分析指令(IR)->执行指令(CU)
具体过程:首先取出指令,即(IR),接着获取指令的操作码,即OP(IR),然后获取指令的地址码,即AD(IR),然后将操作码送入控制单元分析,即OP(IR)->CU,操作码表示需要干什么,但是干活需要原材料,所以再把指令的地址码送入MAR,AD(IR)->MAR,从MAR指示的存储体取出原材料即可。
结合前面的加法,我们可以写出完整的加法运算的过程的: 首要取加法指令,而指令存储在存储体中,想要取出指令必须要知道的指令的地址,而这个地址就存放在PC中,PC又和MAR直接相连,即(PC)->MAR,于是指令此时被放入了MDR中,那么接着将指令放入IR中,即(MDR)->IR,接着取指令的操作码送入控制单元,即OP(IR)->CU,然后再把原材料(就是一些操作数)的地址码送入MAR,即AD(IR)->MAR。接着就可以进行加法操作了,由于上一步已经将操作数的地址码送入了MDR中,所以现在送入操作数寄存器,即(MDR)->X,然后(ACC)+(X)->ACC,最后PC要自增,即(PC)+1->PC,表示下一条指令
计算机的工作过程
接下来以一段简单的C语言代码为例展示计算机在背后所做的工作
以下程序非常简单,声明了4个变量并赋值,然后在main函数内进行运算
int a=2,b=3,c=1,y=0;
void main()
{
y=a*b+c;
}
经过编译器编译后,这段程序在主存中就是这样的
下半部分是定义的变量,上半部分则是对应于高级语言对应的机器指令
为了方便演示,我们将控制器、运算器和存储体也放在旁边
第一组
1:程序开始运行,PC的值为0,保存的是第一条指令的地址。然后将PC的内容,也就是指令的地址送入到MAR中,即(PC)->MAR,MAR=0。也就是说控制器向存储器指明,我接下来要访问主存0号地址处的数据,同时告诉存储器进行读操作
2+3:主存储器会根据MAR记录的地址信息,到存储体中找出0号地址对应的二进制数据,并将其放入到MDR中,此时MDR中存放了第一条指令。即M(MAR)->MDR,此时MDR=000001 0000000101
4:接着将MDR中的指令放入IR中,于是控制器就存放了当前要执行的指令。即(MDR)->IR,(IR)=000001 0000000101
5:这条指令的前6个比特位是操作码,会被送入到控制单元CU中,CU分析后,得知这是一条取数命令。即OP(IR)->CU
6:取数指令会将变量a的内容放入寄存器ACC中。但是现在变量a不知道在哪里,所以现在会把指令的地址码送到MAR当中,即(MAR)=5
7+8:接着主存储器根据MAR指明的地址,也就是a的地址(5),去存储体中找出5号地址的数据,并将其放入MDR当中。即M(MAR)->MDR,(MDR)=0000000000000010,也即(MDR)=2
9:接着在控制单元的指挥下,MDR中的数据就被放入到了ACC中。至此第一条指令完成
10:最后PC自增1,进行下一条指令,即(PC)=1
接下来进行下一组操作
1:程序接着运行,PC的值为1,保存的是第二条指令的地址。然后将PC的内容,也就是指令的地址送入到MAR中,即(PC)->MAR,MAR=1。也就是说控制器向存储器指明,我接下来要访问主存1号地址处的数据,同时告诉存储器进行读操作
2+3:主存储器会根据MAR记录的地址信息,到存储体中找出1号地址对应的二进制数据,并将其放入到MDR中,此时MDR中存放了第二条指令。即M(MAR)->MDR,此时MDR=000100 0000000110
4:接着将MDR中的指令放入IR中,于是控制器就存放了当前要执行的指令。即(MDR)->IR,(IR)=000100 0000000110
5:这条指令的前6个比特位是操作码,会被送入到控制单元CU中,CU分析后,得知这是一条乘法命令。即OP(IR)->CU
6:接着把指令的地址码送到MAR当中,即(MAR)=6
7+8:接着主存储器根据MAR指明的地址,也就是b的地址(6),去存储体中找出6号地址的数据,并将其放入MDR当中。即M(MAR)->MDR,(MDR)=0000000000000011,也即(MDR)=3
9:由于是乘法,所以控制单元将MDR中的内容送入到乘商寄存器MQ中,即(MDR)->MQ,此时(MQ)=0000000000000011=3
10:先把a的值放入通用寄存器X中,即(ACC)->X,(X)=2
11:CU告诉ALU,让其进行乘法运算。即(MQ)×(X)->ACC,(ACC)=6。注意如果乘积过大,需要MQ辅助存储,也就是最上面讲到过的(X)×(MQ)->ACC//MQ
接着进行下一组操作,具体过程就不详细演示了,步骤如下
1:PC存储2号指令的地址,(PC)->MAR,(MAR)=2
2+3:M(MAR)->MDR,(MDR)=000011 0000000111
4:(MDR)->IR,(IR)=000011 0000000111
5:OP(IR)->CU,CU分析操作码,得知这是加法执行
6:Ad(IR)->MAR,将指令的地址码送入MAR,(MAR)=7
7+8:M(MAR)->MDR,(MDR)=00000000 00000001=1
9:(MDR)->x,(X)= 00000000 00000001=1
10:(ACC)+(X)->ACC,(ACC)->7,由ALU实现加法运算
接着进行下一组操作
1:(PC)->MAR,(MAR)=3
2+3:M(MAR)->MDR,MDR=000010 0000001000
4:(MDR)->IR,(IR)000010 0000001000
5:OP(IR)->CU,CU分析得知,这是存数指令
6:AD(IR)->MAR,(MAR)=8
7+8:(ACC)->MDR,MDR=7
9:(MDR)->地址为8的存储单元,导致y=7
最后再读取到停机指令时,计算机通过中断机制就结束了程序的运行
计算机系统的层次结构
计算机系统的层次结构:指的是计算机系统由硬件和软件两大部分所构成,而如果按功能再细分,可分为7层。把计算机系统按功能分为多级层次结构,就是有利于正确理解计算机系统的工作过程,明确软件,硬件在计算机系统中的地位和作用。
计算机性能指标
存储器的性能指标
存储器的性能指标主要有:存储容量,单位成本,存储速度
存储容量 = 存储字数 * 存储字长
储存字数:储存器的地址空间大小
(用在储存里的M常表示2^20, 而在通信中常表示10^6)
字长:一次存取操作的数据量(单位bit)