2020年12月考研的408试题,本篇为大题部分,小题见上一篇。

声明:

  • 0x和0b分别表示十六进制数和二进制数,其余为十进制数。
  • 0y和0c分别表示十六进制形式补码和二进制形式补码。
  • exp()和log()分别是以2为底的指数和对数,exp10()以10为底。
  • 乘除号用最朴素的×÷,分数用/,⌊⌋⌈⌉分别是向上向下取整。
  • 参与计算的英文字母变量用的是手写体。
  • 对原题一些容易误会的文字做了修改。
  • 图片使用亿图图示等绘制。

二、综合应用:

第41~47题,共70分。

「41」(15分)、

已知无向连通图G由顶点集P和边集E组成,|E|>0,当G中度为奇数的顶点个数为≤2的偶数时,G存在包含所有边且长度为|E|的路径,称为EL"Euler"路径。设G采用邻接矩阵存储,类型定义如下👇,请设计算法int IsExistEL(MatrixGraph G),判断G是否存在EL路径,若存在则返回1,否则返回0。

typedef struct {                // 图的定义
    int numVertices, numEdges;  // 图中实际的顶点数和边数
    char VerticesList[MAXV];    // 顶点表 MAXV为已知常量
    bool Edge[MAXV][MAXV];      // 邻接矩阵 有边为true无边为false 
} MatrixGraph;                  // 图类型别名

问答:

1️⃣给出算法的基本设计思想?说明你所设计算法的时间复杂度和空间复杂度?

𝟙、题目已经给出算法思想。图G是无向连通的,遍历其邻接矩阵的每一行,行中true的个数为对应顶点的度。记录度为奇数的顶点个数,遍历完后,若该数为0或2则返回1,否则返回0。记顶点个数为n,时间复杂度𝜪(n^2),空间复杂度𝜪(1)

2️⃣根据设计思想,采用C/C++描述算法,关键之处给出注释?

𝟚、如下👇。

int IsExistEL(MatrixGraph G)
{
    int degree, odd_cnt = 0;
    for (int i = 0; i < G.numVertices; i++)
    {
        degree = 0;
        for (int j = 0; j < G.numVertices; j++)
        {
            degree += G.Edge[i][j]; // 依次计算每个顶点的度
        }
        if (degree % 2 == 1)
            odd_cnt++; // 记录度为奇数的顶点个数
    }
    return (odd_cnt == 0 || odd_cnt == 2) ? 1 : 0;
}

「42」(8分)、

已知某排序算法如下:

void CompareCountSort(int a[], int b[], int n)
{
    int* count = (int*) malloc(sizeof(int) * n);
    // int* count = new int[n];           C++方法
    memset(count, 0, sizeof(int) * n); // 数组清零
    for (int i = 0; i < n - 1; i++)
        for (int j = i + 1; j < n; j++)
            if (a[i] < a[j]) count[j]++;
            else             count[i]++;
    for (int i = 0; i < n; i++)
        b[count[i]] = a[i];
    free(count);
    // delete count;                      C++方法
}

问答:

1️⃣若有int a[] = {25, -10, 25, 10, 11, 19}, b[6];则调用CompareCountSort(a, b, 6)后数组b[]中的内容是什么?

𝟙、b[] = {-10, 10, 11, 19, 25, 25}

2️⃣若数组a[]中含有n个元素,则算法执行过程中,元素之间的比较次数是多少?

𝟚、(n-1)+(n-2)+...+2+1=n(n-2)/2。

3️⃣该算法是稳定的吗?若是,则阐述理由;否则,修改为稳定排序算法?

𝟛、该算法基于计数排序的思想,count[i]记录a[]有多少个元素不大于a[i],最后将a[i]放到b[]对应下标为count[i]的位置。该算法不稳定,修改第8行。

#8         if (a[i] <= a[j]) count[j]++;

「43」(15分)、

假定机器M字长为16位,按字节编址,连接CPU和Memory的系统总线中,地址线20位,数据线8位,采用16位定长指令字,指令格式及其说明如下,op1,op2,op3为操作码,rs,rt,rd为通用寄存器编号,R[r]表示寄存器r的内容,imm为立即数,target为转移目标的形式地址。

格式 6位 2位 2位 2位 4位 指令功能说明 R型 000000 rs rt rd op1 R[rd] ← R[rs] op1 R[rt]  I型 op2 rs rt imm ALU运算,条件转移,访存3类。 J型 op3 target PC的低10位 ← target      

问答:

1️⃣ALU的宽度是多少位?可寻址主存空间大小为多少字节?指令寄存器IR多少位?主存地址寄存器MAR和主存数据寄存器MDR各多少位?

𝟙、ALU的宽度与机器字长相同,16位。可寻址主存空间大小由地址线位数决定,exp(20)×1B=1MB。指令字定长16位,IR也是16位。地址线20位,MAR也是20位,数据线8位,MDR也是8位。

2️⃣R型格式最多可定义种操作?I型和J多少型格式总共最多可定义多少种操作?通用寄存器最多有多少个?

𝟚、op1占4位,R型格式最多exp(4)=16种操作。op2,op3共享高6位,且000000已归R型使用,I型和J型共最多exp(6)-1=63种操作。rs,rt,rd都是占2位,通用寄存器最多exp(2)=4个。

3️⃣假定op1为0010和0011时,分别表示有符号整数减法和有符号整数乘法,则机器代码0x01B2的功能是什么?若1,2,3号通用寄存器当前内容分别为0yB052,0y0008,0y0020,则分别执行机器代码0x01B2,0x01B3后,3号通用寄存器内容分别是什么?各自结果是否溢出?

𝟛、0x01B2=0b000000 011011 0010,功能为R[3]←R[1]-R[2],R[3]=0yB052-0y0008=0yB052+0yFFF8=0yB04A,未溢出。0x01B3=0b000000 011011 0011,功能为R[3]←R[1]×R[2],R[3]=0yB052×0y0008=0yB052<<3=0y8290,舍弃了高3位,发生了溢出。

4️⃣若采用I型格式的访存指令中偏移量imm为有符号整数,则地址计算时应对imm进行零扩展还是符号扩展?

𝟜、有符号整数采用符号扩展。

5️⃣无条件转移指令可以采用上述哪种指令格式?

𝟝、J型,直接修改PC完成跳转。

「44」(8分)、

假设机器M的主存地址为24位,按字节编址。采用分页存储管理方式,虚拟地址为30位,页大小为4KB。TLB采用2路组相联方式和LRU替换策略,共8组。

问答:

1️⃣虚拟地址中哪几位表示虚页号?哪几位表示页内偏移?

𝟙、页内偏移占log(4K)=12位,高30-12=18位就是虚页号。

2️⃣已知访问TLB时虚页号高位部分用作TLB标记,低位部分用作TLB组号。M的虚拟地址中哪几位是TLB标记?哪几位是TLB组号?

𝟚、TLB组号占log(8)=3位,高18-3=15位就是TLB标记。

3️⃣假设TLB初始时为空,访问的虚页号依次为10,12,16,7,26,4,12,20,在此过程中,哪一个虚页号对应的TLB表项被替换?

𝟛、对8取余可得映射到的TLB组号依次是2,4,0,7,2,4,4,4,TLB有2路,只有映射到4号组的虚页号>2,根据LRU算法,访问20号页面时,4号页面对应的TLB表项将被替换。

4️⃣若将M中的虚拟地址位数增加到32位,则TLB表项的位数增加几位?

𝟜、TLB表项就是TLB标记,增加2位。

「45」(7分)、

下面给出了整型信号量S的P(signal)V(wait)操作的功能描述,以及采用开/关中断指令实现信号量操作互斥的两种方法。

功能描述方法1方法2 semaphore S;
wait(S)
{
while (S <= 0) ;
S = S - 1;
}






signal(S)
{
S = S + 1;
}
semaphore S;
wait(S)
{
关中断
while (S <= 0) ;
S = S - 1;
开中断
}




signal(S)
{
关中断
S = S + 1;
开中断
}
semaphore S;
wait(S)
{
关中断
while (S <= 0)
{
开中断
关中断
}
S = S - 1;
开中断
}
signal(S)
{
关中断
S = S + 1;
开中断
}

问答:

1️⃣为什么在wait()和signal()操作中对信号量S的访问必须互斥进行?

𝟙、信号量也是一种临界资源,多个进程共享的变量。

