赞
踩
利用空档期时间学习一下计算机系统基础,以前对这些知识只停留在应试层面,今天终于能详细理解一下了。参考课程为南京大学袁春风老师的计算机系统基础MOOC,参考书籍也是袁老师的教材,这是我的听课+自查资料整理后的笔记,以后再发次系列文章,我就按单独一节课的顺序发,不再按章节发,如果按章节发,字数太多,容易阅读疲劳
1946年,第1台通用电子计算机 ENIAC(Electronic Numerical Integrator And Computer)诞生
1946年,普林斯顿高等研究院(the Institute for Advance Study at Princeton,IAS )开始设计“存储程序”计算机,被称为IAS计算机(1951年才完成,并不是第一台存储程序计算机,1949年由英国剑桥大学完成的EDSAC是第一台)
在那个报告中提出的计算机结构被称为冯·诺依曼结构。
冯·诺依曼结构最重要的思想是“存储程序(Stored-program)”
早期,部件之间用分散方式相连(分散的,比如指令单独一条线,地址单独一条线)
现在,部件之间大多用总线方式相连(整合在一起)
1、计算机应由运算器、控制器、存储器、输入设备和输出设备五个基本部件组成。
2、各基本部件的功能是:
3、内部以二进制表示指令和数据。每条指令由操作码和地址码两部分组成。操作码指出操作类型,地址码指出操作数的地址。由一串指令组成程序。
4、采用“存储程序”工作方式
1、 主存储器:主存储器用来存放指令和数据,简称主存或内存(内存条上有很多芯片(颗粒));
2、 算术逻辑部件(Arithmetic Logic Unit,简称ALU):ALU是用来进行算术逻辑运算的部件,在ALU操作控制信号ALUop的控制下,ALU可以对输入端A和B进行不同的运算,得到结果F;
3、 控制部件(Control Unit,简称CU):控制部件也称控制器,它是用于自动逐条取出指令并进行译码的部件。
4、输入设备和输出设备(I/O):I/O设备用来和用户交互。
5、 通用寄存器(General Purpose Register):通用寄存器用来临时存放从主存取来的数据或运算的结果。
6、 通用寄存器组(GPRs):为了临时存放从主存取来的数据或运算的结果,还需要若干通用寄存器,组成通用寄存器组(早期就是累加器),如上图中ALU两个输入端A和B的数据来自通用寄存器。
7、 标志寄存器(Program Status Word,PSW):标志寄存器用来存放ALU运算的结果产生的标志信息,例如,结果是否为0(零标志ZF)、是否为负数(符号标志SF)等,这些标志信息需要记录在专门的标志寄存器中。
标志寄存器具体标志位及其符号含义如下(看不懂可跳过,我是学过计算机组成原理和操作系统,所以查了一些拓展资料)
缩写/中文名 | 英文全称 | 等于1时 | 等于0时 | 作用 | 使用情况 |
---|---|---|---|---|---|
CF/进位标志 | Carry Flag | 进位 | 无进位 | 进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。 | 使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。 |
PF/奇偶标志 | Parity Flag | 偶 | 奇 | 奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。 | 使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。 |
AF/辅助进位标志 | Auxiliary Carry Flag | 进位 | 无进位 | 在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:(1)、在字操作时,发生低字节向高字节进位或借位时;(2)、在字节操作时,发生低4位向高4位进位或借位时。 | \ |
ZF/零标志 | Zero Flag | 等于零 | 不等于零 | 零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。 | 在判断运算结果是否为0时,可使用此标志位。 |
SF/符号标志 | Sign Flag | 负 | 非负 | 符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。 | \ |
OF/溢出标志 | Overflow Flag | 溢出 | 未溢出 | 溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。 | \ |
缩写/中文名 | 英文全称 | 等于1时 | 等于0时 | 作用 | 使用情况 |
---|---|---|---|---|---|
TF/追踪标志 | Trap Flag | 单步执行方式 | 非单步执行方式 | 当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。 | 指令系统中没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。 |
IF/中断标志 | Interrupt Flag | CPU可以响应CPU外部的可屏蔽中断发出的中断请求 | CPU不响应CPU外部的可屏蔽中断发出的中断请求 | 中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。具体规定如下:(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。 | 中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。 |
DF/方向标志 | Direction Flag | 减少 | 增加 | 方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。 当该位置1时(DF=1),存储器地址自动减少,串操作指令为自动减量指令,即从高位到低位处理字符串;当该位置0时(DF=0),存储器地址自动增加,串操作指令为自动增量指令。 | | |
8、 指令寄存器(Instruction Register,简称IR):指令寄存器用来临时保存从主存取来的指令;
9、 程序计数器(Program Counter,简称PC):在执行当前指令过程中,自动计算出下一条指令的地址并送到PC中保存;
10、中央处理器(Central Processing Unit,简称CPU):通常把控制部件、运算部件和各类寄存器互连组成的电路称为中央处理器,简称处理器;
11、通用寄存器编号:CPU需要从通用寄存器中取数据到ALU运算,或把ALU运算的结果保存到通用寄存器中,因此,需要给每个通用寄存器编号。如上图中,4个通用寄存器编号分别为0~3;
12、主存地址:主存中每个单元也需要编号,称为主存地址单元,简称主存地址,如上图中,16个主存单元编号分别为0~15;
13、总线:CPU为了从主存取指令和存取数据,需要通过传输介质与主存相连,通常把连接不同部件进行信息传输的介质称为总线。其中,包含了用于传输地址信息、数据信息和控制信息的地址线、数据线和控制线。CPU访问主存时,需先将主存地址送到总线的地址线,将读/写命令送到总线的控制线,然后通过数据线发送或接收数据。
14、主存地址寄存器(Memory Address Register,简称MAR):CPU送到地址线的主存地址应先存放在主存地址寄存器中。
15、主存数据寄存器(Memory Data Register,简称MDR):CPU发送到或从数据线取来的信息存放在主存数据寄存器中。
P.S MDR和MAR是和总线相连的部件
P.S 地址总线(Address Bus)和控制总线(Control Bus)是单向总线,而数据总线是双向总线。
计算机是以“存储程序”的工作方式工作的。
【疑问】学到这里,我就有了一个疑问:计算机如何将最开始的程序的起始地址如何送入程序计数器PC中?是通过哪些流程进行操作的?
【chatGPT回答】将程序的起始地址送入程序计数器(Program Counter,PC)中通常是在计算机的开机自检(Power-On Self Test,POST)和引导启动(Boot)阶段完成的。 当计算机通电并开始自检时,处理器会将程序计数器 PC 初始化为一个预先设定好的值。这个预设的值通常被称为重置向量(Reset Vector)或启动向量(Boot Vector),是一个存储器地址,指向存储器中程序代码的入口点或者操作系统的引导程序。处理器执行完初始指令后,程序控制权就被转移到了存储器中的程序代码或操作系统引导程序处。
在引导启动阶段,操作系统的引导程序会被加载到内存的一个已知地址,并将该地址值写入到程序计数器中作为初始值。当引导程序开始执行时,PC中存储的地址就是程序的起始地址,操作系统就能够开始执行该程序。
总之,将程序的起始地址送入程序计数器 PC中是由启动过程的代码实现的,在不同的情况下,实现方式和流程可能会有所不同,但通常都会涉及到将某个地址从内存中加载到 PC 中的过程。
我将执行程序的过程标注在现代计算机模型图上(图画的如果不准确,欢迎指出)
冯诺依曼结构计算机的功能通过执行程序实现,程序由指令组成,程序被启动后,计算机能自动取出一条一条指令执行,在执行过程中无需人的干预。
1、原子操作:所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch(切换到另一个线程)。
2、指令(instruction):指令是用0和1表示的一串0/1序列,用来指示CPU完成一个特定的原子操作,它存在存储器中。
3、数据:数据和指令一样都存在存储器中,形式上没有差别,都是0/1序列。
4、取数指令(load):取数指令的作用是从主存单元中取出数据存放到通用寄存器中。
5、存数指令(store):存数指令的作用是将通用寄存器的内容写入主存单元。
6、加法指令(add):加法指令的作用是将两个通用寄存器相加后送入结果寄存器。
7、传送指令(mov):传送指令将一个通用寄存器的内容送到另一个通用寄存器。
指令通常被划分为若干个字段,有操作码、地址码等字段。
8、操作码字段:操作码字段指出指令的操作类型,如取数、存数、加、减、传送、跳转等。
9、地址码字段:地址码字段指出指令所处理的操作数的地址,如寄存器编号、主存单元编号等。
10、操作数:操作数是运算符作用于的实体,是表达式中的一个组成部分,它规定了指令中进行数字运算的量。
11、立即数:指令要操作的数据以常量的形式出现在指令中,称为立即数,它只能作为源操作数。
12、源操作数:在应用指令中,内容不随指令执行而变化的操作数为源操作数。
13、目的操作数:在应用指令中,内容随执行指令而改变的操作数为目的操作数。
14、双操作数:双操作数又称为源操作数(source)和目的操作数(destination)。
【提问】请用通俗的语言解释何为操作数。
【chatGPT回答】在计算机的世界中,指令被设计成由两个部分组成:操作码和操作数。操作码指示计算机执行何种操作,如加、减、乘等;而操作数则是指这些操作所需要的数据。具体来说,操作数是指被计算机指令操作的数据,是指令所要操作的对象。
举个例子,如果要进行加法计算,那么这个加法计算的操作码就是“加”这个指令。而这个操作指令所涉及的两个数,就是操作数。例如:如果我们想要对数字1和数字2进行加法计算,那么这两个数字就是操作数,指令指示操作数相加。
在计算机中,操作数通常保存在寄存器中或者内存中。在指令执行时,指令会告诉计算机去哪里寻找这些操作数,并将它们读取到指定的寄存器中,然后进行操作。操作数可以是数字、字符、地址、内存中的位置等等,具体的形式取决于指令的要求。
总之,操作数就是计算机指令所要操作的数据,是指令中需要的数据部分,它可以保存在寄存器或内存中,并且在执行指令时被读取和处理。
一段指令中需要给出的信息:
存储地址的描述与操作数的数据结构(可能数组等)有关
15、机器字长(Machine word length):机器字长是指计算机进行一次整数运算所能处理的二进制数据的位数(整数运算即定点整数运算)。因为计算机中数的表示有定点数和浮点数之分,定点数又有定点整数和定点小数之分,这里所说的整数运算即定点整数运算。机器字长也就是运算器进行定点数运算的字长,通常也是CPU内部数据通道的宽度。
假定机器字长8位,用刚才的示意图:
4个通用寄存器r0~r3,编号为0~3,16个主存单元,编号0~15,每个主存单元和CPU中的ALU,通用寄存器,IR,MDR宽度都是8位,PC和MAR的宽度都是4位,地址总线4位,数据总线和若干控制线(包括读/写命令线)共8位,机器字长8位,每条指令有8位,有R型和M型,如图所示:
R型指令的op为0000时为传送操作(MOV),为0001时为加操作(ADD);M型指令的op为1110时为取数操作(load),为1111时为存数操作(store).
比如:
模仿书中的例子,我写了一个z = x + y,x存在主存15号单元(即二进制1111),y存在主存5号单元(即二进制0101)中,结果z存放在主存10号单元(即二进制1010)中,则相应程序在主存单元中的初始内容如下表所示。
主存地址(二进制/十进制) | 主存单元内容 | 内容说明, I i I_{i} Ii表示第i条指令 | 指令的符号表示 |
---|---|---|---|
0/0000 | 1110 0101 | I 1 I_{1} I1:R[0] ← M[0101];op=1110:取数操作,从地址0101(十进制5)中读取数据送入0号寄存器 | load r0 , 5# |
1/0001 | 0000 0100 | I 2 I_{2} I2:R[1] ← R[0];op=0000:传送操作,将0号寄存器的值传送到1号寄存器中 | mov r1 , r0 |
2/0010 | 1110 1111 | I 3 I_{3} I3:R[1] ← M[1111];op=1110:取数操作,从地址1111(十进制15)中读取数据送入0号寄存器 | load r0 , 15# |
3/0011 | 0001 0001 | I 4 I_{4} I4:R[0] ← R[0] + R[1];op=0001:加操作,将0号寄存器和1号寄存器的值相加并将加和结果送入R[0] | add r0, r1 |
4/0100 | 1111 1010 | I 5 I_{5} I5:M[1010] ← R[0];op=1111:存数操作,将0号寄存器的值存入主存地址为1010的内存单元 | store 10# , r0 |
5/0101 | 1111 1111 | 操作数 x x x,值为-1(计算机用补码存储数据,补码为1111 1111,补码的补码即为原码,补码除符号位先取反为1000 0000,再加1,即为1000 0001,则十进制为-1) | |
… | … | … | … |
10/1010 | 0000 0000 | 运算结果 z z z,初始值为0 | |
… | … | … | … |
15/1111 | 0000 0010 | 操作数 y y y,正数的原码、反码、补码一致,十进制值为2 |
补码相加的结果为:1111 1111 + 0000 0010 = 0000 0001 ,正数的原码、反码、补码一致,结果为-1+2= 1,关于原码、反码、补码的知识可以等到W2,也可以自己先查一查,我这里举-1的例子是为了练习
对于上述程序,程序首地址(即指令 I 1 I_{1} I1所在地址)为0,最开始PC为0000,每条指令如下表所示:
I 1 I_{1} I1:1110 0101 | I 2 I_{2} I2:0000 0100 | I 3 I_{3} I3:1110 1111 | I 4 I_{4} I4:0001 0001 | I 5 I_{5} I5:1111 1010 | |
---|---|---|---|---|---|
取指令 | IR←M[0000] | IR←M[0001] | IR←M[0010] | IR←M[0011] | IR←M[0100] |
指令译码 | op=1110,取数 | op=0000,传送 | op=1110,取数 | op=0001,加 | op=1111,存数 |
PC增量 | PC←0000 + 1 | PC←0001 + 1 | PC←0010 + 1 | PC←0011 + 1 | PC←0100 + 1 |
取数并执行 | MDR←M[0101] | A←R[0]、mov | MDR←M[1111] | A←R[0]、B←R[1]、add | MDR←R[0] |
送结果 | R[0]←MDR | R[1]←F | R[0]←MDR | R[0]←F | M[1010]←MDR |
执行结果 | R[0]=-1 | R[1]–1 | R[0]=2 | R[0]=-1+2=1 | M[10] = 1 |
指令执行各阶段都包含若干个微操作,微操作需要相应的控制信号(control signal)进行控制。
比如:
【提问】请用通俗的语言解释计算机CPU执行指令时的微操作是什么?微操作需要相应的控制信号是什么?
【chatGPT回答】计算机CPU执行指令时,会按照指令中所包含的操作码,依次执行一些基本的微操作。微操作也称为微指令,是指一些基本的、原子的操作操作,用于实现指令中的各种功能。
例如,在执行加法指令时,CPU内部会进行以下一些基本的微操作:从指定寄存器中读取操作数A和操作数B;将寄存器A和寄存器B中的数据相加,并将结果写入一个结果寄存器中;从结果寄存器中读取结果,将其写回指定的寄存器中等等。这些微操作的具体实现需要依靠相应的控制信号来实现。
控制信号是用于控制CPU内部各个部件工作的信号,主要包括时钟信号、使能信号、数据传输信号等等。当CPU需要执行指令时,控制信号会根据指令操作码的不同,将微操作分配到相应的部件上,以实现指令功能。
以执行加法指令为例,执行该指令需要的控制信号包括:时钟信号、读取A寄存器的使能信号、读取B寄存器的使能信号、ALU加法器的使能信号、从ALU结果寄存器中读取结果使能信号、将结果写回到指定寄存器的使能信号等等。这些控制信号都是CPU内部预定义好的,并可以通过指令解码器来根据指令操作码的不同进行适当的组合。
总之,微操作是如何实现指令功能的基本操作,需要相应的控制信号的支持。这些控制信号通过指令解码器来根据指令操作码的不同进行适当的组合,从而实现指令功能。
CPU中所有微操作都由时钟信号进行定时,时钟信号(clock signal)的宽度为一个时钟周期(clock cycle),一条指令包含一个或多个时钟周期。
【提问】请用通俗的语言解释计算机CPU的所有微操作都由时钟信号进行定时,那么时钟信号是什么?时钟周期是什么?
【chatGPT回答】时钟信号是计算机中一个非常重要的信号,它决定着计算机硬件中的各个部件何时可以进行数据传输和运算。时钟信号是CPU中的一个定时信号,用来控制CPU内部的各种操作,例如说,CPU通过时钟信号周期性的激活各种微操作,使得CPU能够按照指令操作码的要求,实现各种计算任务。
时钟周期是指一次完整的时钟信号所包含的时间。在时钟周期中,CPU内部完成一组特定的微操作,并等待下一个时钟周期到来从而继续进行下一组微操作。通常,计算机时钟频率是固定的,因此时钟周期的长度是稳定的,可以通过时钟频率计算得出。
举个例子,如果计算机的时钟频率是4GHz,那么每秒钟时钟信号会发出4亿次,每个时钟周期的长度就是1/4亿秒,约等于0.025纳秒。CPU在一个完整的时钟周期内可以完成的微操作是固定的,并且需要在下一个时钟周期发送完整的指令后才能开始下一组微操作。因此,在计算机内部,时钟信号对于指令的执行时间和CPU的性能起着至关重要的作用。
总而言之,时钟信号是控制CPU内部基本微操作的定时信号,时钟周期是时钟信号中的一个完整周期。计算机内部的各种操作都需要遵循时钟信号的定时规律,以实现指令的执行和CPU的各项功能。
现代通用计算机都采用“存储程序”工作方式,需要计算机完成的任何任务都应先表示为一个程序。首先,应将应用问题(任务)转化为算法(algorithm)描述,其次,将算法转换为用编程语言描述的程序,程序设计语言(programming language)与自然语言不同,它有严格的执行顺序,不存在二义性(语言的二义性,就是指由于某句话的语义太多,让人很难准确地分辨该话语的真正意思,从而导致了二义性的出现。编程语言类似,让机器无法分辨真正的含义的语句),能够唯一地确定计算机执行指令的顺序。
1、机器语言:使用特定计算机规定的指令格式而形成的0/1序列称为机器语言。
2、机器语言程序:计算机能理解和执行的程序称为机器代码或机器语言程序。
3、机器指令:机器语言程序的每条指令都由0和1组成,称为机器指令。
用机器语言编写程序,并记录在纸带或卡片上,穿孔表示0,未穿孔表示1,输入:按钮、开关;输出:指示灯等。
假设:0010-jc
0:0101 0110 // 0101是加法,0110是地址,把累加器的内容和0110地址对应的主存单元的内容相加,加出来的结果继续放入累加器
1:0010 0100 //0010,JC指令,如果相加的结果有进位,则跳转0100地址对应的主存单元,取执行0100(十进制4)号主存单元中的指令
2:…
3:…
4:0110 0111
5:…
6:…
【缺点】若在第4条指令前加入指令,则需重新计算地址码(如jxx的目标地址),然后重新打孔。不灵活!书写、阅读困难!
【提问】解释一下汇编语言jc指令
【chatGPT回答】汇编语言中的JC指令是跳转指令之一,用于根据条件是否成立来执行跳转操作。JC指令的功能是:如果最近一次运算结果产生了进位,那么就按指定的跳转地址跳转到对应的指令地址。如果进位标志位为1,则跳转;如果进位标志位为0,则继续往下执行。
具体来说,JC指令是根据CPU中的标志寄存器(也叫标志位、标志寄存器)中的进位标志位(Carry Flag)判断是否跳转。如果进位标志位为1,则表示最近一次运算结果产生了进位,那么CPU就会按照指定的跳转地址跳转到对应的指令地址执行。如果进位标志位为0,则表示最近一次运算结果没有进位,那么CPU就会继续执行下一条指令。
JC指令在实际应用中比较广泛,通常用于实现条件分支控制结构。例如,在计算一个大于等于0的整数n的阶乘时,可以使用JC指令来实现循环控制结构,当某一次循环产生进位时,就退出循环,并输出结果。
汇编语言中的JC指令的语法如下:JC label
其中,label是程序中的一个标记,代表一个跳转目标地址。当进位标志位为1时,CPU会跳转到这个标记所代表的指令地址。
1、助记符(mnemonic):助记符是便于人们记忆、并能描述指令功能和指令操作数的符号,助记符是表明指令功能的英语单词或其缩写。
2、标号:用来标注指令的地址,一般由 1~8 个字母和数字组合而成,但必须以字母开头,以冒号“:”结束。
3、汇编语言:最早人们采用机器语言编写程序。机器语言程序的可读性很差,也不易记忆,给程序员的编写和阅读带来极大的困难。因此,人们引入了一种机器语言的符号表示语言,用简短的英文符号和机器指令建立对应关系,以方便程序员编写和阅读程序,这种语言称为汇编语言,汇编语言用助记符表示操作码,用标号表示位置。
【比如:1110 0110对应汇编指令load r0 , 6#】
【注】(1)add助记符,加操作,(2)jc助记符,跳转操作,(3)sub助记符,减操作。
【汇编语言的优点】
不过,这带来新的问题,是什么呢?人容易了,可机器不认识这些指令了!所以用汇编语言写程序转换为机器语言写的程序,用汇编程序转换。
1、汇编指令:机器指令对应的符号即用助记符和标号来表示的指令(与机器指令一一对应)称为汇编指令。汇编语言(源)程序由汇编指令构成。
2、机器级语言:汇编语言和机器语言都属于低级语言,它们都是面向及其结构的语言(移植难度大,不同平台的计算机上的汇编语言不同),它们统称为机器级语言。
指令的结构:
想象用汇编语言编写复杂程序是怎样的情形?
(例如,用汇编语言实现排序(sort)、矩阵相乘)
需要描述的细节太多了!程序会很长很长!而且在不同结构的机器上就不能运行!
结论:用汇编语言比机器语言好,但是,还是很麻烦!
对于以下结构的机器,你能设计出几条指令吗?
Ld M#,R# (将存储单元内容装入寄存器)
St R#,M# (将寄存器内容装入存储单元)
Add R#,M# (类似的还有Sub,Mul等;操作数还可“R#,R#”等)
Jxx M# (若满足条件,则转移到另一处执行)
……
因为每条指令的功能非常简单,所以使用机器级语言描述程序功能时,需描述的细节很多,不仅程序设计工作效率很低,而且同一个程序不能在不同机器上运行。为此,程序员多采用高级程序设计语言编写程序。
1、高级程序设计语言(high level programming language):高级程序设计语言简称高级编程语言,它是指面向算法设计的、较接近于日常英语书面语言的程序设计语言,如Python、C/C++、Java等。它与具体的机器结构无关,可读性比机器级语言好,描述能力更强,一条语句可对应几条或几十条指令。
2、翻译程序(translator):将高级编程语言程序转换成机器语言程序的软件统称为翻译程序。
3、源语言和源程序:被翻译的语言和程序分别称为源语言和源程序。
4、目标语言和目标程序:翻译生成的语言和程序分别称为目标语言和目标程序。
翻译程序由以下三类:
5、MIPS指令集系统结构(MIPS架构):MIPS是指在20世纪80年代初由斯坦福大学Hennessy教授领导的研究小组研制出来的一种RISC处理器,应用广泛。
第一条指令:1000 1100 0100 1111 0000 0000 0000 0000,这是一条MIPS指令集系统结构中的指令,其中,高6位“100011”为操作码,表示取数操作,随后5位“00010”为通用寄存器编号2,再后面5位“01111”为另一个通用寄存器编号15,最后16位为立即数0。
任何高级语言程序最终通过执行若干条指令来完成。
有如下C语言程序"hello.c"的代码(C语言是编译型语言):
#include <stdio.h>
int main()
{
printf("hello world!\n");
return 0;
}
功能:输出"hello world!"
(1)通过程序编辑软件得到hello.c源程序文件,hello.c源程序文件在计算机以ASCII字符方式存放,如下图所示。
(2)将hello.c源程序文件进行预处理、编译、汇编和链接,最终生成可执行目标文件,可用GCC编译驱动程序进行处理,命令如下:
> gcc -o hello hello.c
最前面的>为shell命令行解释器(在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(command interpreter,命令解析器)。它类似于DOS下的COMMAND.COM和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。)的命令行提示符,gcc为GCC编译驱动程序名,-o表示后面为输出文件名,hello.c 为要处理的源程序。
以下是GCC+Linux平台中的处理过程图:
Hello程序的数据流动过程:
$是指Linux终端提示用户输入命令的提示符
$ ./hello 是执行hello程序
然后屏幕输出了hello world
在上述过程中,涉及外部设备的操作,这些底层硬件是不能由用户程序直接访问的,需要依靠操作系统内核服务例程的支持,比如,用户程序需要调用内核的read系统调用服务例程读取磁盘文件,或调用内核的write系统调用服务例程把字符串:写“到显示器等。
计算机的硬件可以分为主机和外设两部分
Python 程序在执行过程中同样需要编译(Compile),编译产生的结果称之为字节码,而后由 Python 虚拟机逐行地执行这些字节码。所以,Python 解释器由两部分组成:编译器和虚拟机。
其具体流程如下,源程序文件.py送入解释器后
最早的程序开发很简单
【提问】用通俗的语言解释一下何为CMOS电路,何为NMOS电路
【chatGPT回答】CMOS是一种半导体电路技术,其中由p型和n型晶体管(Metal Oxide Semiconductor Field Effect Transistor, MOSFET)组成以实现和/或逻辑门电路。其中,CMOS指代的是能量低廉,仅需极少数量的电源开销,且在不断增长的电子电路中极度广泛使用的Complementary MOS(互补MOS)电路技术。CMOS技术具有高的抗干扰性、低功耗及高可靠性。
CMOS电路采用两种类型的晶体管:p型MOS(PMOS)和n型MOS(NMOS)。在PMOS中,当输入为“0”时,输出为“1”,而在NMOS中,当输入为“1”时,输出为“0”。因此,在CMOS电路中,PMOS和NMOS通常被同时使用,以形成互补功能,产生极低的功耗和高的速度。
NMOS电路(N-type MOS)是指使用n型MOS场效应管来实现电路的技术。它在数字和模拟电路中都广泛应用,因为它可以轻松地在单个晶体管中实现所有逻辑,且易于制造。NMOS电路的特点是能够提供一个低电平的高输出电流,但会产生静态功耗(quiescent power)。
总之,CMOS电路,作为一种半导体集成电路技术,由PMOS和NMOS晶体管组成以实现和/或逻辑门电路。NMOS电路则是指使用n型MOS场效应管来实现电路的技术。两者在数字和模拟电路中都广泛应用,因为它们能够提供极低的功耗以及高的速度和可靠性。
总而言之,程序执行结果不仅取决于算法、程序编写而且还取决于语言处理系统、操作系统、ISA、微体系结构
高级编程语言的翻译程序将高级语言源程序转换为机器级目标代码,或者转换为机器代码并直接执行,这个过程需要完成多个步骤,包括词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成和目标代码优化等。整个过程可划分为前端和后端两个阶段。(这里说的前端和后端不是web开发的前端和后端)
在ISA层之下,处理器设计时需要根据ISA规范来设计相应的硬件接口供操作系统和应用程序使用,不符合ISA规范的处理器设计,将无法支撑操作系统和应用程序的正确运行。计算机系统中的所有行为都是由各种手册确定的,计算机系统也是按照手册造出来的。因此,如果想要了解程序的确切行为,最好的方法就是查手册。
C语言标准手册网址(国内访问可能不通畅):https://www.open-std.org/JTC1/SC22/WG14/www/docs/n1124.pdf
计算机系统所完成的所有任务都是通过执行程序所包含的指令来实现。计算机系统由硬件和软件两部分组成。
根据软件的用途,一般将软件分成系统软件和应用软件两大类
按照计算机上完成任务的不同,可以把实用计算机的用户分成以下四类:最终用户、系统管理员、应用程序员和系统程序员(语言处理系统建立在操作系统之上)。
自顶向下有:
ISA处于软件和硬件的交界面(接口),ISA是对硬件
的抽象,所有软件功能都建立在ISA之上,ISA分层如下:
ISA指Instruction Set Architecture,即指令集体系结构,有时简称为指令系统
ISA是一种规约(Specification),它规定了如何使用硬件即ISA规定了:
【提问】用通俗的语言解释一下何为大端模式和小端模式,并举出容易理解的简单的例子。
【chatGPT回答】大端模式和小端模式是计算机内部存储数据时的两种不同方式。这两种模式主要区别在于数据的存储顺序是从高位到低位还是从低位到高位的问题。其中,大端模式也被称为网络字节序,而小端模式则被称为主机字节序。
在大端模式下,数据的高位字节存储在内存的低地址处,低位字节存储在高地址处。而在小端模式下,数据的低位字节存储在内存的低地址处,高位字节存储在高地址处。举个例子来说,假设我们要存储二进制数10101110到内存中,那么这两种模式对于存储顺序的不同表现如下:
大端模式的存储顺序为:1010 1110
小端模式的存储顺序为:1110 1010
可以看到,在大端模式下,高位字节1010存储在了内存的低地址处,而在小端模式下,低位字节1110存储在了内存的低地址处。在实际应用中,这种模式的区别主要体现在网络通信和硬件设备之间的数据交换中。
简单来说,大端模式和小端模式是计算机在处理数据时,通过不同的方式进行存储的模式。大端模式是高位字节在内存低地址处,而小端模式则是低位字节在内存低地址处。因此,在同一数据的两种模式下存储在内存中的字节序列是不同的。
【提问】用通俗的语言介绍一下何为寻址方式。
【chatGPT回答】寻址方式是计算机中用于指定操作数存储位置的方式。在执行指令之前,CPU需要将操作数从内存中读出来,然后进行操作。寻址方式就是为寻找内存中的操作数提供了一种规则和方法。
常见的寻址方式包括:立即寻址、直接寻址、间接寻址、寄存器寻址、寄存器间接寻址、相对寻址等。不同的寻址方式对应着不同的指令格式和对内存的访问方式。
举个例子来说明,假设现在需要对内存中的两个数进行加法运算,寻址方式可以解决如何告诉处理器两个操作数的位置。一个利用直接寻址的加法指令,需要提供一个内存地址作为操作数的存储位置。另一个利用立即寻址的加法指令,需要提供一个值,作为直接操作数使用。一些采用寄存器寻址的指令将使用寄存器中的值,而依据相对寻址方式计算操作数的地址,并把它加载到某个寄存器中。
总之,寻址方式是一种规则和方法,用于指定操作数的存储位置,常用的寻址方式包括立即寻址、直接寻址、间接寻址、寄存器寻址、寄存器间接寻址、相对寻址等。选择合适的寻址方式,可以提高计算机程序的执行速度和效率。
【提问】用通俗的语言解释一下何为条件码,什么是条件码定义。
【chatGPT回答】条件码是由CPU在执行运算过程中计算得到的一组标志位,用来保存运算结果是否为零、是否小于零、是否发生进位等信息。也被称作标志寄存器或者状态寄存器。这些标志位可以用来判断运算结果的正负和是否为零,从而控制处理器的分支和条件执行的流程。
一个典型的条件码包括零标志位(ZF)、进位标志位(CF)、符号标志位(SF)、调整位(AF)和溢出标志位(OF)。其中,ZF和SF分别表示运算结果是否为零和是否为负数。如果运算结果为零,ZF标志位就被设置为1,否则为0;对于负数,SF标志位就被设置为1,否则为0。而CF则表示是否发生了进位,AF表示较低的四位中是否发生了进位。OF用来表示是否溢出。
这些标志位的设置是由CPU在执行指令时控制的,通过这些标志位,CPU可以根据结果判断是否需要进一步进行计算或者执行其他操作。
总之,条件码是CPU中的一组标志位,用来保存运算结果是否为零、是否小于零、是否发生进位等信息。这些标志位用来判断运算结果的正负和是否为零,以控制流程的分支和条件执行。控制这些标志位的设置,可以帮助计算机执行正确的操作,提高程序的性能和准确性。
ISA在通用计算机系统中是必不可少的一个抽象层,没有它,软件无法使用计算机硬件;没有它,一台计算机不能称为“通用计算机”.(用指令实现各种各样的功能,这个“各种各样”即“通用”二字的含义)
不同ISA规定的指令集不同,如,IA-32、MIPS、ARM等,计算机组成必须能够实现ISA规定的功能,如提供GPR、标志、运算电路等,同一种ISA可以有不同的计算机组成,如乘法指令可用ALU(用若干次加法实现乘法)或乘法器实现,所以ISA是计算机组成的抽象。
不同应用场合下,计算机用户所关心的性能是不同的。
操作系统在对处理器进行调度时,一段时间内往往会让多个程序(更准确地说是进程)轮流使用处理器。
在对CPU时间进行计算时需要用到一下几个重要的概念和指标:
计算机的性能可以看成是用户CPU时间的倒数,计算机M1的速度是计算机M2的速度的n倍,也就是说,在M2上执行程序的时间是在M1上指向时间的n倍。
对教材例1.1、例1.2的详细说明:
【例1.1】假设某个频繁使用的程序Р在机器M1上运行需要10秒,M1 的时钟频率为2GHz。设计人员想开发一台与M1具有相同ISA的新机器M2。采用新技术可使M2的时钟频率增加,但同时也会使CPI增加。假定程序Р在M2上的时钟周期数是在M1上的1.5倍,则M2的时钟频率至少达到多少才能使程序P在M2上的运行时间缩短为6秒?
【解】某个频繁使用的程序Р在机器M1上运行需要10秒,即该程序在M1上的用户CPU时间为10s,所以:
M
1
的程序总时钟周期数
=
M
1
的用户
C
P
U
时间
×
M
1
的时钟频率
=
10
s
×
2
G
h
z
=
10
s
×
2
×
1
0
9
h
z
=
20
×
1
0
9
h
z
=
20
G
M1的程序总时钟周期数=M1的用户CPU时间\times M1的时钟频率= 10s \times 2Ghz=10s\times 2 \times10^9hz=20 \times 10^9 hz=20G
M1的程序总时钟周期数=M1的用户CPU时间×M1的时钟频率=10s×2Ghz=10s×2×109hz=20×109hz=20G(Hz是时间的倒数)
由于Р在M2上的时钟周期数是在M1上的1.5倍
则
M
2
的程序总时钟周期数
=
1.5
×
20
G
=
30
G
M2的程序总时钟周期数=1.5\times 20G=30G
M2的程序总时钟周期数=1.5×20G=30G
若程序P在M2上的运行时间缩短为6秒,即程序P在M2上的用户CPU时间为6s,则:
M
2
的时钟频率
=
M
2
的程序总时钟周期数
M
2
的用户
C
P
U
时间
=
30
G
6
s
=
30
×
1
0
9
6
s
=
5
G
H
z
M2的时钟频率=\frac{M2的程序总时钟周期数}{M2的用户CPU时间}=\frac{30G}{6s}=\frac{30\times10^9}{6s}=5GHz
M2的时钟频率=M2的用户CPU时间M2的程序总时钟周期数=6s30G=6s30×109=5GHz
所以M2的时钟频率至少达到5GHz才能使程序P在M2上的运行时间缩短为6秒.
【结论】M2的时钟频率是M1的2.5倍,但M2的速度却只是M1的1.67倍,提高时钟频率不能保证CPU执行程序的速度有相同倍数的提高。
【例1.2】假设计算机M的指令集中包含A、B、C三类指令,其CPI分别为1、2、4。某个程序P在M上被编译成两个不同的目标代码序列P1和P2,P1所含A、B、C三类指令的条数分别为8、2、2,P2所含A、B、C三类指令的条数分别为2、5、3。请问:哪个代码序列总指令条数少?哪个执行速度快?它们的CPI分别是多少?
【解】(1)
P
1
所含指令条数
=
8
+
2
+
2
=
12
P1所含指令条数=8+2+2=12
P1所含指令条数=8+2+2=12,
P
2
所含指令条数
=
2
+
5
+
3
=
10
P2所含指令条数=2+5+3=10
P2所含指令条数=2+5+3=10,所以目标代码序列P2的指令条数少。
(2)根据公式
如果已知程序中有n种不同类型的指令,第i种指令的条数和CPI分别为 C i C_{i} Ci和 C P I i CPI_{i} CPIi,则 程序总时钟周期数 = ∑ i = 1 n ( C P I i × C i ) 程序总时钟周期数=\sum\limits_{i=1}^{n}(CPI_{i}\times C_{i}) 程序总时钟周期数=i=1∑n(CPIi×Ci)
则有:
P
1
的总时钟周期数
=
∑
i
=
1
3
(
C
P
I
i
×
C
i
)
=
1
×
8
+
2
×
2
+
4
×
2
=
20
,
(
C
1
=
P
1
(
A
)
,
C
2
=
P
1
(
B
)
,
C
3
=
P
1
(
C
)
)
P1的总时钟周期数=\sum\limits_{i=1}^{3}(CPI_{i}\times C_{i})=1\times 8+2\times 2+4\times 2=20, (C_{1}=P1(A),C_{2}=P1(B),C_{3}=P1(C))
P1的总时钟周期数=i=1∑3(CPIi×Ci)=1×8+2×2+4×2=20,(C1=P1(A),C2=P1(B),C3=P1(C))
P
2
的总时钟周期数
=
∑
i
=
1
3
(
C
P
I
i
×
C
i
)
=
1
×
2
+
2
×
5
+
4
×
3
=
24
,
(
C
1
=
P
2
(
A
)
,
C
2
=
P
2
(
B
)
,
C
3
=
P
2
(
C
)
)
P2的总时钟周期数=\sum\limits_{i=1}^{3}(CPI_{i}\times C_{i})=1\times 2+2\times 5+4\times 3=24, (C_{1}=P2(A),C_{2}=P2(B),C_{3}=P2(C))
P2的总时钟周期数=i=1∑3(CPIi×Ci)=1×2+2×5+4×3=24,(C1=P2(A),C2=P2(B),C3=P2(C))
P1与P2在同一台机器上运行,所以时钟周期一样,故总时钟周期数少的代码序列所用时间短、执行速度快,所以,P1比P2快
(3)根据公式
程序的综合CPI也可由以下公式求得,其中, F i F_{i} Fi表示第i种指令在程序中所占的比例。 C P I = ∑ i = 1 n ( C P I i × F i ) = 程序总时钟周期数 程序总指令条数 CPI=\sum\limits_{i=1}^{n}(CPI_{i}\times F_{i})=\frac{程序总时钟周期数}{程序总指令条数} CPI=i=1∑n(CPIi×Fi)=程序总指令条数程序总时钟周期数
下面P1的CPI按第一个公式算,P2的CPI按第二个公式算
由于P1的A、B、C三类指令的条数分别为8、2、2,则A类指令在程序中所占比例为
F
1
=
8
8
+
2
+
2
=
2
3
F_{1}=\frac{8}{8+2+2}=\frac{2}{3}
F1=8+2+28=32,B类指令在程序中所占比例为
F
2
=
2
8
+
2
+
2
=
1
6
F_{2}=\frac{2}{8+2+2}=\frac{1}{6}
F2=8+2+22=61,C类指令在程序中所占比例为
F
3
=
2
8
+
2
+
2
=
1
6
F_{3}=\frac{2}{8+2+2}=\frac{1}{6}
F3=8+2+22=61
P
1
的
C
P
I
=
∑
i
=
1
3
(
C
P
I
i
×
F
i
)
=
1
×
2
3
+
2
×
1
6
+
4
×
1
6
=
10
6
≈
1.67
P1的CPI=\sum\limits_{i=1}^{3}(CPI_{i}\times F_{i})=1\times\frac{2}{3}+2\times\frac{1}{6}+4\times\frac{1}{6}=\frac{10}{6}\approx1.67
P1的CPI=i=1∑3(CPIi×Fi)=1×32+2×61+4×61=610≈1.67
P
2
的
C
P
I
=
P
2
的总时钟周期数
P
2
的总指令条数
=
24
2
+
5
+
3
=
2.4
P2的CPI=\frac{P2的总时钟周期数}{P2的总指令条数}=\frac{24}{2+5+3}=2.4
P2的CPI=P2的总指令条数P2的总时钟周期数=2+5+324=2.4
【结论】指令条数少并不能代表执行时间短,时钟频率高也不说明执行速度快,要综合考虑多个因素来评价计算机的性能。
对教材的例1.3进行详细说明:
【例1.3】例1.3假定某程序Р编译后生成的目标代码由A、B、C、D四类指令组成,它们在程序中所占的比例分别为43% 、21%、12% 、24%,已知它们的CPI分别为1、2、2、2。现重新对程序Р进行编译优化,生成的新目标代码中A类指令条数减少了50%,其他类指令的条数没有变。请回答下列问题。
(1)编译优化前后程序的CPI各是多少?
(2)假定程序在一台主频为50MHz的计算机上运行,则优化前后的 MIPS各是多少?
【解】(1)
由于生成的新目标代码中A类指令条数减少了50%,则A类指令现在所占比例为
43
%
2
=
21.5
%
\frac{43\%}{2}=21.5\%
243%=21.5%,重新计算A、B、C、D四类指令占比为:
A
类指令所占比例
=
21.5
%
21.5
%
+
21
%
+
12
%
+
24
%
≈
27
%
A类指令所占比例=\frac{21.5\%}{21.5\%+21\%+12\%+24\%}\approx27\%
A类指令所占比例=21.5%+21%+12%+24%21.5%≈27%
B
类指令所占比例
=
21
%
21.5
%
+
21
%
+
12
%
+
24
%
≈
27
%
B类指令所占比例=\frac{21\%}{21.5\%+21\%+12\%+24\%}\approx27\%
B类指令所占比例=21.5%+21%+12%+24%21%≈27%
C
类指令所占比例
=
12
%
21.5
%
+
21
%
+
12
%
+
24
%
≈
15
%
C类指令所占比例=\frac{12\%}{21.5\%+21\%+12\%+24\%}\approx15\%
C类指令所占比例=21.5%+21%+12%+24%12%≈15%
C
类指令所占比例
=
24
%
21.5
%
+
21
%
+
12
%
+
24
%
≈
31
%
C类指令所占比例=\frac{24\%}{21.5\%+21\%+12\%+24\%}\approx31\%
C类指令所占比例=21.5%+21%+12%+24%24%≈31%
根据公式
程序的综合CPI也可由以下公式求得,其中, F i F_{i} Fi表示第i种指令在程序中所占的比例。 C P I = ∑ i = 1 n ( C P I i × F i ) = 程序总时钟周期数 程序总指令条数 CPI=\sum\limits_{i=1}^{n}(CPI_{i}\times F_{i})=\frac{程序总时钟周期数}{程序总指令条数} CPI=i=1∑n(CPIi×Fi)=程序总指令条数程序总时钟周期数
优化前的
C
P
I
=
1
×
43
%
+
2
×
21
%
+
2
×
12
%
+
2
×
24
%
=
1.57
优化前的CPI=1\times43\%+2\times21\%+2\times12\%+2\times24\%=1.57
优化前的CPI=1×43%+2×21%+2×12%+2×24%=1.57
优化后的
C
P
I
=
1
×
27
%
+
2
×
27
%
+
2
×
15
%
+
2
×
31
%
=
1.73
优化后的CPI=1\times27\%+2\times27\%+2\times15\%+2\times31\%=1.73
优化后的CPI=1×27%+2×27%+2×15%+2×31%=1.73
(2)根据公式
M I P S = 指令数 执行时间 × 1 0 6 = 时钟频率 C P I × 1 0 6 MIPS=\frac{指令数}{执行时间\times10^{6}}=\frac{时钟频率}{CPI\times10^{6}} MIPS=执行时间×106指令数=CPI×106时钟频率
优化前的
M
I
P
S
=
时钟频率
C
P
I
×
1
0
6
=
50
M
H
z
1.57
×
1
0
6
=
50
×
1
0
6
H
z
1.57
×
1
0
6
≈
31.85
M
I
P
S
优化前的MIPS=\frac{时钟频率}{CPI\times10^{6}}=\frac{50MHz}{1.57\times10^{6}}=\frac{50\times10^{6}Hz}{1.57\times10^{6}}\approx31.85MIPS
优化前的MIPS=CPI×106时钟频率=1.57×10650MHz=1.57×10650×106Hz≈31.85MIPS
优化后的
M
I
P
S
=
时钟频率
C
P
I
×
1
0
6
=
50
M
H
z
1.73
×
1
0
6
=
50
×
1
0
6
H
z
1.73
×
1
0
6
≈
28.90
M
I
P
S
优化后的MIPS=\frac{时钟频率}{CPI\times10^{6}}=\frac{50MHz}{1.73\times10^{6}}=\frac{50\times10^{6}Hz}{1.73\times10^{6}}\approx28.90MIPS
优化后的MIPS=CPI×106时钟频率=1.73×10650MHz=1.73×10650×106Hz≈28.90MIPS
【结论】从MIPS数值来看,优化后程序执行速度反而变慢了,这显然是错误的,用MIPS数进行性能估计是不可靠的。
对教材的例1.4进行详细说明:
【例1.4】假定计算机中的整数乘法器改进后可以加快10倍,若整数乘法指令在程序中占40% ,则整体性能可改进多少倍?若整数乘法指令在程序中所占比例达60%和90%,则整体性能分别能改进多少倍?
【解】(1)改进部分的改进倍数为10,由于整数乘法指令在程序中占40%,说明程序执行总时间中40%是整数乘法器所用,其他部件所用时间占60%,根据阿姆达尔定律可知:
整体改进倍数
=
1
(
0.4
10
)
+
0.6
=
1
改进后的执行时间
≈
1.56
整体改进倍数=\frac{1}{(\frac{0.4}{10})+0.6}=\frac{1}{改进后的执行时间}\approx1.56
整体改进倍数=(100.4)+0.61=改进后的执行时间1≈1.56
(2)若整数乘法指令在程序中所占比例达60%和90%,则整体改进倍数分别为:
x
1
=
1
(
0.6
10
)
+
0.4
=
1
改进后的执行时间
≈
2.17
x_{1}=\frac{1}{(\frac{0.6}{10})+0.4}=\frac{1}{改进后的执行时间}\approx2.17
x1=(100.6)+0.41=改进后的执行时间1≈2.17
x
2
=
1
(
0.9
10
)
+
0.1
=
1
改进后的执行时间
≈
5.26
x_{2}=\frac{1}{(\frac{0.9}{10})+0.1}=\frac{1}{改进后的执行时间}\approx5.26
x2=(100.9)+0.11=改进后的执行时间1≈5.26
【结论】从上述例子中可以看出,即使执行时间占总时间90%的高频使用部件加快了10倍,所带来的整体性能也只能加快5.26倍。想要改进计算机系统整体性能,不能仅加速部分部件,计算机系统整体性能还受慢速部件的制约。
【例】某程序在某台计算机上运行所需时间是100s,其中,80s用来执行乘法操作。要使该程序的性能是原来的5倍,若不改进其他部件而仅改进乘法部件,则乘法部件的速度应该提高到原来的多少倍?
【解】设乘法部件的速度应该提高到原来的
n
n
n倍,
n
n
n为自然数(改进部分的改进倍数),要使该程序的性能是原来的5倍(整体改进倍数),根据公式:
若 t t t表示改进部分执行时间比例, n n n为改进部分的改进倍数,则 1 − t 1-t 1−t为未改进部分执行时间比例,整体改进倍数为: p = 1 t n + 1 − t p=\frac{1}{\frac{t}{n}+1-t} p=nt+1−t1,当 1 − t = 0 1-t=0 1−t=0时,则最大加速比 p = n p=n p=n;当 t = 0 t=0 t=0时,最小加速比 p = 1 p=1 p=1;当 n → ∞ n\to \infty n→∞时,极限加速比 p → 1 1 − t p\to \frac{1}{1-t} p→1−t1,这就是加速比的上限。
整体改进倍数为:
p
=
5
=
1
t
n
+
1
−
t
=
1
80
n
+
1
−
80
p=5=\frac{1}{\frac{t}{n}+1-t}=\frac{1}{\frac{80}{n}+1-80}
p=5=nt+1−t1=n80+1−801
即
400
n
+
100
=
1
\frac{400}{n}+100=1
n400+100=1,这个方程显然得不到自然数的解,故得出结论,无论怎样对乘法部件进行改进,整体性能都不可能提高到原来的5倍。
本课程有三大主题:
1、表示(Representation):
2、转换(Translation):
3、执行控制流(Control flow):
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。