202012.
下列给出的部件中,其位数(宽度)一定与机器字长相同的是( )。
Ⅰ. ALU
Ⅱ. 指令寄存器
Ⅲ. 通用寄存器
IV. 浮点寄存器
A. 仅Ⅰ、Ⅱ
B. 仅Ⅰ、Ⅲ
C. 仅Ⅱ、Ⅲ
D. 仅Ⅱ、Ⅲ、IV
解答:
机器字长是指计算机进行一次整数运算所能处理的二进制数据的位数(整数运算即定点整数运算)。因为计算机中数的表示有定点数和浮点数之分,定点数又有定点整数和定点小数之分,这里所说的整数运算即定点整数运算。机器字长也就是运算器进行定点数运算的字长,通常也是CPU内部数据通路的宽度。
机器字长反映了计算机的运算精度,即字长越长,数的表示范围也越大,精度也越高。机器的字长也会影响机器的运算速度。倘若CPU字长较短,又要运算位数较多的数据,那么需要经过两次或多次的运算才能完成,这样势必影响整机的运行速度。
机器字长与主存储器字长通常是相同的,但也可以不同。不同的情况下,一般是主存储器字长小于机器字长,例如机器字长是32位,主存储器字长可以是32位,也可以是16位,当然,两者都会影响CPU的工作效率。
Ⅰ. ALU(算术逻辑单元):ALU是执行算术和逻辑操作的核心部件。它通常是根据机器字长设计的,能够处理与机器字长相同位数的数据。因此,ALU的位数一定与机器字长相同。正确。
Ⅱ. 指令寄存器:指令寄存器用于存储当前执行的指令。其位数(宽度)可能比机器字长更小,因为指令可能只需要较少的位数来表示。错误。
Ⅲ. 通用寄存器:通用寄存器是用于存储临时数据和计算结果的寄存器。这些寄存器通常与机器字长相匹配,以便能够存储和处理与机器字长相同位数的数据。正确。
IV. 浮点寄存器:浮点寄存器用于存储浮点数数据。其位数可以与机器字长相同,也可以不同,取决于计算机体系结构的设计。错误。
综上,Ⅰ和Ⅲ的位数一定与机器字长相同。
本题选B。
13.
已知带符号整数用补码表示,float型数据用IEEE754标准表示,假定变量x的类型只可能是int或float,当x的机器数为C8000000H时,x的值可能是( )。
A. −7×227
B. −216
C. 217
D. 25×227
解答:
若x为float,float型数据用IEEE754标准表示,则
C8000000H = 1⏟S10010000⏟E00000000000000000000000⏟MB ,其中 E=10010000B=27+24=144 。 x=(−1)S×1.M×2E−127=(−1)1×1.0×2144−127=−217 。
A、B、C、D中没有符合该结果的选项。
若x为int,int为32位带符号整数,用补码表示,则
[x]补=C8000000H=1100 1000 0000 0000 0000 0000 0000 0000B,
[x]原=1011 1000 0000 0000 0000 0000 0000 0000B= −7×227 。
A符合该结果。
本题选A。
举一反三
已知带符号整数用补码表示,float型数据用IEEE754标准表示,假定变量x的类型只可能是int或float,当x的机器数为C7800000H时,x的值可能是( )。
A. −7×227
B. −216
C. 217
D. 25×227
参考答案:B
14.
在按字节编址采用小端方式的32位计算机中,按边界对齐方式为以下C语言结构型变量a分配存储空间。
struct record{
short x1;
int x2;
}a;
若a的首地址为2020FE00H,a的成员变量x2的机器数为12340000H,则其中34H所在的存储单元的地址是( )。
A. 2020FE03H
B. 2020FE04H
C. 2020FE05H
D. 2020FE06H
解答:
考点一:编址单位
若按字节编址,则一个数据类型占的地址单元数等于其字节数。
考点二:边界对齐
以字节为单位的边界对齐,也称字节对齐,数据在存储时需要被放置在内存地址的倍数上,比如数据类型的大小为4个字节,那么它需要被存放在地址是4的倍数的位置上。数据按边界对齐存储是一种优化技术,通过调整数据在内存中的存储位置,可以提高计算机系统的性能和效率。
边界对齐后,结构体大小为其大小最大成员变量大小的整数倍。
根据边界对齐的定义,变量a的首地址为2020FE00H,从首地址开始,按顺序从低地址到高地址依次放入x1和x2这个成员变量,模拟过程如下:
考点三:大端方式和小端方式
大端方式(Big Endian):数据低位保存在高地址中,数据高位保存在低地址中。大端序和人的书写顺序一致。
小端方式(Little Endian):数据低位保存在低地址中,数据高位保存在高地址中。
在32位计算机中,按字节编址,根据小端方式和按边界对齐的定义,给出变量a的内存布局如下:
所以34H所在存储单元的地址为2020FE06H。
本题选D。
15.
下列关于TLB和Cache的叙述中,错误的是( )。
A. 命中率都与程序局部性有关
B. 缺失后都需要去访问主存
C. 缺失处理都可以由硬件实现
D. 都由DRAM存储器组成
解答:
TLB是页表的缓存,Cache是主存的缓存,都是基于局部性原理设计的。A正确。
TLB和Cache缓存的都是主存中的信息,区别在于TLB缓存的是虚页号和页框号,用于加速虚拟地址到物理地址的转换的高速缓存,Cache缓存的是主存块,用于存储最近访问的数据副本,以提高数据的访问速度和效率。两者缺失后都需要去访问主存。B正确。
Cache缺失,CPU会处理该缺失,该处理通常由硬件实现。TLB缺失后,如果目标页在内存中,TLB失效表明缺少该地址转换。在这种情况下,CPU可以将(最后一级)页表中的地址转换加载到TLB中,并重新访问来处理失效。如果目标页不在内存中,那么TLB缺失意味着真正的缺页。在这种情况下,产生缺页中断,缺页中断通常由硬件实现。C正确。
Cache通常由SRAM组成;TLB通常由相联存储器组成,也可由SRAM组成。Cache和SRAM都是高速缓存,对数据访问的效率要求极高。相比DRAM,SRAM能够提供更快的访问速度和更低的访问延迟。DRAM需要不断刷新,性能偏低,不适合组成TLB和Cache。D错误。
本题选D。
16.
某计算机采用16位定长指令字格式,操作码位数和寻址方式位数固定,指令系统有48条指令,支持直接、间接、立即、相对4种寻址方式。单地址指令中,直接寻址方式的可寻址范围是( )。
A. 0~255
B. 0~1023
C. -128~127
D. -512~511
解答:
48条指令需要 ⌈log48⌉=6 位操作码字段,4种寻址方式需要 ⌈log4⌉=2 位寻址特征位,该计算机采用16位定长指令字格式,剩余16-6-2=8位作为地址码,地址为无符号整数,所以直接寻址范围为 0∼28−1 ,即0~255。
本题选A。
17.
下列给出的处理器类型中,理想情况下,CPI为1的是( )。
Ⅰ. 单周期CPU
Ⅱ. 多周期CPU
Ⅲ. 基本流水线CPU
Ⅳ. 超标量流水线CPU
A. 仅Ⅰ、Ⅱ
B. 仅Ⅰ、Ⅲ
C. 仅Ⅱ、Ⅳ
D. 仅Ⅲ、Ⅳ
解答:
单周期CPU中所有指令的指令周期为一个时钟周期,CPI为1。I正确。
多周期CPU中所有指令的指令周期为多个时钟周期,CPI大于1。II错误。
对于基本流水线CPU,让每个时钟周期流出一条指令,CPI为1。III正确。
对于超标量流水线CPU,每个时钟周期内并发执行多条独立指令,每个时钟周期流出多条指令,CPI小于1。IV错误。
综上,I和III正确。
本题选B。
18.
下列关于“自陷”(Trap,也称陷阱)的叙述中,错误的是( )。
A. 自陷是通过陷阱指令预先设定的一类外部中断事件
B. 自陷可用于实现程序调试时的断点设置和单步跟踪
C. 自陷发生后CPU将转去执行操作系统内核相应程序
D. 自陷处理完成后返回到陷阱指令的下一条指令执行
解答:
自陷是一种内部异常。A错误。
在程序中设置断点后,当执行到断点位置时,会触发一个陷阱事件,也就是自陷。自陷事件会触发处理器转去执行与调试器相关的代码,该代码可以处理断点停止、收集调试信息以及支持其他调试功能。B正确。
自陷最重要的用途是在用户程序和系统内核之间提供一个程序接口,该接口被称为系统调用。当自陷事件发生时,CPU将转去执行操作系统内核相应的程序。C正确。
当自陷事件发生时,处理器暂停当前的执行流程,保存当前的上下文状态,然后传递控制给操作系统内核相应的处理程序。操作系统内核会处理相应的事件。处理完成后,处理器会从保存的上下文状态中恢复,继续执行下一条指令。D正确。
本题选A。
19.
QPI总线是一种点对点全I同步串行总线,总线上的设备可同时接收和发送信息,每个方向可同时传输20位信息(16位数据+4位校验位),每个QPI数据包有80位信息,分2个时钟周期传送,每个时钟周期传递2次。因此,QPI总线带宽为:每秒传送次数×2B×2。若QPI时钟频率为2.4GHz,则总线带宽为( )。
A. 4.8GB/s
B. 9.6GB/s
C. 19.2GB/s
D. 38.4GB/s
解答:
因为QPI时钟频率为2.4GHz,每个时钟周期传送2次,所以每秒传送次数=时钟频率x2=2.4GHz×2=4.8G/s。QPI总线带宽=每秒传送次数×2B×2=4.8G/s×2B×2=19.2GB/s。题中已给出总线带宽公式,降低了难度。公式中的“×2B”是因为每次传输16位数据,“×2”是因为采用点对点全双工总线,两个方向可同时传输信息。
本题选C。
20.
下列事件中,属于外部中断事件的是( )。
Ⅰ. 访存时缺页
Ⅱ. 定时器到时
Ⅲ. 网络数据包到达
A. 仅Ⅰ、Ⅱ
B. 仅Ⅰ、Ⅲ
C. 仅Ⅱ、Ⅲ
D. Ⅰ、Ⅱ和Ⅲ
解答:
访存时缺页属于内部异常,I错误。
定时器到时描述的是时钟中断,属于外部中断,II正确。
网络数据包到达描述的是CPU执行指令以外的事件,属于外部中断,III正确。
综上,II和III属于外部中断事件。
本题选C。
21.
外部中断包括不可屏蔽中断(NMI)和可屏蔽中断,下列关于外部中断的叙述中,错误的是( )。
A. CPU处于关中断状态时,也能响应NMI请求
B. 一旦可屏蔽中断请求信号有效,CPU将立即响应
C. 不可屏蔽中断的优先级比可屏蔽中断的优先级高
D. 可通过中断屏蔽字改变可屏蔽中断的处理优先级
解答:
由CPU内部产生的异常称为内中断,内中断都是不可屏蔽中断。通过中断请求线INTR和,
NML从CPU外部发出的中断请求为外中断,通过INTR信号线发出的外中断是可屏蔽中断,而通过NMI信号线发出的是不可屏蔽中断。
不可屏蔽中断不受中断标志位的影响,即使在关中断的情况下也会被响应。A正确。
CPU响应中断需要满足3个条件:①中断源有中断请求;②CPU允许中断及开中断;一条指令执行完毕,且没有更紧迫的任务。B错误。
不可屏蔽中断的处理优先级最高,任何时候只要发生不可屏蔽中断,都要中止现行程序的执行,转到不可屏蔽中断处理程序执行。C正确。
可通过中断屏蔽字改变可屏蔽中断的处理优先级。D正确。
本题选B。
22.
若设备采用周期挪用DMA方式进行输入和输出,每次DMA传送的数据块大小为512字节,相应的I/O接口中有一个32位数数据缓冲寄存器。对于数据输入过程,下列叙述中,错误的是( )。
A. 每准备好32位数据,DMA控制器就发出一次总线请求
B. 相对于CPU,DMA控制器的总线使用权的优先级更高
C. 在整个数据块的传送过程中,CPU不可以访问主存储器
D. 数据块传送结束时,会产生“DMA传送结束”中断请求
解答:
在周期挪用DMA方式下,DMA控制器会周期性地请求总线来传输数据。每当准备好32位的数据时,DMA控制器会发出一次总线请求,A正确。
相对于CPU,DMA控制器的总线使用权的优先级通常是更高的。DMA控制器的主要任务是管理数据传输,它可以直接访问主存储器并进行数据的输入和输出。为了实现高效的数据传输,DMA控制器通常具有比CPU更高的总线优先级。B正确。
周期挪用法由DMA控制器挪用一个或几个主存周期来访问主存,传送完一个数据字后立即释放总线。周期挪用DMA方式是一种单字传送方式,每个字传送完后CPU可以访问主存。C错误。
当DMA传输完成整个数据块时,它会生成一个中断请求信号,通知CPU传输已经完成。D正确。
本题选C。
二、综合应用题
第41~47小题,共70分。
43.
(13分)
有实现x×y的两个C语言函数如下:
unsigned umul (unsigned x, unsigned y) { return x*y; }
int imul (int x, int y) { return x * y; }
假定某计算机M中ALU只能进行加减运算和逻辑运算。请回答下列问题。
(1) 若M的指令系统中没有乘法指令,但有加法、减法和移位等指令,则在M上也能实现上述两个函数中的乘法运算,为什么?
(2) 若M的指令系统中有乘法指令,则基于ALU、移位器、寄存器以及相应控制逻辑实现乘法指令时,控制逻辑的作用是什么?
(3) 针对以下三种情况:①没有乘法指令;②有使用ALU和移位器实现的乘法指令;③有使用阵列乘法器实现的乘法指令,函数umul()在哪种情况下执行时间最长?哪种情况下执行的时间最短?说明理由。
(4) n位整数乘法指令可保存2n位乘积,当仅取低n位作为乘积时,其结果可能会发生溢出。当n=32、x= 231−1 、y=2时,带符号整数乘法指令和无符号整数乘法指令得到的x×y的2n位乘积分别是什么(用十六进制表示)?此时函数umul()和imul()的返回结果是否溢出?对于无符号整数乘法运算,当仅取乘积的低位作为乘法结果时,如何用2n位乘积进行溢出判断?
解答:
(1) 乘法运算可以通过加法和移位来实现。编译器可以将乘法运算转换为一个循环代码段,
在循环代码段中通过比较、加法和移位等指令实现乘法运算。例如Booth乘法。
(2) 控制逻辑的作用是控制循环次数,控制加法和移位操作。
C语言整型用补码表示,通常采用Booth乘法。
Booth乘法对乘数从低位开始判断,根据两个数据位的情况决定进行加法、减法还是仅仅移位操作。判断的两个数据位为当前位及其右边的位(初始时需要增加一个辅助位0),移位操作是向右移动。其中booth算法在操作时,需要遵循一个操作表:
操作,右移一位补,右移一位补,右移一位,右移一位YnYn+1操作00+0,右移一位01+[X]补,右移一位10+[−X]补,右移一位11+0,右移一位
具体步骤如下:
- 被乘数X与乘数Y均以补码的形式参加乘法运算,运算结果是积的补码。
- 部分积和被乘数X采用双符号位,乘数Y采用单符号位。
- 初始部分积为0。运算前,在乘数Y的补码末位添加一位附加位 Yn+1 ,初始值为0。
- 根据 YnYn+1 的值,按照上表进行累加右移操作,右移时遵循补码的移位规则。
- 累加n+1次,右移n次,最后一次不右移。
这个过程累加n+1次,右移n次,所以控制逻辑的作用是控制循环次数,还需要根据操作表控制加法和移位操作。
(3) ①的执行时间最长,③的执行时间最短。
对于①,需要使用其他指令和算法来模拟乘法操作。常见的方法是通过编写(软件)程序使用加法、位移和逻辑操作来实现乘法功能。这种方法通常需要多条指令和多个时钟周期来完成乘法运算,因此会比硬件乘法指令的执行时间更长。②和③都是硬件乘法指令,所以①的执行时间最长。
对于②和③,都只需用一条乘法指令实现乘法操作。
对于③,阵列乘法器是专门用于执行乘法操作的硬件电路,可以在一个时钟周期内完成乘法运算。由于其硬件实现的特性,阵列乘法器通常是执行乘法操作最高效的方式。所以③的执行时间最短。
对于②,ALU和位移器实现的乘法指令通常需要多个时钟周期来完成乘法运算。它通过将乘法操作划分为一系列的加法、位移和逻辑操作来实现。尽管比情况①中的方法更高效,但仍然需要多个时钟周期来执行,因此相对于情况③中的阵列乘法器,执行时间较长。
(4) 第一问。当n=32、x= 231−1 、y=2时,64位的[x]补=0000 0000 0000 0000 0000 0000 0000 0000 0111 1111 1111 1111 1111 1111 1111 11111B,y=2,x×y相当于对x进行算术左移1位,得到[x×y]补=0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 1111 1111 1111 11110B=00000000FFFFFFFEH。
第二问。此时函数umul()不溢出,imul()的返回结果溢出,因为umul()的返回值类型为unsigned,默认为unsigned int,为32位无符号整型,可以表示32个数值位,结果恰有32个有效数值位,所以其返回结果不溢出。然而imul()返回值类型为int,为32位有符号整型,最高位为符号位,可以表示31个数值位,结果有32个有效数值位,所以其返回结果溢出。
第三问。对于无符号整数乘法运算,当仅取乘积的低位作为乘法结果时,对于2n位乘积,若乘积高n位全为0,即乘积高n位不存在有效数值位,则无溢出,否则溢出。
44.
(10分)
假定主存地址为32位,按字节编址,指令Cache和数据Cache与主存之间均采用8路组相联映射方式,直写(WriteThrough)写策略和LRU替换算法,主存块大小为64B,数据区容量各为32KB。开始时Cache均为空。请回答下列问题。
(1) Cache每一行中标记(Tag)、LRU位各占几位?是否有修改位?
(2) 有如下C语言程序段:
for(k = 0; k < 1024; k++)
s[k] = 2 * s[k];
若数组s及其变量k均为int型,int型数据占4B,变量k分配在寄存器中,数组s在主存中的起始地址为0080 00C0H,则该程序段执行过程中,访问数组s的数据Cache缺失次数为多少?
第二个小问的,这些条件告诉你,接下来我要访问的这个物理地址。物理地址是哪几个?那么第一个要访问的物理地址就应该是零号元素s0。数组的零号元素s0存储的地址就是零零八零零零c0h。这是第一个地要访问的物理地址,第二个元素s1存放在什么位置啊?因为每一个int型的呃变量占四个字节对吧?所以就是加四嘛。在上个地址的基础上加四,也就是。也就是到了什么零零八零。零零c4h。
好下一个元素s2。它的地址就应该是零零八零零零c。8h好以此类推OK吧,最终我们要访问的是s一零二三。总共有1024个数组元素,那呃,整个所有的这些数组元素,它的物理地址到底是多少?你确定了你能够你能够理解这个逻辑之后,那你就知道。在这个程序执行的过程当中,本质上就是要去访问这几个物理地址,对吧?从s0一直到s一二一零二三依次去访问。访问每一个地址的时候,
是否会出现cash缺失呢?怎么去判断?怎么去判断?是不是得结合它的这个映射方式来分析?我们要分析所有的这些元素。它从属于几个分组。他们属于几个分组,从他他们分别是属于哪个分组对吧?
访问第一次的时候,这个快就会被调入cash啊 再往后的访问,同一块的其他数据就不会缺失。 所以对于这个题目来讲啊,我们一个cash块大小是64个字节啊,然后每个int型的变量是四个字节。我们不妨算一下64÷4等于16个元素。
16个int型的元素组成一个块。每16个元素组成一个块,而数组的这些元素在内存当中都是连续存储的,对吧?所以第一个地址访问的是s0,那从s0访问s0的时候会缺失。访问s1的时候会缺失吗?不会缺失对吧?因为s1和s0同属于从属于同一个块,然后再往后一直到s15,也就是这16个元素,它们都是同都是包含在同一个内存块里的。包含在同一个主存块里的。所以只有第一个元素被访问的时候会缺失,
而后面的都不会缺失,都不会出现开始缺失,直到访问到s16这个元素的时候。它就属于另一个块了,
对吧?另一个块好,所以从s16一直到s31。只有第一个元素会缺失,其他元素都不会缺失,就是这样的一个逻辑,
其实最重要的还是要分析出cash地址的这个结构啊。知道了cash地址的结构,你就可以知道哪些物理地址从属于同一个块?那这样你就可以去分析诶,到底哪些元素访问的第一次被访问的时候诶会会缺失,之后就不会再缺失。 对吧,每16次缺失一次嘛,是的,是这样一个逻辑。
(3) 若CPU最先开始的访问操作是读取主存单元00010003H中的指令,简要说明从Cache中访问该指令的过程,包括Cache缺失处理过程。
第三个小问,如果CPU最先开始访问的操作,
最先开始访问的这个主存单元是这样的一个地址。啊的一个指令。它最先开始访问呃,存储在这个PA的一条指令,那简要说明cache中访问该指令的过程包括cache缺失的处理情况。来怎么弄?给了你一个PA之后要去访问,给了你一个物理地址,要去访问这个物理地址呃。要要去访问这个物理地址,那么我们要做的就是CPU的做法,跟你的做法是一样的,首先需要把这个拆分成这样的三个部分,对吧?那每个部分占多少个比特,你自己去算,自己去算。
由于是组相连映射,因此会根据中间的我不知道是几个比特啊,大家自己下去算一下,根据中间的这几个比特。去找到对应的分组。而每一个分组当中会有八个cash行,因为是八路组相邻映射嘛。
然后在这八个cash行当中。去对比跟这八个开始行去对比我的tag标记位到底和哪一行能够匹配的上?如果能匹配上,那么接下来还需要检查有效位。 有效位是否为零还是为一?如果有效位为一,那么命中如果有效位为零,那么不命中。 在这个题目当中,它告诉你就是这个CPU最先开始访问的是这个东西啊,就也就是说这个程序刚开始运行的时候它。它先访问了那条指令肯定是有效位,肯定是等于零的,他肯定会cash缺失,那接下来如果cash缺失的话,cash缺失的话,就会把这个。地址对应的cash块。把整个块64个字节的那个储存块的内容读到cache里边。把主存块读到cache里边,那么就会变成cache块,对吧?把主存块读到cache里边,变成cache块。同时,修改这个cash看呃,修改这个cash行内部的tag标记位有效位。
有效位还有lru替换算法位。还有脏位,如果有脏位的话,所以。第三个小问。让我们描述这个cash缺失过处理的过程,其实又回到了一个是骚图啊,我们用骚图给大家梳理了啊,这个cash缺失的过程当中。你你会呃,就查cash的时候在组相连映射当中,查cash是怎么查的?如果cash缺失。那么,调入一个新的cash块,
调入一个新的cash块,你需要
解答: