软件设计师笔记之计算机硬件基础(一)

版权声明:未经博主许可 请勿转载 https://blog.csdn.net/qq_40791253/article/details/89036411

目录

一、数据的表示

1. 数制转换

2. 原码、反码、补码、移码

3. 浮点数计算

二、计算机系统的组成与体系结构

1. 计算机体系结构分类

2. 计算机的硬件组成

3. 指令系统基础

4. CISC与RISC

5. 流水线



计算机硬件基础 考点梳理

硬件基础知识是软件设计师考试中的一个必考模块。但其涉及到的知识点非常多,真正常考的却不多,因此需要对考点脉络进行梳理,掌握重要知识点。

计算机硬件基础知识点
数据的表示 数制及其转换、原码、反码、补码、移码、浮点数、溢出、算术运算、逻辑运算、校验码
计算机系统的组成、体系结构分类及特性

CPU、存储器的组成、性能和基本工作原理、常用I / O设备、通信设备的性能及基本工作原理、I / O接口的功能、类型和特性、CI SC/ RI SC、流水线操作、多处理机、并行处理

存储系统 虚拟存储器基本工作原理、多级存储体系、RAI D类型和特性
可靠性与系统性能评测基础知识 诊断与容错、系统可靠性分析评价、校验方法、计算机系统性能评测方法
计算机硬件重要知识点
数据的表示 浮点数运算、溢出、算术、逻辑运算
计算机系统的组成与体系结构 CPU的构成,常见寄存器的作用、计算机体系结构分类、指令系统基础、CI SC与RI SC、流水线操作的相关内容
存储系统 Cache存储器
可靠性与系统性能评测基础知识 系统可靠性分析和校验方法

一、数据的表示

1. 数制转换

(1)R进制数转换成十进制数

R进制数转换成十进制数通常使用按权展开法。具体操作方式为:将R进制数的每一位数值用Rk形式表示,即幂的底数是R,指数为k,k与该位和小数点之间的距离有关。当该位位于小数点左边,k值是该位和小数点之间数码的个数,而当该位位于小数点右边,k值是负值,其绝对值是该位和小数点之间数码的个数加1。

例如二进制数l 0101. 01的值可计算如下:

l 0101. 01=1×2^4+1×2^2+1×2^0+1×2^-2

按照上面的表示法,即可计算出R进制数十进制的值。

(2)十进制数转换为R进制数

最常用的是“除以R取余法”。例如将十进制数85转换为二进制数:

2 | 85 余 1

2 | 42 余 0

2 | 21 余 1

2 | 10 余 0

2 | 5  余 1

2 | 2  余 0

2 | 1  余 1

将所得的余数从低位到高位排列(1010101)2就是85的二进制数。

(3)二进制数与八进制数、十六进制数之间的转换

二进制转八进制:将每3个二进制数转换为八进制数

二进制转十六进制数:将每4个二进制数转换为八进制数;

八进制转二进制:将每个八进制数转换为3位二进制数;

十六进制转二进制:将每个十六进制数转换为4位二进制数。

上面的转换都是以小数点作为计算数码个数的起点。八进制数和十六进制数转换可先转换为二进制数,然后再转换为目标进制。

2. 原码、反码、补码、移码

在计算机中,数据编码方式可以有多种,最为常见的有原码、反码、补码、移码。一个正数的原码、补码、反码是相同的,负数则不同。

(1)原码

将最高位用做符号位(0表示正数,1表示负数),其余各位代表数值本身的绝对值的表示形式。这种方式是最容易理解的。

例如,+1 的原码是0000 0001,–1 的原码是1000 0001。

但是直接使用原码在计算时却会有麻烦,比如( 1) 10+( –1) 10 = 0,如果直接使用原码则:

( 0000 0001) 2+( 1000 0001) 2=( 1000 0010) 2

这样计算的结果是–2,也就是说,使用原码直接参与计算可能会出现错误的结果。所以,原码的符号位不能直接参与计算,必须和其它位分开,这样会增加硬件的开销和复杂性。

(2)反码

正数的反码与原码相同。负数的反码符号位为1,其余各位为该数绝对值的原码按位取反。这个取反的过程使得这种编码称为“反码”。

