1.1 计算机系统简介
1.1.1 计算机软硬件的概念
现代计算机系统由哪两部分组成?- 软件和硬件
软件分为系统软件和应用软件
系统软件:可以管理计算机硬件和软件,给计算机的使用者提供人机交界面;
- 语言处理程序(高级语言想在计算机上运行,必须要有编译程序的支持,经过编译、链接后的目标程序,才可以在计算机硬件上运行)
- 操作系统(管理计算机系统的软、硬件资源,提供人机交互,使得多个用户、多个程序可以在一台计算机上执行,使用计算机软、硬件资源)
- 服务型程序(如数学库,MPI(进程间数据传输、协调))
- 数据库管理系统
- 网络软件
应用软件:dnf、QQ
1.1.2 计算机系统层次结构
系统软件利用硬件提供的接口,实现自己的功能。
应用软件利用系统软件提供的接口,调用系统软件功能,实现自己的功能。
对于一个系统,可以从不同的角度来抽象:物理构成和程序员的角度
这门课主要研究的是逻辑层和微体系结构层,学习计算机中主要部件的逻辑实现,和主要部件间的连接
最早出现的是机器语言,利用机器提供的指令集,使用0101直接对硬件进行编程
为了简化程序的编写,将机器语言符号化,产生了汇编语言。
然而,实际的机器不能识别汇编语言写的程序,必须为这台机器提供汇编程序,把汇编语言编写的程序转化为机器语言编写的程序。相当于,在硬件机器的外层罩了一层软件,这层软件完成了对汇编语言->机器语言的翻译。
把罩有汇编程序的机器,抽象成一个新的机器M2,对于高级语言来讲,M2不能识别高级语言,所以在M2的外层罩了一层软件,这层软件完成对高级语言->汇编语言的翻译。这样,对于高级语言程序员来讲,就抽象成了一个新的机器M3,M3可以直接识别高级语言。
一条机器语言的指令,执行也是很复杂的,比如,要把一条机器语言的指令从存储器中取出来,要先把这条指令的地址传送给存储器,要告诉存储器进行读,之后。。。这些操作有先后关系,有些可以同时、有些不可以,把这些操作指令句句细化,把他们放到微指令中。
//汇编语言摆脱不了实际机器的指令系统,不同机器都有与其对应的汇编语言
//这要求程序员要掌握不同机器的指令系统。
//翻译程序有两种,编译程序和解释程序
//编译是一次性全部翻译成机器语言,以后永远不用再翻译了
//解释是一条一条的翻译成机器语言,下次执行还翻译
在机器语言和汇编语言间,还留有一个部分。汇编语言程序员可以利用操作系统的功能进行编程,操作系统可以管理软硬件的资源。操作系统提供了在汇编语言和高级语言的使用和实现过程中所需的某些基本操作,还起到了控制并管理计算机全部硬件和软件资源的作用。
MOV AH, 4H
INT 21H
//上面两条指令完成了汇编语言应用程序的退出,返回了dos系统
//这是汇编语言调用了dos系统提供的中断功能,实现了程序的退出
//M1也叫传统机器(机器语言机器)
//M0叫微程序机器(微指令系统)
软、硬件分界线不是一成不变的,一部分软件功能由硬件实现,例如,目前操作系统已经实现了部分固化(把软件永远存放在只读存储器中),称为固件。
本课程主要研究M0和M1
1.1.3 计算机组成和计算机体系结构
计算机体系结构,定义了计算机系统的软硬件的交界面,定义了哪些功能由软件,哪些由硬件实现。提供了上层软件和硬件的接口;
机器语言程序员见到的计算机系统的属性(指令集、寄存器文件组织、内存编址单位)
概念性的结构与功能特性
计算机组成:实现计算机体系结构所体现的属性;例如:具体指令的实现,在计算机体系结构中,有乘法指令的规定,那么在计算机组成中要利用上面的规定,想办法实现乘法指令,这个实现是指逻辑实现。
两种机器,是否具有乘法指令,这是结构问题。
实现乘法指令采用什么方式,这是组成问题。实现乘法指令可以采用一个专门的乘法电路,也可以用连续相加的加法电路实现。这两种区别就是计算机组成的区别。
本课程主要研究计算机组成
1.2 计算机的基本组成
1.2.1 冯诺依曼计算机的特点
- 计算机由五大部分组成(运算器、控制器、存储器、输入设备、输出设备)
- 指令和数据以同等地位存于存储器,可按地址寻访(现代机器有的是把指令和数据放在不同的cache中,而且是按内容寻访,不是按地址寻访)
- 指令和数据用二进制表示
- 指令由操作码和地址码组成(指令=操作码+地址码)
- 存储程序(程序存放在存储器中)(核心是存储程序,有存储程序的都叫冯诺依曼计算机)
- 以运算器为中心,输入、输出设备和存储器的数据传送是通过运算器完成
1.2.2 计算机的硬件框图
实线是数据流动的路线,虚线表示控制和状态反馈
以上是典型的冯诺依曼计算机,这种计算机中,运算器是非常繁忙的,负责了太多的功能,运算器会成为计算机系统的瓶颈。
输入、输出设备与存储器直接进行信息交互
主存用来存放数据和程序,可以直接和CPU交换信息。辅存又叫外存。
1.2.2 计算机的工作步骤
- 数学建模:对于很多科技问题,我们可以建立数学模型,例如圆周运动,可以建立它的运动方程
- 确定计算方法:计算机只能进行四则运算,对于
sinX
相关的方程组,使用泰勒公式,对于开方,使用迭代公式 - 编写解题程序:程序(运算的全部步骤)| 指令(每一个步骤)
把上述运算步骤写成某计算机一 一对应的机器指令,就完成了运算程序的编写。
设某机器的指令字长为16位,其中操作码占6位,地址码10位。
操作码:表示机器所执行的各种操作,如取数,存数,加减乘除,停机,打印等。
地址码:参加运算的数在存储器内的位置。
机器指令的操作码和地址码都用0、1
代码组合来表示。
上图,取数a,默认把数取出放入到ACC当中。000001
表示取操作,0000001000
表示数a的地址。
主存储器(简称主存也叫内存)
为了实现按照地址访问,还要配备两个寄存器MAR和MDR;
MAR存放将要访问的存储单元的地址,如MAR=4,就是2^4个不同的地址。
MDR存放从存储单元取出或准备存入的代码
想要完整地完成一个取或存操作,CPU还要给主存加以各种控制信号,如读命令、写命令和地址译码驱动信号。随着硬件的发展,主存都制成大规模集成电路的芯片,而把MAR和MDR集成在CPU芯片中。
运算器
运算器最少包括3个寄存器(现代计算机内部往往有通用寄存器组),还有一个算数逻辑单元(ALU)。
核心是ALU,ALU通常是一个组合电路,他的特点是如果输入撤销,那么输出结果也会撤销。为了完成功能,能对结果进行保存,必须在ALU输入端加入寄存器,寄存器保存参与计算的数据,就需要两个寄存器作为输入数据的保存设备。一个是ACC,还有一个是X;以为乘法会让数据的长度翻倍,所以要额外添加一个寄存器MQ;
ACC(Accumulate)为累加器,MQ为乘商寄存器,X为操作数寄存器。
ACC和X作为运算的输入,ACC也用于保存运算结果。对于乘法,由于结果长度要增加一倍,那么把多出来的部分放在MQ;
不同的机器的运算结构是不同的,图1.11,也就是上图中的运算器,可以把运算结果从ACC送至存储器中的MDR,而存储器的操作数也可以从MDR送至运算器中的ACC、MQ或X。有的机器用MDR取代X寄存器。对于不同的机器,会有不同数量的寄存器,实际的情况也会不同。
下面简要分析一下上图这种机器的运算器四则运算的操作过程。
M代表存储器的任一地址号,[M]代表对应M地址号单元中的内容;X表示X寄存器,[X]表示寄存器中的内容;
假设ACC中已经有前一时刻的运算结果,并且作为下述运算中的一个操作数,则
- 加法操作过程:
[M] -> X
[ACC] + [X] -> ACC
//即把[ACC]看做被加数,先从主存中取[M],送到X中
//然后把被加数[ACC]和加数[X]相加,结果(和)保留在ACC中
- 减法操作
[M] -> X
[ACC] - [X] -> ACC
//把[ACC]看做被减数,把[M]放入X
//把结果(差)保留在ACC中
- 乘法操作
//乘法在计算机中可以用加法和移位的方式来进行计算
//我们在纸上计算乘法,是几行数字错位相加,在计算机中类似
//进行相加的时候,需要一个累加器,不能像纸上那样一次性全加在一起
//累加器选择ACC,被乘数在X,乘数在MQ
[M] -> MQ
[ACC] -> X
0 -> ACC //ACC清0
[X] * [MQ] -> ACC | MQ //高位放在ACC,低位放在MQ
//把[ACC]看做被乘数
- 除法操作
[M] -> X
[ACC] ÷ [X] -> MQ //商暂留在MQ
余数R在ACC中
//[ACC]看做被除数
//若要把商保存在ACC中,只要[MQ] -> [ACC]
控制器
控制器是计算机的神经中枢,他指挥各部件自动、协调工作。具体而言,他首先命令存储器读出一条指令,称为取指过程(取指阶段);接着,对此指令分析,指出该指令要完成什么操作,并按寻址特征指明操作数的地址,称为分析过程(分析阶段);最后根据操作数所在地址和指令的操作码完成某种操作,称为执行过程(执行阶段);这就是完成一条指令的三个阶段。
控制器由程序计数器(program counter,PC)、指令寄存器(Instruction register,IR)、控制单元(CU)组成。
PC存放当前欲执行指令的地址,它与主存的MAR间有一条直接通路,且有自动加1的功能,即可以自动形成下一条指令的地址。IR用来存放当前指令,IR的内容来自主存MDR。IR中的操作码(OP(IR))送到CU,记做OP(IR) -> CU
,用来分析指令;其地址码(AD(IR))作为操作数的地址送至存储器的MAR,记做AD(IR) -> MAR
。CU用来分析当前指令所需完成的操作,并发出各种微操作命令序列,用以控制所有被控制对象。
控制器的功能:解释指令(执行指令是运算器) + 保证指令的按序执行
接下来分析:
- 一条指令在主机上的完成过程
- 程序在主机上是如何执行的
完成一条指令有3个阶段:
- 取指令
- 分析指令
- 执行指令
要完成取数指令
取指令(要知道指令的地址在哪)
欲执行指令地址保存在PC中
指令保存在存储体中
1. PC把指令地址送给MAR
2. MAR送给存储体
3. 在控制器(CU)的控制下,存储体把指定存储单元中保存的那条<取数指令>取出送入MDR
4. MDR把保存的指令送入IR
//------完成取指工作,下一步,分析指令--------
5. IR中保存的操作码部分送入CU
//<取数指令>是把[M] -> ACC,为了完成这个操作,在控制器的控制下
//把指令中的地址部分送给存储器,以便把数据从存储体中取出
//IR保存了当前的指令,还有当前指令操作数的地址
6. 从IR的地址码部分取出地址,送入MAR
7. MAR把地址送给存储体
8. 在控制器的控制下,从存储体中把取数指令要取的数取出,存入MDR
9. 把MDR中的数送入ACC
//完成取数操作
//对于存数指令,第一步还是取指令
1. PC把指令地址送给MAR
2. MAR送给存储体
3. 在控制器(CU)的控制下,存储体把指定存储单元中保存的那条<取数指令>取出送入MDR
4. MDR把保存的指令送入IR
//------完成取指工作,下一步,分析指令--------
5. IR中保存的操作码部分送入CU,由CU对指令进行分析,分析这条指令要做什么操作
6. 从IR的地址码部分取出地址,送入MAR
7. MAR把地址送给存储体,告诉存储体有数据要存进来,地址是多少
8. 在控制器的控制下,把ACC中的数据存入MDR
9. 在控制器的控制下,把MDR中的数据保存在存储体中
程序由一条条指令构成,执行程序就是执行一条条指令
1.3 计算机硬件的主要技术指标
- 机器字长:CPU一次能处理数据的位数,与CPU中寄存器的位数有关
/**我的CPU可以对两个8位二进制数做加法,结果还是一个8位的二进制数。那么在
这种情况下,CPU一次能处理的数据位数是8位,不是24位。我们上面讨论的机器
字长,和ACC、X、MQ的字长相同。为了简化问题,我们存储单元的长度,也就是存储
字长,和寄存器的长度也都是相同的。这只是模型机里的假设,并不是所有计算机
都这样。
机器字长越长,机器性能越好。例如我们把两个64位的数相加,把他们的和保存在
64位寄存器中。如果机器字长是8位,寄存器也是8位,那么要完成这64位的加法,
我们就要做8次加法运算(相对应的8位进行相加)。如果机器字长就是64,寄存器
也是64,那么就是一次计算。
*/
- 运算速度
/**
主频:频率越高,速度越快
核数:每个核支持的线程数
主存:主存速度快,取指、取数速度快
吉普森法:曾经用过
现代指标:单位时间内执行指令的平均条数来衡量,用MIPS(百万条指令每秒)做
计量单位。例如,某机每秒执行200万条指令,记做2MIPS。
也可以用CPI,也就是执行一条指令所需的时钟周期(机器主屏的倒数)数,CPI越小越好
或者用FLOPS(浮点运算次数每秒)来衡量计算速度
*/
- 存储容量