目录
讲解视频推荐:
【BOK408真题讲解-2021】
一、数据结构
1. 算法题(图的存储及基本操作)15’
已知无向连通图 G 由顶点集 V 和边集 E 组成,|E| > 0 ,当 G 中度为奇数的顶点个数为不大于 2 的偶数时,G 存在包含所有边且长度为 |E| 的路径(称为 EL 路径) 。设图 G 采用邻接矩阵存储,类型定义如下:
typedef struct{ //图的定义
int numVertices, numEdges; //图中实际的顶点数和边数
char VerticesList[MAXV]; //顶点表,MAXV 为己定义常量
int Edge[MAXV][MAXV]; //邻接矩阵
} MGraph;
请设计算法 int IsExistEL(MGraph G) ,判断 G 是否存在 EL 路径,若存在,则返回 1 ,否则返回 0 。要求:
(1)给出算法的基本设计思想。
(2)根据设计思想,采用 C 或 C++语言描述算法,关键之处给出注释。
(3)说明你所设计算法的时间复杂度和空间复杂度。
【解析】:
(1)对于采用邻接矩阵存储的无向图,邻接矩阵每行(列)中非零元素的个数为本行(列)对应顶点的度。可以依次计算连接图 G 中各顶点的度,并记录度为奇数的顶点数,若个数为 0 或 2 ,则返回 1 ,否则返回 0 。
(2)算法实现:
int IsExistEL(MGraph G){
int degree, i, j, count = 0;
for(i = 0; i < G.numVertices; i++){
degree = 0;
for(j = 0; j < G.numVertices; j++){
degree += G.Edge[i][j]; //依次计算各个顶点的度
}
if(degree%2 != 0){count++;} //对度为奇数的顶点计数
}
if(count == 0 || count == 2){return 1;} //存在 EL 路径
else{return 0;} //不存在 EL 路径
}
(3)算法需要遍历整个邻接矩阵,时间复杂度为 O(n2) ,空间复杂度为 O(1) 。
2. 内部排序算法 8’
已知某排序算法如下:
void cmpCountSort(int a[],int b[],int n){
int i, j, *count;
count = (int *)malloc (sizeof(int)*n}; //C++ 语言: count = new int[n];
for (i = 0; i < n; i++){count[i] = 0;}
for(i = 0; i < n-1; i++){
for(j = i+1; j < n; j++){
if(a[i] < a[j]){count[j]++;}
else{count[i]++;}
}
}
for(i = 0; i < n; i++){b[count[i]] = a[i];}
free(count); //C++ 语言: delete count;
}
请回答下列问题。
(1)若有 int a[] = {25, -10, 25, 10, 11,19} ,b[6] ,则调用 cmpCountSort(a, b, 6) 后数组 b 中的内容是什么?
(2)若 a 中含有 n 个元素,则算法执行过程中,元素之间的比较次数是多少?
(3)该算法是稳定的吗?若是,则阐述理由;否则,修改为稳定排序算法。
【解析】:
(1)b[] = {-10, 10, 11, 19, 25, 25} 。
(2)(n-1) + (n-2) + … + 1 = n·(n-1)/2 。
(3)不是。修改为:if(a[i] <= a[j]){count[j]++;} 。
二、计算机组成原理
1. 指令的寻址方式 15’
假定计算机 M 字长为 16 位,按字节编址,连接 CPU 和主存的系统总线中地址线为 20 位、数据线为 8 位,采用 16 位定长指令字,指令格式及其说明如下:
其中,op1~op3 为操作码, rs, rt 和 rd 为通用寄存器编号,R[r] 表示寄存器 r 的内容,imm 为立即数,target 为转移目标的形式地址。请回答下列问题。
(1)ALU 的宽度是多少位?可寻址主存空间大小为多少字节?指令寄存器、主存地址寄存器(MAR)和主存数据寄存器(MDR)分别应有多少位?
(2)R 型格式最多可定义多少种操作? I 型和 J 型格式总共最多可定义多少种操作?通用寄存器最多有多少个?
(3)假定 op1 为 0010 和 0011 时,分别表示带符号整数减法和带符号整数乘法指令,则指令 01B2H 的功能是什么(参考上述指令功能说明的格式进行描述) ?若 1, 2, 3 号通用寄存器当前内容分别为 B052H, 0008H, 0020H ,则分别执行指令 01B2H 和 01B3H 后,3 号通用寄存器内容各是什么?各自结果是否溢出?
(4)若采用 I 型格式的访存指令中 imm(偏移量)为带符号整数, 则地址计算时应对 imm 进行零扩展还是符号扩展?
(5)无条件转移指令可以采用上述哪种指令格式?
【解析】:
(1)ALU 的宽度是 16 位;可寻址主存空间大小为 220 = 1M 字节;指令寄存器应有 16 位、主存地址寄存器(MAR)应有 20 位、主存数据寄存器(MDR)应有 8 位。
ALU 的宽度通常与字长相同;指令寄存器和单条指令长度相同;MAR 和地址线位数相同;MDR 和数据线位数相同。
(2)R 型格式最多可定义 24 = 16 种操作;I 型和 J 型格式总共最多可定义 26 - 1 = 63 种操作(开头为 000000 的被 R 型指令占用);通用寄存器最多有 4 个。
(3)01B2H = 0000 0001 1011 0010 ,功能是:R[3] ← R[1] - R[2] ;
01B3H = 0000 0001 1011 0011 ,功能是:R[3] ← R[1] × R[2] ;
若 1, 2, 3 号通用寄存器当前内容分别为 B052H, 0008H, 0020H ,则执行指令 01B2H 后,3 号通用寄存器内容是 B04AH ,结果不溢出;执行指令 01B3H 后,3 号通用寄存器内容是 8290H(算数左移 3 位),结果溢出。
(4)若采用 I 型格式的访存指令中 imm(偏移量)为带符号整数, 则地址计算时应对 imm 进行符号扩展。
(5)无条件转移指令可以采用上述 J 型指令格式。(将 target 部分写入 PC 的低 10 位完成跳转)
2. 虚拟存储器 8’
假设计算机 M 的主存地址为 24 位,按字节编址;采用分页存储管理方式,虚拟地址为 30 位,页大小为 4KB ;TLB 采用 2 路组相联方式和 LRU 替换策略,共 8 组。请回答下列问题。
(1)虚拟地址中哪几位表示虚页号?哪几位表示页内地址?
(2)已知访问 TLB 时虚页号高位部分用作 TLB 标记,低位部分用作 TLB 组号,M 的虚拟地址中哪几位是 TLB 标记?哪几位是 TLB 组号?
(3)假设 TLB 初始时为空,访问的虚页号依次为 10, 12, 16, 7, 26, 4, 12 和 20 ,在此过程中,哪一个虚页号对应的 TLB 表项被替换?说明理由。
(4)若将 M 中的虚拟地址位数增加到 32 位,则 TLB 表项的位数增加几位?
【解析】:
(1)因为按字节编址,所以虚拟地址中高 18 位表示虚页号(虚拟地址为 30 位),低 12 位表示页内地址(页大小为 212B)。
(2)M 的虚拟地址中高 15 位是 TLB 标记,接下来的 3 位是 TLB 组号(TLB 采用 2 路组相联方式,共 8 = 23组)。
TLB 标记(15 位) | TLB 组号(3 位) | 页内地址(12 位) |
---|
(3)假设 TLB 初始时为空,访问的虚页号依次为 10, 12, 16, 7, 26, 4, 12 和 20 ,在此过程中,虚页号 4 对应的 TLB 表项被替换。
因为虚页号与 TLB 组号的映射关系为:TLB 组号 = 虚页号 mod TLB 组数 = 虚页号 mod 8 ,因此,虚页号 10, 12, 16, 7, 26, 4, 12, 20 映射到的 TLB 组号依次为:2, 4, 0, 7, 2, 4, 4, 4 。TLB 采用 2 路组相联方式和 LRU 替换策略,从上述映射到的 TLB 组号序列可以看出,只有映射到 4 号组的虚页号数量大于 2 ,相应虚页号依次是 12, 4, 12, 20 ,因此当访问到第 20 页时,虚页号 4 对应的 TLB 表项被替换出来。
(4)若将 M 中的虚拟地址位数增加到 32 位时,虚页号增加了 32 - 30 = 2 位,使得每个 TLB 表项中的标记字段增加 2 位,因此,每个 TLB 表项的位数增加 2 位。
三、操作系统
1. 同步与互斥 7’
下表给出了整型信号量 S 的 wait() 和 signal() 操作的功能描述,以及采用开/关中断指令实现信号量操作互斥的两种方法。
请回答下列问题。
(1)为什么在 wait() 和 signal() 操作中对信号量 S 的访问必须互斥执行?
(2)分别说明方法 1 和方法 2 是否正确。若不正确,请说明理由。
(3)用户程序能否使用开/关中断指令实现临界区互斥?为什么?
【解析】:
(1)因为信号量 S 是能被多个进程共享的变量,多个进程都可以通过 wait() 和 signal() 操作对 S 进行读写操作。所以,在 wait() 和 signal() 操作中对 S 的访问必须是互斥的。
(2)方法 1 错误,方法 2 正确。在方法 1 的 wait(S) 中,当 S <= 0 时,由于仍处于关中断中,其他进程无法修改 S 的值,因此会导致 while 语句陷入死循环。
(3)用户程序不能使用开/关中断指令实现临界区互斥。因为开中断和关中断都是特权指令。
2. 磁盘 8’
某计算机用硬盘作为启动盘,硬盘第一个扇区存放主引导记录,其中包含磁盘引导程序和分区表。磁盘引导程序用于选择要引导哪个分区的操作系统,分区表记录硬盘上各分区的位置等描述信息。硬盘被划分成若干分区,每个分区的第一个扇区存放分区引导程序,用于引导该分区中的操作系统。系统采用多阶段引导方式,除了执行磁盘引导程序和分区引导程序,还需要执行 ROM 中的引导程序。请回答下列问题。
(1)系统启动过程中操作系统的初始化程序、分区引导程序、ROM 中的引导程序、磁盘引导程序的执行顺序是什么?
(2)把硬盘制作为启动盘时,需要完成操作系统的安装、磁盘的物理格式化、逻辑格式化、对磁盘进行分区,执行这 4 个操作的正确顺序是什么?
(3)磁盘扇区的划分和文件系统根目录的建立分别是在第(2)问的哪个操作中完成的?
【解析】:
(1)ROM 中的引导程序 → 磁盘引导程序 → 分区引导程序 → 操作系统的初始化程序。
(2)磁盘的物理格式化 → 对磁盘进行分区 → 逻辑格式化 → 完成操作系统的安装。
(3)磁盘扇区的划分是在磁盘的物理格式化操作中完成的;文件系统根目录的建立是在逻辑格式化操作中完成的。
四、计算机网络
万维网 WWW 9’
某网络拓扑如下图所示,以太网交换机 S 通过路由器 R 与 Internet 互联。路由器部分接口、本地域名服务器、H1 、H2 的 IP 地址和 MAC 地址如图中所示。在 t0 时刻 H1 的 ARP 表和 S 的交换表均为空,H1 在此刻利用浏览器通过域名 www.abc.com 请求访问 Web 服务器,在 t1 时刻(t1 > t0)S 第一次收到了封装 HTTP 请求报文的以太网帧,假设从 t0 到 t1 期间网络未发生任何与此次 Web 访问无关的网络通信。
请回答下列问题。
(1)从 t0 到 t1 期间, H1 除 HTTP 外还运行了哪个应用层协议?从应用层到数据链路层,该应用层协议报文是通过哪些协议进行逐层封装的?
(2)若 S 的交换表结构为 <MAC 地址,端口>,则 t1 时刻 S 交换表的内容是什么?
(3)从 t0 到 t1 期间,H2 至少会接收到几个与此次 Web 访问相关的帧?接收到的是什么帧?帧的目的 MAC 地址是什么?
【解析】:
(1)从 t0 到 t1 期间, H1 除 HTTP 外还运行了 DNS(域名服务器)应用层协议;从应用层到数据链路层,该应用层协议报文通过DNS 报文 → UDP 数据报 → IP 数据报 → CSMA/CD 帧进行逐层封装。
(2)在 t1 时刻 S 交换表的内容是:
MAC 地址 | 端口 |
---|---|
00-11-22-33-44-cc | 4 |
00-11-22-33-44-bb | 1 |
00-11-22-33-44-aa | 2 |
(3)从 t0 到 t1 期间,H2 至少会接收到 2 个与此次 Web 访问相关的帧;接收到的均是封装 ARP 查询报文的以太网帧;帧的目的 MAC 地址是 FF-FF-FF-FF-FF-FF 。
t0 时刻,H1的 ARP 表和 S 的交换表为空。H1 利用浏览器通过域名请求访问 Web 服务器。由于要先解析域名,查询该域名对应的 IP 地址,因此要先向本地域名服务器发送 DNS 查询报文。ARP 表为空,因此需要先发送 ARP 请求分组,查询本地域名服务器对应的 MAC 地址,这个帧的目的 MAC 地址是 FF-FF-FF-FF-FF-FF 。S 接收到这个帧,在交换表中记录 MAC 地址为 00-11-22-33-44-cc ,位于端口 4 ,然后广播该帧。当本地域名服务器收到 ARP 请求后,向 H1 发送 ARP 响应分组。S 接收到这个帧,在交换表中记录 MAC 地址为 00-11-22-33-44-bb ,位于端口 1 ,然后将该帧从端口 4 发送出去。
得到了域名对应的 IP 地址,发现不在本局域网中,需要通过路由表转发。
H1 的 ARP 表中没有路由器对应的 MAC 地址,因此需要先发送 ARP 请求分组,查询路由器对应的 MAC 地址,这个帧的目的 MAC 地址是 FF-FF-FF-FF-FF-FF 。S 接收到这个帧,广播该帧。当路由器收到 ARP 请求后,向 H1 发送 ARP 响应分组。S 接收到这个帧,在交换表中记录 MAC 地址为 00-11-22-33-44-aa ,位于端口 2 ,然后将该帧从端口 4 发送出去。现在,H 就能发送 HTTP 请求了。在整个过程中,并没有涉及 H2 ,H2 没有主动发送数据,因此 S 不会记录 H2 的 MAC 地址和端口。