例如,–1的反码:1111 1110 。

同样对上面的加法,使用反码的结果是:

( 0000 0001) 2+ ( 1111 1110) 2 = ( 1111 1111) 2

这样的结果是负0,而在人们普遍的观念中,0是不分正负的。反码的符号位可以直接参与计算,而且减法也可以转换为加法计算。

(3)补码

正数的补码与原码相同。负数的补码是该数的反码加1,这个加1就是“补”。

例如,–1的补码:1111 1110+1 = 1111 1111。

再次做加法是这样的:

( 0000 0001) 2 + ( 1111 1111) 2 = ( 0000 0000) 2 

直接使用补码进行计算的结果是正确的。

对一个补码表示的数,要计算其原码,只要对它再次求补,可得该数的原码。

由于补码能使符号位与有效值部分一起参加运算,从而简化运算规则,同时它也使减法运算转换为加法运算,进一步简化计算机中运算器的电路,这使得在大部分计算机系统中,数据都使用补码表示。

(3)移码

移码是对补码的符号位取反得到的一种编码。移码只用于表示浮点数的阶码,所以只用于整数。

例如,1的移码为:0111 1111。

3. 浮点数计算

在数学中,我们常用科学计数法来表示一个很大的数:

其中M称为尾数,e是指数,R为基数。

浮点数就是使用这种方法来表示大范围的数,其中指数一般是2,8,16。但是对于特定机器而言,指数是固定不变的,所以在浮点数中指数并不出现。从这个表达式可以看出:浮点数表示的精度取决于尾数的宽度,范围取决于基数的大小和指数的宽度

浮点数的运算主要有三个步骤:对阶、尾数计数、结果格式化

(1)对阶

首先计算两个数的指数差,把指数小的向指数大的对齐,并将尾数右移指数差的位数,这样两个浮点数就完成了对阶的操作。可以看出,对阶的过程可能使得指数小的浮点数失去一些有效位。如果两个浮点数阶数相差很大,大于指数小的浮点数的尾数宽度,那么对阶后那个浮点数的尾数就变成了0,即当做机器零处理了。

注:我的理解是 尾数右移指的是数向右移动,而非小数点右移;失去有效位指的是由于尾数的位数保持不变,当数左右移动时会失去相应的数

(2)尾数计算

对阶完成后,两个浮点数尾数就如同定点数,计算过程同定点数计算。

(3)结果格式化

尾数计算后,可能会产生溢出,此时将尾数右移,同时指数加1,如果指数加1后发生了溢出,则表示两个浮点数的运算发生了溢出。

如果尾数计算没有溢出,则尾数不断左移,同时指数减1,直到尾数为格式化数。如果这个过程中,指数小于机器能表达的最小数,则将结果置“机器零”,这种情况称为下溢。

二、计算机系统的组成与体系结构

在计算机系统的组成与体系结构中,计算机体系结构分类、计算机的硬件组成、指令系统基础、CI SC与RISC、流水线操作等内容是最为重要的。

1. 计算机体系结构分类

计算机体系结构分类有多种方式,其中最为常见的是:Fl ynn分类法与冯氏分类法。而考试中主要考查的是Flynn分类法。

Flynn分类法是根据指令流、数据流和多倍性三方面来进行分类的:

可依据指令流和数据流将常见的计算机进行分类,SISD:单片机;SIMD:阵列处理机,适合处理数组类运算操作;MISD:理论模型,不具备实际意义;MIMD:现在的服务器基本都具备多处理器,比较常见

2. 计算机的硬件组成

计算机硬件系统是依照冯· 诺依曼所设计体系结构,即包括运算器、控制器、存储器、输入设备和输出设备五大部件组成:

计算机硬件组成结构示意图
主机结构示意图

其中运算器和控制器组成中央处理器(CPU)。运算器负责完成算术、逻辑运算功能,通常由ALU(算术/ 逻辑单元)、寄存器、多路转换器、数据总线组成;控制器则负责依次访问程序指令,进行指令译码,并协调其他设备,通常由程序计数器(PC)、指令寄存器(IR)、指令译码器、状态/条件寄存器、时序发生器、微操作信号发生器组成。

