计算机硬件唯一能识别的数据——二进制0/1
其中使用低/高电平分别表示0/1
什么是低电平/高电平?
根据两种完全不一样的电信号,一个低电压和一个高电压,就可以分为低电平/高电平
通过电信号传递数据
那如内存,CPU硬件之间是如何传递数据的呢?
答:是通过主板上的印刷电路。
红色的线相当于是嵌入到主板上的电线。
通过很多条电路,可以传递多个二进制数位,每个二进制数位称为1bit(比特)。
什么是计算机系统?
计算机系统=硬件+软件
计算机性能的好坏取决于“软”、“硬”件功能的总和。
软件可以分为两类:
发展阶段 | 时间 | 逻辑元件 | 速度(次/秒) | 内存 | 外存 |
---|---|---|---|---|---|
第一代 | 1946—1957 | 电子管 | 几千—几万 | 汞延迟线、磁鼓 | 穿孔卡片、纸带 |
第二代 | 1958—1964 | 晶体管 | 几万—几十万 | 磁芯存储器 | 磁带 |
第三代 | 1964—1971 | 中小规模集成电路 | 几十万—几百万 | 半导体存储器 | 磁带、磁盘 |
第四代 | 1972—现在 | 大规模、超大规模集成电路 | 上千万—万亿 | 半导体存储器 | 磁盘、磁带、光盘、半导体存储器 |
第二代阶段时,计算机体积、功耗降低;出现面向过程的程序设计语言:FORTRAN,有了操作系统雏形。
第三代阶段时,计算机主要用于科学计算等专业用途,高级语言迅速发展,开始有了分时操作系统。
第四代阶段时,开始出现“微处理器”(CPU)、微型计算机、个人计算机(PC)。
晶体管之父:威廉·肖克利(1956年诺贝尔物理学奖得主)
1947年,贝尔实验室,发明了晶体管。
1955年,肖克利在硅谷创建公司——肖克利实验室股份有限公司,其中骨干成员:摩尔、罗伯茨、克莱纳、诺伊斯、格里尼克、布兰克、赫尔尼、拉斯特。但最终因肖克利管理不当,8人集体辞职,创办——仙童半导体公司。
1957年,“八叛徒”创建仙童半导体公司。
1959年,仙童半导体公司发明集成电路,后续该公司被收购。
1968年,摩尔等人离开仙童,创立了Inter
。
1969年,仙童销售部负责人桑德斯离开仙童,创立AMD。
摩尔定律揭示了信息技术进步的速度,集成电路上可容纳的晶体数目,约每隔18个月便会增加一倍,整体性能也将提升一倍。
知识回顾:
计算机硬件的基本组成:
世界第一台计算机ENIAC
需要手动接线来控制计算。也就是操作员做一步操作,计算机才会做一步操作,那这样计算效率势必会受到影响。
因此冯诺依曼提出存储程序概念。
存储程序:是指将指令以二进制代码的形式事先输入计算的主存储器,然后按其在存储器种的首地址执行程序的第一条指令,以后就按该程序的规定顺序执行其它指令,直至程序执行结束。
冯诺依曼机的结构:
在计算机系统中,软件和硬件在逻辑上是等效的。
Eg:对于乘法运算,可以设计一个专门的硬件电路来实现乘法运算,当然也可以用软件的方式,执行多次加法运算来实现。
冯·诺依曼机的特点:
- 计算机有五大部件组成;
- 指令和数据以同等地位存于存储器,可按地址寻访;
- 指令和数据用二进制表示;
- 指令由操作码和地址码组成;
- 存储程序;
- 以运算器为中心(输入/输出设备与存储器之间的数据传送通过运算器完成)。
冯诺依曼机是以运算器为中心,就意味着数据在存储之前,还需要先经由运算器,这就优点影响效率,所以现在计算机在此基础上进行了优化。
现在计算机:以存储器为中心。
CPU=运算器+控制器
那将上图简化一下:
硬件:
其中存储器=主存+辅存。
知识总结:
主要讨论主机内部的三个硬件部件(控制器、存储器、运算器)它们的内部细节以及它们之间是如何协调工作的。
主存器里面用于存放数据的部件叫做——存储体。
存储体是由一系列存储元件来构成,用来存放二进制0、1。
除了存储体,主存储器中还有两个主要的寄存器:
- MAR(Memory Address Register):存储地址寄存器。
- MDR(Memory Data Register):存储数据寄存器。
【注】现在的计算机通常把MAR、MDR也集成在CPU内。
主存储器内部运行过程:
1)CPU想要从存储器中取数据:CPU会把需要的数据地址放在MAR中,接下来主存器会根据MAR接收到的地址信息取存储体里面拿出CPU想要的数据,并且把此数据写入到MDR中,最后CPU通过数据线路从MDR中取出它需要的数据。
2)CPU想要写数据到存储器:CPU首先指明需要写入数据的位置地址并放在MAR中,然后将数据放入到MDR中,然后CPU会通过控制总线告诉主存储器这次要执行的是“写操作”,存储器根据“写操作”和提供给MAR中的地址以及MDR中的数据这三个动作,就可以往存储体中写入数据了。
存储器的运行过程和菜鸟驿站的工作原理大体相同,如下所示:
现在我们再来着重看下存储体。
数据在存储体内按地址存储。存储体会被分为一个一个的存储单元。
存储单元:每个存单元存放一串二进制代码。每个地址对应一个存储单元,这个地址就是要指明在MAR中。
存储字(word):存储单元中二进制代码的组合。
存储字长:存储单元中二进制代码的位数。
存储元:即存储二进制的电子元件,每个存储元可存1bit。这里的电子元件使用电容的原理来制造的。
【重点】
- MAR位数反映存储单元的个数;
- MDR位数=存储字长。
Eg:(1)MAR=4位——>总共有2^4个存储单元;(2)MDR=16位——>每个存储单元可存放16bit,一个字(word)=16bit。
【注意】字(word) != 字节(byte);
1B=1字节;1B=1bit
我们在办宽带时,运行商那边展示的是:100Mbps,表示每秒钟可以传送100M个bit数据。而当我们使用下载器(迅雷…)下载文件是以字节B作为计量单位的,所以尽管我们从运营商哪里办的宽带是100Mbps的,但是实际下载速度只有100/8=12.5MB/s,大概就是这样。
运算器:用于实现算术运算(如:加减乘除)、逻辑运算(如:与或非)。
运算器内部由4个组件:
- ACC:累加器,用于存放操作数,或运算结果。
- MQ:乘商寄存器,在乘、除运算时,用于存放操作数或运算结果。
- X:通用的操作数寄存器,用于存放操作数。
- ALU:算数逻辑单元,通过内部复杂的电路实现算术运算、逻辑运算。
以列表格列出各个寄存器应当存放的数据:
加 减 乘 除 ACC 被加数、和 被减数、差 乘积高位 被除数、余数 MQ 乘数、乘积低位 商 X 加数 减数 被乘数 除数
控制器内部有3个组件:
- CU:控制单元,分析指令,给出控制信号;
- IR:指令寄存器,存放当前执行的指令;
- PC:程序计算器,存放下一条指令地址,有自动加1功能。
完成一条指令的过程:
- 取指令(PC);
- 分析指令(IR);
- 执行指令(CU)。
有的地方也把PC和IR两步统称为取指令,CU为执行。
我们利用C语言代码,来分析是如何执行的。
以上指令
和数据
都是存储在存储体中的。
下面分析程序运行过程:
(1)详细分析取第一个指令的过程:取数a至ACC
初:(PC)=0,指向第一条指令的存储地址
#1:PC存放的内容通过地址总线传送到MAR中。
(PC)——>MAR,导致(MAR)=0
,这意味着,控制器向主存指明了”我“接下来要访问**地址为0(MAR=0)**所对应的数据,同时控制器会通过控制总线告诉主存储器这次要进行的是”读“操作;#2:接下来主存储器根据MAR记录的地址信息取存储体里面找出0号地址所对应的二进制数据;
#3:把找到的二进制数据放到MDR;
以上两步可以表达为:
M(MAR)——>MDR,导致(MDR)=000001 0000000101
#4:MDR中的数据会通过数据总线传送到IR指令寄存器中,。
(MDR)——>IR,导致(IR)=
000001 0000000101;#5:
OP(IR)——>CU
,指令的操作码送到CU,CU分析得知,这时取数指令;#6:
Ad(IR)——>MAR
,指令的地址码送到MAR,导致(MAR)=5;#7:主存储器根据MAR指明的地址,去存储体中,找出5号单元中的数据;
#8:再存储体中找到5号数据后,把数据放到MDR中;
以上两步可以表达为:
M(MAR)——>MDR,导致(MDR)=0000000000000010=2
#9:
(MDR)——>ACC
,最后在控制单元的指挥下,MDR中的数据会传送到ACC累加寄存器中,导致(ACC)=0000000000000010
。到此为止完成了一个取数的指令,将a=2放到了ACC累加寄存器中了。
如下图:
? 取指令(#1~#4),在取完指令后PC会自动加一,这样就自然而然的指令可下一条指令。
? 分析指令(#5)
? 执行取数指令(#6~#9)
(2)详细分析取第二个指令的过程:乘b得ab,存于ACC中
上一条指令取值后PC自动+1,(PC)=1;执行后(ACC)=2。
#1:(PC)——>MAR,导致(MAR)=1。这意味着,控制器向主存指明了”我“接下来要访问**地址为1(MAR=1)**所对应的数据,同时控制器会通过控制总线告诉主存储器这次要进行的是”读“操作;
#3:M(MAR)——>MDR,导致(MDR)=000100 0000000110;
#4:(MDR)——>IR,导致(IR)=000100 0000000110;
#5:OP(IR)——>CU,指令的操作码送到CU,CU分析得知,这是乘法指令;
#6:Ad(IR)——>MAR,指令的地址码送到MAR,导致(MAR)=6;
#8:M(MAR)——>MDR,导致(MDR)=0000000000000011=3;
#9:(MDR)——>MQ,导致(MQ)=0000000000000011=3;
#10:(ACC)——>X,导致(X)=2。先把x=2放入X寄存器,便于后续和b=3相乘;
#11:(MQ)*(X)——>ACC。由ALU实现乘法运算,导致(ACC)=6,如果相乘太大,则需要MQ辅助存储(MQ寄存器中会存放想法运算结果的低位)。
至此完成了乘法指令
如下图:
? 取指令(#1~#4),同样在取指令完毕后,PC会自动+1。
? 分析指令(#5)
? 执行乘法指令(#6~#11)
(3)详细分析取第三个指令的过程:加c得ab+c,存于ACC中
上一条指令取值后(PC)=2,执行后,(ACC)=6
#1:(PC)——>MAR,导致(MAR)=3;
#3:M(MAR)——>MDR,导致(MDR)=000011 0000000111;
#4:(MDR)——>IR,导致(IR)=000011 0000000111;
#5:OP(IR)——>CU,指令的操作码送到CU,CU分析后得知,这时加法指令;
#6:Ad(IR)——>MAR,指令的地址码送到MAR,导致(MAR)=7;
#8:M(MAR)——MDR,导致(MDR)=0000000000000001=1;
#9:(MDR)——>X,导致(X)=0000000000000001=1;(ACC寄存器中存放被加数,X寄存器中存放加数);
#10:(ACC)+(X)——>ACC,导致(ACC)=7,由ALU实现加法运算。
至此为止完成第三条指令
如下:
? 取指令(#1~#4),同样取完上一个指令,PC自动+1
? 分析指令(#5)
? 执行加法指令(#6~#10)
(4)详细分析取第四个指令的过程:将ab+c,存于主存单元中
上一条指令取值后(PC)=3,执行后,(ACC)=7;
#1:(PC)——>MAR,导致(MAR)=3;
#3:M(MAR)——>MDR,导致(MDR)=000010 0000001000;
#4:(MDR)——>IR,导致(IR)=000010 0000001000;
#5:OP(IR)——>CU,指令的操作码送到CU,CU分析后得知,这时存放指令;
#6:AD(IR)——>MAR,指令的地址码送到MAR,导致(MAR)=8;
#7:(ACC)——>MDR,导致(MDR)=7;
#8:(MDR)——>地址为8的存储单元(存放在存储体中),导致y=7。
到此为止
存指令
操作完毕如下所示:
? 取指令(#1~#4),同样取完上一个指令,PC自动+1
? 分析指令(#5)
? 执行存放指令(#6~#9)
(五)详细分析取第五个指令的过程:停机
上一条指令取值后(PC)=4
#1:(PC)——>MAR,导致(MAR)=3;
#3:M(MAR)——>MDR,导致(MDR)=000110 0000000000;
#4:(MDR)——>IR,导致(IR)=000110 0000000000;
#5:OP(IP)——>CU,指令的操作码送到CU,CU分析得知,这是停机指令
至此
停机
指令执行完毕(后续利用中断机制通知操作系统种植该进程)
如下所示:
? 取指令(#1~#4)
? 分析指令(#5)
? 执行停机指令
CPU区分指令和数据的依据:指令周期的不同阶段。
冯·诺依曼机的特点:
分析了以上过程,我们就可以明白冯·诺依曼机的特点了,其中说一下第二个特点:指令和数据以同等地位存于存储器:
编译程序:将高级语言编写的源程序全部语句一次全部翻译成机器语言程序,而后在执行机器语言程序(只需翻译一次),如:C,C++,Java…
解释程序:将源程序的一条语句翻译成对应于机器语言的语句,并立即执行。紧接着在翻译下一句(每次执行都要翻译)。如:Python,JavaScript,Shell…
【注】编译、汇编、解释程序,可统称”翻译程序“。
计算机体系结构主要学习的是:如何设计硬件与软件之间的接口。
计算机组成原理主要学习的是:如何用硬件实现所定义的接口。
计算机体系结构——机器语言程序员所见到的计算机系统的属性概念性的结构与功能特性。
计算机组成原理——实现计算机体系结构所体现的属性,对程序员”透明“。
【注】此处的”透明“表示看不见。
知识总结:
MAR位数反映存储单元的个数(最多支持多少个)
MDR位数=存储字长=每个存储单元的大小
总容量=存储单元个数*存储字长bit=存储单元个数*存储字长/8byte
Eg:MAR为32位,MDR为8位,总容量=2^32*8bit=4GB。这个值是最大值。
CPU主频:CPU内数字脉冲信号振荡的频率。如下:
上图中每一个波峰代表一个数字脉冲信号,所以CPU的数字脉冲是由规律由节奏发生的。
那这脉冲信号有什么作用呢?
答:可以八脉冲信号理解为,指挥CPU内部所有的部件来一步一步工作的节奏。
CPU时钟周期:
CPU主频(时钟频率):单位为赫兹,Hz
CPU主频(时钟频率)= 1/CPU时钟周期
显然相同的两个CPU,主频越高的,运行速度越快
CPI(Clock cycle Per Instruction):执行一条指令所需的时钟周期。
不同的指令,CPI不同。甚至相同的指令,CPI也可能有变化。
执行一条指令的耗时=CPI*CPU时钟周期。
CPU执行时间(整个程序的耗时)=CPU时钟周期数/主频=(指令条数*CPI)/主频
Eg:某CPU主频为1000Hz,某程序包含100条指令,平均来看指令的CPI=3(平均每执行一个指令需要3个周期)。该程序在该CPU上执行需要多久?
答:100*3*(1/1000)=0.3s。
另一个CPU性能指标:
IPS(Instructions Per Second):每秒执行多少条指令。
IPS=主频/平均CPI。主频代表每秒钟会有多少个数字脉冲,也就是会出现多少个时钟周期。
还有一个指标:
FLOPS(Floating-point Operations Per Second):每秒执行多少次浮点运算
以上IPS会有KIPS、MIPS。
FLOPS会有KFLOPS、MFLOPS、GFLOPS、TFLOPS
【注】此处K、M、G、T为数量单位
K=千=103,M=百万=106,G=十亿=109,T=万亿=1012。同样描述CPU主频时,3GHz,G表示的也是10^9。
1)数据通路带宽:数据总线一次所能并行传送信息的位数(各硬件部件通过数据总线传输数据)。
2)吞吐量:指系统在单位时间内处理请求的数量。(这里的请求是个抽象的概念,可以说一条指令就是一个请求,或者一个完整的程序是个请求)。
它取决于信息能多快地输入内存,CPU能多快地取指令,数据能多快地从内存取出或存入,以及所得结果能多块地从内存送给一台外部设备。这些步骤中地每一步都关系到主存,因此,系统吞吐量主要取决于主存的存储周期。
3)响应时间:指从用户向计算机发送一个请求,到系统对该请求做出响应并获得它所需要的结果的等待时间。
通常包括CPU时间(运行一个程序所花费的时间)与等待时间(用于磁盘访问、存储器访问、I/O操作、操作系统开销等时间)。
系统整体的性能指标(动态测试)
**基准程序(跑分软件)**是用来测量计算机处理速度的一种实用程序,以便于被测量的计算机性能可以与运行相同程序的其它计算机性能进行比较。
其实这些基准程序它本质上就是设计好的一段程序代码,那这段程序里面会包含各种各样的指令,并且各种指令出现的频次频率是不一样的,它会根据你的电脑运行这段程序,运行它这一系列指令所需要的耗时来给定一个综合的评分。
【思考一】主频高的CPU一定比主频低的CPU快吗?
答:不一定,如两个CPU,A的主频为2GHz,平均CPI=10;B的主频1GHz,平均CPI=1。A一秒钟可以执行2GHz/10=0.2G指令,而B一秒钟可以执行1GHz/1=1G指令。
【思考二】若A、B两个CPU的平均CPI相同,那么A一定更快吗?
答:也不一定,还要看指令系统,如A不支持乘法指令,只能用多次加法实现乘法;而B支持乘法指令。
【思考三】基准程序执行得越快说明机器性能越好吗?
答:也不一定,基准程序中的语句存在频率差异,运行结果也不能完全说明问题。
比如使用的是测试显卡的基准程序,那这个基准程序里面显然对图像处理相关的指令出现的频率会很高,但如果换一种应用场景——你的计算机不适用于图像处理的,而是用于其它工作,那再使用测试显卡的基准程序测试出来的结果是不科学的。
所以也不能盲目相信跑分软件。
知识回顾: