目录
讲解视频推荐:
【BOK408真题讲解-2024】
一、数据结构
1. 算法题(图的邻接矩阵)13’
2023 年 10 月 26 日,神州十七号载人飞船发射取得圆满成功,再次彰显了中国航天事业的辉煌成就。载人航天工程是包含众多子工程的复杂系统工程,为了保证工程的有序开展,需要明确各子工程的前导子工程,以协调各子工程的实施。该问题可以简化、抽象为有向图的拓扑序列问题。已知有向图 G 采用邻接矩阵存储,类型定义如下。
typedef struct{ //图的类型定义
int numVertices,numEdges; //图的顶点数和有向边数
char VerticesList[MAXV]; //顶点表,MAXV为已定义常量
int Edge[MAXV][MAXV]; //邻接矩阵
}MGraph;
请设计算法: int uniquely(MGraph G) ,判定 G 是否存在唯一的拓扑序列,若是,则返回 1 ,否
则返回 0 。要求如下。
(1)给出算法的基本设计思想。(4 分)
(2)根据设计思想,采用 C 或 C++ 语言描述算法,关键之处给出注释。(9 分)
【解析】:
(1)建立图 G 各顶点的入度表 degree[] ,选择入度为 0 的顶点 v ,将 v 的所有邻接点的入度 -1 ,重复执行这个过程。若每次选中的入度为 0 的顶点有且仅有一个,且共进行了 G.numVertices 次,则意味着存在唯一的拓扑序列,返回 1 ,否则不存在拓扑序列,或者存在多个拓扑序列,返回 0 。
(2)用 C 语言描述的算法如下:
int uniquely(MGraph G){ //判定有向图是否存在唯一的拓扑序列
int *degree = (int*)malloc(G.numVertices*sizeof(int));
int i, j, k, count = 0;
for(j = 0; j < G.numVertices; j++){ //计算各顶点的入度
degree[j] = 0;
for(i = 0; i < G.numVertices; i++){
degree[j] += Edge[i][j];
}
if(degree[j] == 0){ //入度为 0 的顶点
k = j;
count++;
}
}
if(count != 1){ //如果入度为 0 的顶点个数不为 1 ,则不存在唯一地拓扑序列
free(degree);
return 0;
}
else{ //如果入度为 0 的顶点个数为 1
for(i = 1; i < G.numVertices; i++){
count = 0;
for(j = 0; j < G.numVertices; j++){
if(Edge[k][j] != 0){
degree[j] -= 1;
if(degree[j] == 0){
k = j;
count++;
}
}
}
if(count != 1){
free(degree);
return 0;
}
}
free(degree);
return 1;
}
}
2. 散列表 10’
将关键字序列 20,3,11,18,9,14,7 依次存储到初始为空、长度为 11 的散列表 HT 中,散列函数 H(key) = (key × 3) % 11 。H(key)计算出的初始散列地址为 H0 ,发生冲突时探查地址序列是 H1 ,H2 ,H3 ,…,其中,Hk = (H0 + k2) % 11 ,k = 1,2,3,… 。
请回答下列问题。
(1)画出所构造的 HT ,并计算 HT 的装填因子。(6 分)
(2)给出在 HT 中查找关键字 14 的关键字比较序列。(2 分)
(3)在 HT 中查找关键字 8 ,确认查找失败时的散列地址是多少?(2 分)
【解析】:
(1)散列表(HT)如下:
散列地址 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|---|
关键字 | 11 | 14 | 7 | 20 | 9 | 3 | 18 |
装填因子 α = 7/11
(2)H(14) = (14 × 3) % 11 = 9 = H0 ,而位置 9 的关键字是 3 ,不匹配。
H1 = (9 + 1) % 11 = 10 ,而位置 10 的关键字是 18 ,不匹配。
H2 = (9 + 4) % 11 = 2 ,位置 2 的关键字是 14 ,匹配成功。
因此,查找关键字 14 的关键字比较序列为 3 ,18 ,14 。
(3)H(8) = (8 × 3) % 11 = 2 = H0 ,而位置 2 的关键字是 14 ,不匹配。
H1 = (2 + 1) % 11 = 3 ,而位置 3 的关键字是 7 ,不匹配。
H2 = (2 + 4) % 11 = 6 ,而位置 6 的关键字是 9 ,不匹配。
H3 = (2 + 9) % 11 = 0 ,而位置 0 的关键字是 11 ,不匹配。
H4 = (2 + 16) % 11 = 7 ,而位置 7 为空,确认查找失败。
因此,查找关键字 8 时,确认查找失败时的散列地址是 7 。
二、计算机组成原理
1. 程序的机器级代码表示 13’
假定计算机 M 字长为 32 位,按字节编址,采用 32 位定长指令字,指令 add 、slli 和 lw 的格式、编码和功能说明如下表所示。
指令 | 31 → 25 | 24 → 20 | 19 → 15 | 14 → 12 | 11 → 7 | 6 → 0 | 指令功能说明 |
---|---|---|---|---|---|---|---|
add | 0000000 | rs2 | rs1 | 000 | rd | 0110011 | R[rd] ← R[rs1] + R[rs2] |
slli | 0000000 | shamt | rs1 | 010 | rd | 0010011 | R[rd] ← R[rs1] << shamt |
lw | imm | imm | rs1 | 010 | rd | 0000011 | R[rd] ← M[R[rs1] + imm] |
其中,R[x] 表示通用寄存器 x 的内容,M[x] 表示地址为 x 的存储单元内容,shamt 为移位位数,imm 为补码表示的偏移量。下图 (b) 给出了计算机 M 的部分数据通路及其控制信号(用带箭头虚线表示),其中,A 和 B 分别表示从通用寄存器 rs1 和 rs2 中读出的内容;IR[31:20] 表示指令寄存器中的高 12 位;控制信号 Ext 为 0、1 时扩展器分别实现零扩展、符号扩展,ALUctr 为 000、001、010 时 ALU 分别实现加、减、逻辑左移运算。
请回答下列问题。
(1)计算机 M 最多有多少个通用寄存器?为什么 shamt 字段占 5 位?(2 分)
(2)执行 add 指令时,控制信号 ALUBsrc 的取值应是什么? 若 rs1 和 rs2 寄存器内容分别是 8765 4321H 和 9876 5432H ,则 add 指令执行后,ALU 输出端 F、OF 和 CF 的结果分别是什么?若该 add 指令处理的是无符号整数,则应根据哪个标志判断是否溢出?(5 分)
(3)执行 slli 指令时,控制信号 Ext 的取值可以是 0 也可以是 1 ,为什么?(2 分)
(4)执行 lw 指令时,控制信号 Ext、ALUctr 的取值分别是什么?(2 分)
(5)若一条指令的机器码是 A040 A103H,则该指令一定是 lw 指令,为什么?若执行该指令时,R[01H] = FFFF A2D0H ,则所读取数据的存储地址是什么?(2 分)
【解析】:
(1)计算机 M 最多有 25 = 32 个通用寄存器。
由于计算机 M 字长为 32 位,故寄存器的宽度也为 32 位,因此 shamt 字段占 log232 = 5 位。
(2)执行 add 指令时,控制信号 ALUBsrc 的取值应是 0 。
控制信号 ALUBsrc 的取值通常用于指示 ALU 的输入源。
① ALUBsrc = 0 表示使用寄存器中的数据(寄存器源);
② ALUBsrc = 1 表示使用立即数(立即数源)。
若 rs1 和 rs2 寄存器内容分别是 8765 4321H 和 9876 5432H ,则 add 指令执行后,ALU 输出端 F 的结果是 1FDB 9753H 、OF 的结果是 1 、 CF 的结果是 1 。
进位标志(CF)判断方式:
① 在无符号整数加法中,如果结果小于任一操作数,则置为 1(表示溢出),否则为 0。
② 在无符号整数减法中,如果被减数小于减数,则置为 1(表示借位),否则为 0。
溢出标志(OF)判断方式:
① 在有符号整数加法中,如果两个相同符号的数相加得到一个不同符号的结果,则 OF 置为 1(表示溢出)。
② 在有符号整数减法中,如果被减数和减数符号不同,且结果的符号与被减数相同,则 OF 置为 1(表示溢出)。
若该 add 指令处理的是无符号整数,则应根据 CF 标志判断是否溢出。
(3)因为 slli 指令的移位位数只使用 IR[31:20] 中的低 5 位,与高位 IR[31:25] 及扩展出来的位无关,故控制信号 Ext 的取值可以是 0(零扩展)也可以是 1(符号扩展)。
(4)执行 lw 指令时,控制信号 Ext 的取值是 1(符号扩展)、ALUctr 的取值是 000(加运算)。
(5)A040 A103H = A040 1010 0001 0000 0011H ,IR[6:0] = 0000011 、IR[14:12] = 010 ,可以判定该指令一定是 lw 指令。
lw 指令的高 12 位 = A04H ,经过符号扩展后,得到 32 位机器码为 FFFF FA04H ,所读取数据的存储地址为:FFFF A2D0H + FFFF FA04H = FFFF 9CD4H 。
2. 程序的机器级代码表示 10’
对于上题中的计算机 M ,C 语言程序 P 包含的语句 “sum += a[i]; ” 在 M 中对应的指令序列 S 如下。
slli r4, r2, 2 //R[r4]←R[r2]<<2
add r4, r3, r4 //R[r4]←R[r3]+R[r4]
lw r5, 0(r4) //R[r5]←M[R[r4]+0]
add rl, rl, r5 //R[r1]←R[r1]+R[r5]
已知变量 i、sum 和数组 a 都为 int 型,通用寄存器 r1 至 r5 的编号为 01H 至 05H 。
请回答下列问题。
(1)根据指令序列 S 中每条指令的功能,写出存放数组 a 的首地址、变量 i 和 sum 的通用寄存器编号。(3 分)
(2)已知 M 为小端方式计算机,采用页式存储管理方式,页大小为 4KB 。若执行到指令序列 S 中第 1 条指令时,i = 5 且 r1 和 r3 的内容分别为 0000 1332H 和 0013 DFF0H ,从地址 0013 DFF0H 开始的存储单元内容如下图所示,则执行 “sum += a[i]; ” 语句后,a[i] 的地址、a[i] 和 sum 的机器数分别是什么(用十六进制表示)?a[i] 所在页的页号是多少?此次执行中,数组 a 至少存放在几页中?(5 分)
地址 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
0013 DFF0 | FF | FF | FF | 7C | 70 | FE | FF | FF |
0013 DFF8 | 00 | 00 | 00 | 0C | 3C | 02 | 01 | FF |
0013 E000 | F0 | F1 | 00 | 00 | DC | EC | FF | FF |
0013 E008 | FF | FF | 01 | 02 | 00 | 00 | 01 | 02 |
(3)指令 “slli r4,r2,2” 的机器码是什么(用十六进制表示)?若数组 a 改为 short 类型,则指令序列 S 中 slli 指令的汇编形式应是什么?(2 分)
【解析】:
(1)存放数组 a 的首地址的通用寄存器编号为 r3 、存放变量 i 的通用寄存器编号为 r2 、存放 sum 的通用寄存器编号为 r1 。
(2)数组 a 的首地址为 0013 DFF0H ,因此 a[5] 的地址为 0013 DFF0H + 5 * 4 = 0013 E004H ,a[5] = FFFF ECDCH(注意是小端存储),sum = 0000 1332H + FFFF ECDCH = 0000 000EH 。
页大小为 4KB = 212 B ,则 a[5] 所在页的页号是 0013EH(高 20 位),此次执行中,数组 a 至少存放在 2 页中(0013DH 和 0013EH)。
(3)R[r4] ← R[r2] << 2
指令 | 31 → 25 | 24 → 20 | 19 → 15 | 14 → 12 | 11 → 7 | 6 → 0 | 指令功能说明 |
---|---|---|---|---|---|---|---|
slli | 0000000 | shamt | rs1 | 010 | rd | 0010011 | R[rd] ← R[rs1] << shamt |
slli | 0000000 | 00010 | 00010 | 010 | 00100 | 0010011 | R[4] ← R[2] << 2 |
指令 “slli r4,r2,2” 的机器码是 0021 2213H ,若数组 a 改为 short 类型,则指令序列 S 中 slli 指令的汇编形式应是 slli r4,r2,1 。
三、操作系统
1. 虚拟内存管理 7’
某计算机按字节编址,采用页式虚拟存储管理方式,虚拟地址和物理地址的长度均为 32 位,页表项的大小为 4 字节。页大小为 4 MB ,虚拟地址结构如下。
页号(10 位) | 页内偏移量(22 位) |
---|
进程 P 的页表起始虚拟地址为 B8C0 0000H ,被装载到从物理地址 6540 0000H 开始的连续主存空间中。
请回答下列问题,要求答案用十六进制表示。
(1)若 CPU 在执行进程 P 的过程中,访问虚拟地址 1234 5678H 时发生了缺页异常,经过缺页异常处理和 MMU 地址转换后得到的物理地址是 BAB4 5678H ,在此次缺页异常处理过程中,需要为所缺页分配页框并更新相应的页表项,则该页表项的虚拟地址和物理地址分别是什么?该页表项中的页框号更新后的值是什么?(3 分)
(2)进程 P 的页表所在页的页号是什么?该页对应的页表项的虚拟地址是什么?该页表项中的页框号是什么?(4 分)
【解析】:
(1)编号为 i 的页表项的地址 = 页表起始地址 + i × 每个页表项占用的地址数。1234 5678H 的高 10 位为 048H 。
该页表项的虚拟地址为 B8C0 0000H + 048H × 4 = B8C0 0120H ;
该页表项的物理地址为 6540 0000H + 048H × 4 = 6540 0120H 。
该页表项中的页框号更新后的值是 BAB4 5678H 的高 10 位,即 2EAH 。
(2)进程 P 的页表所在页的页号是 B8C0 0000H 的高 10 位,即 2E3H 。
该页对应的页表项的虚拟地址是 B8C0 0000H + 2E3H × 4 = B8C0 0B8CH 。
该页表项中的页框号是 6540 0000H 的高 10 位,即 195H 。
2. 同步与互斥 8’
计算机系统中的进程之间往往需要相互协作以完成一个任务。在某网络系统中,缓冲区 B 用于存放一个数据分组,对 B 的操作有 C1、C2 和 C3 。C1 将一个数据分组写入 B 中,C2 从 B 中读出一个数据分组,C3 对 B 中的数据分组进行修改。要求 B 为空时才能执行 C1 ,B 非空时才能执行 C2 和 C3 。
请回答下列问题。
(1)假设进程 P1 和 P2 均需要执行 C1 ,实现 C1 的代码是否为临界区?为什么?(2 分)
(2)假设 B 初始为空,进程 P1 执行 C1 一次,进程 P2 执行 C2 一次。请定义尽可能少的信号量,并用 wait() 、signal() 操作描述进程 P1 和 P2 之间的同步或互斥关系,说明所用信号量的作用及其初值。(3 分)
(3)假设 B 初始不为空,进程 P1 和 P2 各执行 C3 一次。请定义尽可能少的信号量,并用 wait() 、signal() 操作描述进程 P1 和 P2 之间的同步或互斥关系,说明所用信号量的作用及其初值。(3 分)
【解析】:
(1)实现 C1 的代码是临界区,由于代码 C1 将一个数据分组写入 B 中,因此进程 P1 和 P2 需要互斥的执行 C1 。
(2)进程 P1 和 P2 的同步伪代码:
Semaphore S = 0; //实现进程 P1 和 P2 的同步
P1{
…
C1;
signal(S);
…
}
P2{
…
wait(S);
C2;
…
}
(3)进程 P1 和 P2 的互斥伪代码:
Semaphore mutex = 1; //实现进程 P1 和 P2 的互斥
P1{
…
wait(mutex);
C3;
signal(mutex);
…
}
P2{
…
wait(mutex);
C3;
signal(mutex);
…
}
四、计算机网络
路由算法 9’
网络空间是继陆海空天之后的 “第五疆域” ,网络技术是网络疆域建设与治理的基础。路由算法与协议是网络核心技术之一,对其准确认知、合理选择与应用,对于网络建设十分重要。假设现有互联网中的 4 个自治系统互连拓扑示意图如下图所示。其中,AS1 运行内部网关协议 RIP ;AS3 规模较小,自治系统内任意两个主机间通信,经过路由器数量不超过 15 个;AS4 规模较大,自治系统内任意两个主机间通信,经过路由器数量可能超过 20 个。
请回答下列问题。
(1)若仅有 RIP 和 OSPF 内部网关协议供选择,则 AS4 应该选择哪个协议?(1 分)
(2)若 AS3 中的某主机向本自治系统内另一主机发送 1 个 IP 分组,为确保该 IP 分组能够被正常接收,则该 IP 分组的初始 TTL 值应该至少设置为多少?(1 分)
(3)假设 AS1 中的路由器同一时刻启动,启动后立即构建并交换初始距离向量,之后每隔 30s 交换一次最新的距离向量,则从交换初始距离向量时刻算起,R11~R16 路由器均获得到达网络 210.2.3.0/24 的正确路由,至少需要多长时间?均获得到达网络 210.2.4.0/24 的正确路由,至少需要多长时间?(2 分)
(4)R44 向 R13 通告到达网络 136.5.16.0/20 路由时,由 BGP 协议哪类会话完成?通过哪个 BGP 报文通告?R13 通过 BGP 协议的哪类会话将该网络可达性信息通告给 R14 和 R15?(3 分)
(5)若 R14 和 R15 均收到分别由 R11、R12、R13 通告的到达网络 136.5.16.0/20 的可达性信息如下。
目的网络 | AS 路径 | 下一跳 |
---|---|---|
136.5.16.0/20 | AS2 AS8 AS19 | R11 |
136.5.16.0/20 | AS3 AS7 AS11 AS19 | R12 |
136.5.16.0/20 | AS4 AS10 AS19 | R13 |
则在无策略约束情况下,R14 和 R15 更新路由表后,各自路由表中到达网络 136.5.16.0/20 路由的下一跳分别是什么(用路由器名称表示)?(2 分)
【解析】:
(1)AS4 应该选择 OSPF 内部网关协议。
(2)该 IP 分组的初始 TTL 值应该至少设置为 16 。
(3)R11~R16 路由器均获得到达网络 210.2.3.0/24 的正确路由,至少需要 30s ,均获得到达网络 210.2.4.0/24 的正确路由,至少需要 60s 。
(4)R44 向 R13 通告到达网络 136.5.16.0/20 路由时,由 BGP 协议的外部会话(eBGP)完成,通过哪个 Update 报文通告。
R13 通过 BGP 协议的内部会话(iBGP)将该网络可达性信息通告给 R14 和 R15 。
(5)R14 路由表中到达网络 136.5.16.0/20 路由的下一跳是 R11 ;R15 路由表中到达网络 136.5.16.0/20 路由的下一跳是 R13 。