下面介绍几个主要部件的功能:

程序计数器:用于存放下一条指令所在单元的地址的地方。由于大多数指令都是按顺序来执行的,所以修改的过程通常只是简单的对PC加1。当遇到转移指令时,后继指令的地址(即PC的内容)必须从指令寄存器中的地址字段取得。在这种情况下,下一条从内存取出的指令将由转移指令来规定,而不像通常一样按顺序来取得。因此程序计数器的结构是具有寄存信息和计数两种功能的结构。

指令寄存器:用来保存当前正在执行的一条指令。当执行一条指令时,先把它从内存取到数据寄存器中,然后再传送至指令寄存器。指令划分为操作码和地址码字段,由二进制数字组成。为了执行任何给定的指令,必须对操作码进行测试,以便识别所要求的操作。指令译码器就是做这项工作的(下一词条将详细介绍其工作过程)。指令寄存器中操作码字段的输出就是指令译码器的输入。操作码一经译码后,即可向操作控制器发出具体操作的特定信号。

指令译码器:译码是编码的逆过程(CPU中的译码器的主要作用是对指令进行译码),在编码时,每一种二进制代码,都赋予了特定的含义,即都表示了一个确定的信号或者对象。把代码状态的特定含义“翻译”出来的过程叫做译码,实现译码操作的电路称为译码器。或者说,译码器是可以将输入二进制代码的状态翻译成输出信号,以表示其原来含义的电路

 

试题笔记:

程序计数器(PC)是用于存放下一条指令所在单元的地址的地方。程序员能访问的是程序计数器

地址寄存器(AR)一般用来保存当前CPU所访问的内存单元的地址,以方便对内存的读写操作。

累加器(AC)是专门存放算术或逻辑运算的一个操作数和运算结果的寄存器。

ALU(逻辑运算单元)是CPU的执行单元,主要负责运算工作。

 

指令寄存器一般用来保存当前正在执行的一条指令。

存储器数据寄存器主要是用来保存操作数和运算结果等信息的,其目的是为了节省读取操作数所需占用总线和访问存储器的时间。

存储器地址寄存器一般用来保存当前CPU所访问的内存单元的地址,以方便对内存的读写操作。

 

立即寻址的特点是:指令的地址字段指出的不是操作数的地址,而是操作数本身;

直接寻址特点是:在指令格式的地址字段中直接指出操作数在内存的地址;

寄存器寻址的特点是:指令中给出的操作数地址不是内存的地址单元号,而是通用寄存器的编号(当操作数不放在内存中,而是放在CPU的通用寄存器中时,可采用寄存器寻址方式);

寄存器间接寻址方式与寄存器寻址方式的区别在于:指令格式中操作数地址所指向的寄存器中存放的内容不是操作数,而是操作数的地址,通过该地址可在内存中找到操作数;

相对寻址的特点是:把程序计数器PC的内容加上指令格式中的形式地址来形成操作数的有效地址。

 

总线复用,顾名思义就是一条总线实现多种功能。常见的总线复用方式有总线分时复用,它是指在不同时段利用总线上同一个信号线传送不同信号,例如,地址总线和数据总线共用一组信号线。采用这种方式的目的是减少总线数量,提高总线的利用率

3. 指令系统基础

在计算机中,CPU都会定义出自己特定的指令系统,不过都遵循着统一的标准格式。指令的基本格式是由操作码和地址码两个部分组成的。操作码指出该指令要完成什么操作,地址码则是提供原始的数据。指令系统中定义操作码的方式可以分为规整型(定长编码)和非规整型(变长编码)两种

指令系统操作码定义分类方法比较表
编码方式 编码方式 平均码长
定长编码 采用相等码长,每个操作码的长度相等

码长>=㏒₂n(操作码数)

如 14 个操作码,就应该是4位:

2³ = 8,不够,2⁴ = 16,多 2 个

变长编码 根据使用频度选择不同长度的编码

将码分为几个类,然后再对每类进行编码

平均码长:将每个码长乘以频度,再累加其和