2️⃣分别说明方法1和方法2是否正确?

𝟚、方法1错误,当进程1在wait()中,关中断状态下,进程2无法用signal()增加S,S≤0时while死循环。方法2正确,while循环体里有一个开中断,进程2就可以增加S,避免死循环。

3️⃣用户程序能否使用开/关中断指令实现临界区互斥?

𝟛、不行,开/关中断指令都是特权指令,用户态无法使用。

「46」(8分)、

某系统用硬盘作为启动盘,硬盘第一个扇区存放主引导记录,其中包含磁盘引导程序和分区表。磁盘引导程序用于选择要引导哪个分区的操作系统,分区表记录硬盘上各分区的位置等描述信息。硬盘被划分成若干个分区,每个分区的第一个扇区存放分区引导程序,用于引导该分区中的操作系统。系统采用多阶段引导方式,除了执行磁盘引导程序和分区引导程序外,还需要执行ROM中的引导程序。

问答:

1️⃣系统启动过程中❶操作系统初始化程序,❷分区引导程序,❸ROM中的引导程序,❹磁盘引导程序的执行顺序是什么?

𝟙、❸❹❷❶。启动系统时,最先运行ROM中的引导程序bootstrap,然后执行磁盘引导程序指示到具体分区上的操作系统,然后执行分区引导程序,引导该分区中的操作系统初始化。

2️⃣?把硬盘制作为启动盘时,需要完成:❶操作系统的安装,❷磁盘的低级格式化,❸磁盘的逻辑格式化,❹对磁盘进行分区,正确顺序是什么?

𝟚、❷❹❸❶。低级格式化通常硬盘出厂时已完成,作用是为每个磁道划分扇区,安排扇区在磁道中的排列顺序,并标记已损坏的扇区;将磁盘存储空间划分为相互独立的多个分区,如Windows中划C:盘D:盘,这些分区可以作多种用途,如安装不同的操作系统或应用程序;然后逻辑格式化,对扇区进行逻辑编号,建立逻辑盘的引导记录,文件分配表,文件目录表,数据区等,最后完成操作系统的安装。

3️⃣磁盘扇区的划分和文件系统根目录的建立分别在2️⃣的哪个操作中完成?

𝟛、由2️⃣所述解析可知,分别在低级格式化和逻辑格式化中完成。

「47」(9分)、

某网络拓扑如下,以太网交换机S通过路由器R与Internet互连。R的部分接口,本地域名服务器,主机H1,H2的IP地址和MAC地址如图中所示。为H1配置IP地址时,也配好了域名服务器和默认网关。在𝓉0时刻,H1的ARP表和S的交换表均为空,也没有Web服务器的域名与其IP地址映射关系的记录,H1在此刻利用浏览器通过域名www.abc.com请求访问Web服务器。在𝓉1时刻,S第一次收到了封装HTTP请求报文的以太网帧,假设从𝓉0至𝓉1期间网络未发生任何与此次与Web访问无关的网络通信。

问答:

1️⃣从𝓉0至𝓉1期间,H1除了HTTP之外还运行了哪个应用层的协议?从应用层到链数层,该应用层协议报文是通过哪些协议进行逐层封装的?

𝟙、还有DNS,以将域名转换为IP地址。DNS报文⮕UDP报⮕IP数据报⮕CSMA/CD帧。以太网单播帧:有线是IEEE802.3CSMA/CD帧,无线是IEEE802.11CSMA/CA帧。

2️⃣若S的交换表结构为⟨MAC地址,S的接口⟩,则𝓉1时刻S交换表的内容是什么?

𝟚、⟨00-11-22-33-44-cc,4⟩,⟨00-11-22-33-44-bb,1⟩,⟨00-11-22-33-44-aa,2⟩。

3️⃣从𝓉0至𝓉1期间,H2至少会接收到几个与此次Web访问相关的帧?接收到的是什么帧?帧的目的MAC地址是什么?

𝟛、2次,均是封装有ARP请求报文的以太网帧,目的MAC地址都是FF-FF-FF-FF-FF-FF。第1次是查询本地域名服务器的MAC地址,第2次是查询路由器R的MAC地址。

最后修改于:2024年10月09日
如果觉得我的文章对你有用请狠狠地打赏我