而在指令系统中用来确定如何提供操作数或提供操作数地址的方式称为寻址方式和编址方式。操作数可以存放在CPU中的寄存器(用寄存器名操作)、主存储器(指出存储单元地址)、堆栈(先进后出的存储机制,用栈顶指针SP来标出其当前位置)、外存储器或外围设备中。不过在运算时,数据均在主存储器中,操作数可以采用以下几种寻址方式:

(1)立即寻址方式

指令的地址字段指出的不是操作数的地址,而是操作数本身。这种方式的特点是指令执行时间很短,不需要访问内存取数。题目中所说的“操作数包含在指令中的寻址方式”就是立即寻址。

例如,单地址的移位指令格式为

OP (移位) F D

这里D不是地址,而是一个操作数。F为标志位,当F=1时,操作数进行右移;当F=0时,操作数进行左移。

(2)直接寻址方式

直接寻址特点是:在指令格式的地址字段中直接指出操作数在内存的地址D。

采用直接寻址方式时,指令字中的形式地址D就是操作数的有效地址E,即E=D。因此通常把形式地址D又称为直接地址。此时,由寻址模式给予指示。如果用S表示操作数,那么直接寻址的逻辑

表达式为 S=( E) =( D)

(3)间接寻址方式

间接寻址的情况下,指令地址字段中的形式地址D不是操作数的真正地址,而是操作数地址的指示器,D单元的内容才是操作数的有效地址。

如果把直接寻址和间接寻址结合起来,指令有如下形式: 

寻址特征位I =0,表示直接寻址,这时有效地址E=D;I =1,表示间接寻址,这时有效地址E=( D) 。

间接寻址方式是早期计算机中经常采用的方式,但由于两次访问内存,影响指令执行速度,现在已不大使用。

(4)寄存器寻址方式和寄存器间接寻址方式

当操作数不放在内存中,而是放在CPU的通用寄存器中时,可采用寄存器寻址方式。此时指令中给出的操作数地址不是内存的地址单元号,而是通用寄存器的编号。这也就是题目中所说的“操作数在寄存器中的寻址方式”。

寄存器间接寻址方式与寄存器寻址方式的区别在于:指令格式中的寄存器内容不是操作数,而是操作数的地址,该地址指明的操作数在内存中。这也就是题目中所说的“操作数的地址在寄存器中的寻址方式”。

(5)相对寻址方式

相对寻址是把程序计数器PC的内容加上指令格式中的形式地址D而形成操作数的有效地址。程序计数器的内容就是当前指令的地址。“相对”寻址,就是相对于当前的指令地址而言的。

采用相对寻址方式的好处是程序员无须用指令的绝对地址编程,所编程序可以放在内存任何地方。

此时形式地址D通常称为偏移量,其值可正可负,相对于当前指令地址进行浮动

4. CISC与RISC

为了提高操作系统的效率,人们最初选择了向指令系统中添加更多、更复杂的指令,而随着不断地升级和向后兼容的需要,指令集也越来越大。这种类型的计算机,我们称之为复杂指令计算机CISC。而后来研究发现,计算机指令系统如果使用少量结构简单的指令会提高计算机的性能,这就是精简指令集计算机RISC。计算机执行程序所需的时间P由三方面因素决定:编译后产生的机器指令数I 、执行每条指令所需的平均周期数CPI ,以及每个机器周期的时间T。它们的关系是P=I×CPI×T。RISC正是通过简化指令的途径使计算机结构更合理,减少指令执行周期数,提高运算速度。虽然RISC编译后产生的机器指令数(I )增多了,但指令所需的周期数(CPI )和每个周期的时间(T)都可以减少。它与CI SC可谓各有特色,如下表所示。

指令系统操作码定义分类方法比较表

典型的RISC处理器包括:DEC的Al pha 21164、I BM的Power PC620、HP的PA8000、SGIMI PS分部的TS、Sun的Ultra SPARC。目前RISC处理器技术的发展方向是采用并行处理技术(包括超级流水线、超级标量、超长指令字)大幅度提高运算速度。CISC由于指令较多,有些指令很少用到,因此采用可变长格式RISC由于指令较少,通常是一些比较常用的指令,因此采用定长格式,RISC也通过引用寄存器来提高运算速度。

5. 流水线

流水线是指在程序执行时多条指令重叠进行操作的一种准并行处理实现技术。各种部件同时处理是针对不同指令而言的,它们可同时为多条指令的不同部分进行工作,以提高各部件的利用率和指令的平均执行速度。指令流水线是将指令执行分成几个子过程,每一个子过程对应一个工位,我们称为流水级或流水节拍,这个工位在计算机里就是可以重叠工作的功能部件,称为流水部件。

流水线要求所有的流水级部件必须在相同的时间内完成各自的子过程。在流水线中,指令流动一步便是一个机器周期,机器周期的长度必须由最慢的流水级部件处理子过程所需的时间来决定。

那么我们为什么要提出流水线这个概念,以及流水线是如何提高系统吞吐量的呢?下面我们来看图,概念自然就清楚了。

我们从中可以看到,未使用流水线执行指令情况的途中任意一个系统时间都有大量的设备处于空闲状态再看使用流水线执行指令情况的图中,显然,采用流水线可以大大提升系统资源的利用率,以及整个系统的吞吐量。

在软件设计师考试中,流水线方面的考题主要考查计算:流水线执行时间、流水线的吞吐率(等于任务数/ 完成时间)、加速比(不采用流水线的执行时间/ 采用流水线的执行时间)以及 流水线的效率

(1)计算流水线执行时间

假定有某种类型的任务,共可分成N个子任务,执行每个子任务需要时间t ,则完成该任务所需的时间即为Nt 。若以传统的方式,则完成k个任务所需的时间是kNt ;而使用流水线技术执行,花费的时间是Nt +( k1) t 。也就是说,除了第一个任务需要完整的时间外,其他都通过并行,节省下了大量的时间,只需一个子任务的单位时间就够了。

另外要注意的是,如果每个子任务所需的时间不同,则其速度取决于其执行顺序中最慢的那个(也就是流水线周期值等于最慢的那个指令周期),要根据实际情况进行调整。

例如:若指令流水线把一条指令分为取指、分析和执行三部分,且三部分的时间分别是取指

2ns ,分析2ns ,执行1ns 。那么,最长的是2ns ,因此100条指令全部执行完毕需要的时间就是:

( 2ns +2ns +1ns )+( 100-1)×2ns =203ns 。

(2)流水线的吞吐率计算:

流水线的吞吐率(Though Put rate,TP)是指在单位时间内流水线所完成的任务数量或输出的结果数量。计算流水线吞吐率的最基本的公式如下:

         TP = 指令条数/流水线执行时间

         TP = 100/203

流水线最大吞吐率:

         TP(max) = 1/流水线周期

         TP(max) = 1/2

(3)流水线的加速比

完成同样一批任务,不使用流水线所用的时间与使用流水线所用时间之比称为流水线的加速比。计算公式如下

S = 不使用流水线执行时间/使用流水线执行时间

S = [ (2+2+1)*100]/[(2+2+1)+(100-1)*2]=500/203

(4)流水线的效率

流水线的效率是指流水线的设备利用率。在时空图上,流水线的效率定义为n个任务占用的时空区与k个流水段总的时空区之比

计算公式如下

E = n个任务占用的时空区/k个流水段的总的时空区

E =(1+1+1+3)△t*4/15△t*4

(5)影响流水性的主要因素

流水线的关键在于“重叠执行”,因此如果这个条件不能够满足,流水线就会被破坏。这种破坏主要来自三种情况:

转移指令:因为前面的转移指令还没有完成,流水线无法确定下一条指令的地址,因此也就无法向流水线中添加这条指令。从这里的分析可以看出,无条件跳转指令是不会影响流水线的。

共享资源访问的冲突:也就是后一条指令需要使用的数据,与前一条指令发生的冲突,或者相邻的指令使用了相同的寄存器,这也会使得流水线失败。

响应中断:当有中断请求时,流水线也会停止。对于这种情况有两种响应方式,一种是立即停止——精确断点法,能够立即响应中断;另一种是流水线中的指令继续执行,不再新增指令到流水线——不精确断点法

猜你喜欢

转载自blog.csdn.net/qq_40791253/article/details/89036411