选择题
数据结构
设 n 是描述问题规模的非负整数,下列程序段的时间复杂度是( )。
x = 0;
while (n >= (x + 1) * (x + 1))
x = x + 1;
查看答案与解析
正确答案:B
正确答案:B假设第 k 次循环终止,则第 k 次执行时, ,x 的初始值为 0,第 k 次判断时,x=k-1,即 , ,,因此该程序段的时间复杂度为 。
整卷阅读
作答方式
阅读模式保留整卷文档,游戏模式按题闯关并即时反馈。
| 1 | B | 2 | B | 3 | C | 4 | A | 5 | C |
| 6 | A | 7 | D | 8 | C | 9 | B | 10 | D |
| 11 | B | 12 | C | 13 | A | 14 | D | 15 | D |
| 16 | D | 17 | B | 18 | C | 19 | B | 20 | C |
| 21 | A | 22 | D | 23 | B | 24 | C | 25 | C |
| 26 | B | 27 | C | 28 | B | 29 | C | 30 | B |
| 31 | A | 32 | C | 33 | C | 34 | A | 35 | B |
| 36 | B | 37 | B | 38 | C | 39 | D | 40 | B |
设 n 是描述问题规模的非负整数,下列程序段的时间复杂度是( )。
x = 0;
while (n >= (x + 1) * (x + 1))
x = x + 1;
正确答案:B
正确答案:B若将一棵树 T 转化为对应的二又树 BT,则下列对 BT 的遍历中,其遍历序列与 T 的后根遍历序列相同的是( )。
正确答案:B
正确答案:B本第一步,需要知道如何将一棵 树转化为二叉树:对于每一个结点,第一个孩子结点放左子树,其余孩子结点(即第一个孩子结点的兄弟结点)放在第一个孩子结点的右子树,其余的孩子结点再依次放在右子树的右子树,依次类推。
第二步,需要知道选项中的四种遍历方式先序遍历:该结点,左子树,右子树中序遍历:左子树,该结点,右子树后序遍历:左子树,右子树,该节点层次遍历:队列实现前 3 种遍历方式,左子树都是先于右子树,“先”、“中”、“后”指的是访问该结点的次序,对于上图,我们发现,对树的后序遍历与对二叉树的中序遍历相同,选 B。
对 n 个互不相同的符号进行哈夫曼编码。若生成的哈夫曼树共有 115 个结点,则 n 的值是( )。
在任意一棵非空平衡二叉树(AVL 树)T1 中,删除某结点 v 之后形成平衡二叉树 T2 ,再将 v 插入 T2 形成平衡二叉树 T3 。下列关于 T1 与 T3 的叙述中,正确的是( )。
I.若 v 是 T1 的叶结点,则 T1 与 T3 可能不相同
II.若 v 不是 T1 的叶结点,则 T1 与 T3 一定不相同
III.若 v 不是 T1 的叶结点,则 T1 与 T3 一定相同
正确答案:A
正确答案:A非空平衡二叉树中插入结点,在失去平衡调整前,一定插入在叶结点的位置。
若删除的是 T1 的叶结点,则删除后平衡二叉树不会失去平衡,即不会发生调整,再插入此结点得到的二叉平衡树 T1 与 T3 相同;若删除后平衡二叉树失去平衡而发生调整,再插入结点得到的二叉平衡树 T3 与 T1 可能不同。I 正确。例如,如下图所示,删除结点 0,平衡二叉树失衡调整,再插入结点 0 后,平衡二叉树和以前不同。
对于比较绝对的说法 II 和 III,通常只需举出反例即可。
若删除的是 T1 的非叶结点,且删除和插入操作均没有导致平衡二叉树的调整 (这时可以首先想到删除的结点只有一个孩子的情况),则该结点从非叶结点变成了叶结点,T1 与 T3 显然不同。例如,如下图所示,删除结点 2,用右孩子结点 3 填补,再插入结点 2,平衡二叉树和以前不同。
若删除的是 T1 的非叶结点,且删除和插入操作后导致了平衡二叉树的调整,则该结点有可能通过旋转后继续变成非叶结点,T1 与 T3 相同。例如,如下图所示,删除结点 2,用右孩子结点 3 填补,再插入结点 2,平衡二叉树失衡调整,调整后的平衡二叉树和以前相同。
下图所示的 AOE 网表示一项包含 8 个活动的工程。活动 d 的最早开始时间和最迟开始时间分别是( )。
正确答案:C
正确答案:C用有向无环图描述表达式 (x+y)*((x+y)/x),需要的顶点个数至少是( )。
正确答案:A
正确答案:A先将该表达式转换成有向二叉树,注意到该二叉树中有些顶点时重复的,为了节省存储空间,可以去除重复的顶点(使顶点个数达到最少),将有向二叉树去重转换成有向无环图,结果如图所示:
选择一个排序算法时,除算法的时空效率外,下列因素中,还需要考虑的是( )。
Ⅰ.数据的规模 Ⅱ.数据的存储方式 Ⅲ.算法的稳定性 Ⅳ.数据的初始状态
正确答案:D
正确答案:D现有长度为 11 且初始为空的散列表 HT,散列函数是 H(key)=key%7,采用线性探查(线性探测再散列)法解决冲突将关键字序列 87,40,30,6,11,22,98,20 依次插入到 HT 后,HT 查找失败的平均查找长度是( )。
正确答案:C
正确答案:C设主串 T=“abaabaabcabaabc”,模式串 S=“abaabc”,采用 KMP 算法进行模式匹配,到匹配成功时为止,在匹配过程中进行的单个字符间的比较次数是( )。
正确答案:B
正确答案:B假设位序都是从 0 开始的,按照 next 数组生成算法,对于 S 有
| 编号 | 0 | 1 | 2 | 3 | 4 | 5 |
| S | a | b | a | a | b | c |
| next | -1 | 0 | 0 | 1 | 1 | 2 |
根据 KMP 算法,第一趟连续对比 6 次,在模式串的 5 号位和主串的 5 号位匹配失败,模式串的下一个比较位置为 next[5],即下一次比较从模式串的 2 号位和主串 5 号位开始,然后直到模式串 5 号位和主串 8 号位匹配,第二趟比较 4 次,模式串匹配成功。单个字符的比较次数为 10 次,所以选 B。
排序过程中,对尚未确定最终位置的所有元素进行一遍处理称为一“趟”。下列序列中,不可能是快速排序第二趟结果的是( )。
正确答案:D
正确答案:D快速排序每趟都将基准元素放在其最终位置,然后以它为基准将序列划分为两个子序列,基准左边都比基准小,右边都比基准大。
排序过程中,对尚未确定最终位置的所有元素进行一遍处理称为一“趟”,故快速排序第一趟被枢轴分成的 两个子序列 在第二趟中应该 各放一个枢轴 在最终位置(也即如果第一趟的枢轴在中间,第二趟应该至少有 3 个元素在最终位置),如果枢轴的位置正好在首端或尾端,那第一趟就只被分成了 一个序列,那第二趟只能放 一个枢轴 在最终位置(也即如果枢轴在首尾,第二趟应该至少有 2 个元素在最终位置)
所以答案选择 D。
设外存上有 120 个初始归并段,进行 12 路归并时,为实现最佳归并,需要补充的虚段个数是( )。
正确答案:B
正确答案:B下列关于冯·诺依曼结构计算机基本思想的叙述中,错误的是( )。
正确答案:C
正确答案:C下列关于缺页处理的叙述中,错误的是( )。
正确答案:D
正确答案:D某计算机采用大端方式,按字节编址。某指令中操作数的机器数为 1234FF00H,该操作数采用基址寻址方式,形式地址(用补码表示)为 FF12H,基址寄存器内容为 F0000000H,则该操作数的 LSB(最低有效字节)所在的地址是( )。
正确答案:D
正确答案:D某指令功能为 R[r2] ← R[r1] + M[R[r0]],其两个源操作数分别采用寄存器、寄存器间接寻址方式。对于下列给定部件,该指令在取数及执行过程中需要用到的是( )。
I.通用寄存器组(GPRs) II. 算术逻辑单元(ALU)
II.存储器(Memory) IV. 指令译码器(ID)
在采用“取指、译码/取数、执行、访存、写回”5 段流水线的处理器中,执行如下指令序列,其中 s0、s1、s2、s3 和 t2 表示寄存器编号。
I1: add s2,s1,s0 // R[s2]←R[s1]+R[s0]
I2: load s3,0(t2) // R[s3]←M[R[t2]+0]
I3: add s2,s2,s3 // R[s2]←R[s2]+R[s3]
I4: store s2,0(t2) // M[R[t2]+0]←R[s2]
下列指令对中,不存在数据冒险的是( )。
正确答案:C
正确答案:C出这四条指令在流水线中执行的过程如下图所示:
数据冒险 指在程序中存在必须等前条指令执行完才能执行后一条指令的情况,此时这两条指令即为数据相关。其中 I1 和 I3、I2 和 I3、I3 和 I4 均发生了写后读相关,因此必须等相关的前条指令执行完才能执行后一条指令。只有 I2 和 I4 不存在数据冒险。所以答案选 C。
假定一台计算机采用 3 通道存储器总线,配套的内存条型号为 DDR3-1333,即内存条所接插的存储器总线的工作频率为 1333MHz,总线宽度为 64 位,则存储器总线的总带宽大约是( )。
正确答案:B
正确答案:B下列关于磁盘存储器的叙述中,错误的是( )。
正确答案:C
正确答案:C某设备以中断方式与 CPU 进行数据交换,CPU 主频为 1GHz,设备接口中的数据缓冲寄存器为 32 位,设备的数据传输率为 50KBps。若每次中断开销(包括中断响应和中断处理)为 1000 个时钟周期,则 CPU 用于该设备输入/输出的时间占整个 CPU 时间的百分比最多是( )。
正确答案:A
正确答案:A下列关于 DMA 方式的叙述中,正确的是( )。
Ⅰ. DMA 传送前由设备驱动程序设置传送参数
Ⅱ. 数据传送前由 DMA 控制器请求总线使用权
Ⅲ. 数据传送由 DMA 控制器直接控制总线完成
Ⅳ. DMA 传送结束后的处理由中断服务程序完成
下列关于线程的描述中,错误的是( )。
正确答案:B
正确答案:B下列选项中,可能将进程唤醒的事件是( )。
Ⅰ.I/O 结束
Ⅱ.某进程退出临界区
Ⅲ.当前进程的时间片用完
正确答案:C
正确答案:C下列关于系统调用的叙述中,正确的是( )。
Ⅰ.在执行系统调用服务程序的过程中,CPU 处于内核态
Ⅱ.操作系统通过提供系统调用避免用户程序直接访问外设
Ⅲ.不同的操作系统为应用程序提供了统一的系统调用接口
Ⅳ.系统调用是操作系统内核为应用程序提供服务的接口
正确答案:C
正确答案:C下列选项中,可用于文件系统管理空闲磁盘块的数据结构是( )。
Ⅰ. 位图
Ⅱ. 索引结点
Ⅲ. 空闲磁盘块链
Ⅳ. 文件分配表 (FAT)
正确答案:B
正确答案:B系统采用二级反馈队列调度算法进行进程调度。就绪队列 Q1 采用时间片轮转调度算法,时间片为 10ms;就绪队列 Q2 采用短进程优先调度算法;系统优先调度 Q1 队列中的进程,当 Q1 为空时系统才会调度 Q2 中的进程;新创建的进程首先进入 Q1;Q1 中的进程执行一个时间片后,若未结束,则转入 Q2。若当前 Q1,Q2 为空,系统依次创建进程 P1,P2 后即开始进程调度,P1,P2 需要的 CPU 时间分别为 30ms 和 20ms,则进程 P1,P2 在系统中的平均等待时间为( )。
正确答案:C
正确答案:C在分段存储管理系统中,用共享段表描述所有共享的段。若进程 P1 和 P2 共享段 S,下列叙述中,错误的是( )。
正确答案:B
正确答案:B某系统采用 LRU 页置换算法和局部置换策略,若系统为进程 P 预分配了 4 个页框,进程 P 访问页号的序列为 0, 1, 2, 7, 0, 5, 3, 5, 0, 2, 7, 6,则进程访问上述页的过程中,产生页置换的总次数是( )。
正确答案:C
正确答案:CLRU 每次执行页面置换时会换出最近最久没有使用过的页面。第一次访问 5 页面时,会把最久未被使用的 1 页面换出,第一次访问 3 页面时,会把最久未访问的 2 页面换出。具体的页面置换情况如下图所示:
| 访问页面 | 0 | 1 | 2 | 7 | 0 | 5 | 3 | 5 | 0 | 2 | 7 | 6 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 物理块 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 物理块 | 1 | 1 | 1 | 1 | 5 | 5 | 5 | 5 | 5 | 5 | 6 | |
| 物理块 | 2 | 2 | 2 | 2 | 3 | 3 | 3 | 3 | 7 | 7 | ||
| 物理块 | 7 | 7 | 7 | 7 | 7 | 7 | 2 | 2 | 2 | |||
| 缺页否 | √ | √ | √ | √ | √ | √ | √ | √ | √ |
需要注意的是:题中问的是页置换算法,而不是缺页次数,所以前 4 次缺页未还也的操作不考虑在内,答案为 5 次,故选 C。
下列关于死锁的叙述中,正确的是( )。
Ⅰ、可以通过剥夺进程资源解除死锁
Ⅱ、死锁的预防方法能确保系统不发生死锁
Ⅲ、银行家算法可以判断系统是否处于死锁状态
Ⅳ、当系统出现死锁时,必然有两个或两个以上的进程处于阻塞态
正确答案:B
正确答案:B某计算机主存按字节编址,采用二级分页存储管理,地址结构如下所示:
虚拟地址 20501225H 对应的页目录号、页号分别是( )。
正确答案:A
正确答案:A题中给出的是十六进制地址,首先将它转化为二进制地址,然后用二进制地址去匹配题中对应的地址结构。转换为进制地址和地址结构的对应关系如下所示。
2050 1225H = 0010 0000 01010000 00010010 00100101
前 10 位、1120 位、2132 位分别对应页目录号、页号和页内偏移。把页目录号、页号单独拿出,转换为十六进制时缺少的位数在高位补零,0000 1000 0001、0001 0000 0001 分别对应 081H、101H,选项 A 正确。
在下列动态分区分配算法中,最容易产生内存碎片的是( )。
正确答案:C
正确答案:COSI 参考模型的第 5 层(自下而上)完成的主要功能是( )
正确答案:C
正确答案:C100BaseT 快速以太网使用的导向传输介质是( )。
正确答案:A
正确答案:A对于滑动窗口协议,如果分组序号采用 3 比特编号,发送窗口大小为 5,则接收窗口最大是( )。
正确答案:B
正确答案:B假设一个采用 CSMA/CD 协议的 100Mbps 局域网,最小帧长是 128 B,则在一个冲突域内两个站点之间的单向传播延时最多是( )。
正确答案:B
正确答案:B若将 101.200.16.0/20 划分为 5 个子网,则可能的最小子网的可分配 IP 地址数是( )。
正确答案:B
正确答案:B某客户通过一个 TCP 连接向服务器发送数据的部分过程如题 38 图所示。客户在 时刻第一次收到确认序列号 ack_seq=100 的段,并发送序列号 seq=100 的段,但发生丢失。若 TCP 支持快速重传,则客户重新发送 seq=100 段的时刻是( )。
正确答案:C
正确答案:C若主机甲主动发起一个与主机乙的 TCP 连接,甲、乙选择的初始序列号分别为 2018 和 2046,则第三次握手 TCP 段的确认序列号是( )。
下列关于网络应用模型的叙述中,错误的是( )。
正确答案:B
正确答案:B设线性表 采用带头结点的单链表保存,链表中的结点定义如下:
typedef struct node {
int data;
struct node *next;
} NODE;
请设计一个空间复杂度为 且时间上尽可能高效的算法,重新排列 中的各结点,得到线性表 。要求:
(1) 给出算法的基本设计思想。
(2) 根据设计思想,采用 C 或 C++ 语言描述算法,关键之处给出注释。
(3) 说明你所设计算法的时间复杂度。
1)算法的基本设计思想:先观察 L( ) 和 L’( ),发现 L’ 是由 L 摘取第一个元素,再摘取倒数第一个元素 依次合并而成的。为了方便链表后半段取元素,需要先将 L 后半段原地逆置[题目要求空间复杂度为 助栈],否则每取最后一个结点都需要遍历一次链表。
①先找出链表 L 的中间结点,为此设置两个指针 p 和 q,指针 p 每次走一步,指针 q 每次走两步,当指针 q 到达链尾时,指针 p 正好在链表的中间结点;
②然后将 L 的后半段结点原地逆置。
③从单链表前后两段中依次各取一个结点,按要求重排。
2)算法实现如下:
// 找到链表的中间结点
NODE *findMiddleNode(NODE *head) {
NODE *slow = head;
NODE *fast = head;
while (fast != NULL) {
fast = fast->next;
if (fast != NULL) {
fast = fast->next;
}
slow = slow->next;
}
return slow;
}
// 反转链表
NODE *reverse(NODE *start) {
NODE *p = start;
NODE *q = start->next;
while (q != NULL) {
NODE *tmp = q->next;
q->next = p;
p = q;
q = tmp;
}
return p;
}
// 1. 找到中位结点
// 2. 翻转后一半链表
// 3. 遍历两个链表,依次穿插所有结点
void solve(HEAD *head) {
if (head->next == NULL) {
return;
}
NODE *middle = findMiddleNode(head);
NODE *list2 = reverse(middle);
NODE *list1 = head->next;
// 穿插操作
NODE *p = list1;
NODE *q = list2;
// 退出循环的条件
// 链表长度为奇数:p == q
// 链表长度为偶数:p->next == q
// while (!(p == q || p->next == q))
while (p != q && p->next != q) {
NODE *tmp1 = p->next;
NODE *tmp2 = q->next;
p->next = q;
q->next = tmp1;
p = tmp1;
q = tmp2;
}
}
3)第 1 步找中间结点的时间复杂度为 O(n),第 2 步逆置的时间复杂度为 O(n),第 3 步合并链表的时间复杂度为 O(n),所以该算法的时间复杂度为 O(n)。
请设计一个队列,要求满足:
① 初始时队列为空;
② 入队时,允许增加队列占用空间;
③ 出队后,出队元素所占用的空间可重复使用,即整个队列所占用的空间只增不减;
④ 入队操作和出队操作的时间复杂度始终保持为 O(1) 。
请回答下列问题:
(1) 该队列是应选择链式存储结构,还是应选择顺序存储结构?
(2) 画出队列的初始状态,并给出判断队空和队满的条件。
(3) 画出第一个元素入队后的队列状态。
(4) 给出入队操作和出队操作的基本过程。
1)顺序存储无法满足要求②的队列占用空间随着入队操作而增加。根据要求来分析:要求①容易满足;链式存储方便开辟新空间,要求②容易满足;对于要求③,出队后的结点并不真正释放,用队头指针指向新的队头结点,新元素入队时,有空余结点则无须开辟新空间,赋值到队尾后的第一个空结点即可,然后用队尾指针指向新的队尾结点,这就需要设计成一个首尾相接的循环单链表,类似于循环队列的思想。设置队头、队尾指针后,链式队列的入队操作和出队操作的时间复杂度均为 O(1),要求④可以满足。因此,采用链式存储结构(两段式单向循环链表),队头指针为 front,队尾指针为 rear。
2)该循环链式队列的实现,可以参考循环队列,不同之处在于循环链式队列可以方便增加空间,出队的结点可以循环利用,入队时空间不够也可以动态增加。同样,循环链式队列也要区分队满和队空的情况,这里参考循环队列牺牲一个单元来判断。初始时,创建只有一个空闲结点的循环单链表,头指针 front 和尾指针 rear 均指向空闲结点,如下图所示。
队空的判定条件:front == rear。
队满的判定条件:front == rear->next。
3)插入第一个元素后的状态如下图所示。
4)操作的基本过程:
入队操作
if (front == rear->next)
则在 rear 后面插入一个新的空闲结点;
入队元素保存到 rear 所指结点中;rear=rear->next;返回。
出队操作
if(front==rear) // 队空
则出队失败,返回;
取 front 所指结点中的元素 e;front=front->next;返回 e。
有 n(n ≥ 3)位哲学家围坐在一张圆桌边,每位哲学家交替地就餐和思考。在圆桌中心有 m(m ≥ 1)个碗,每两位哲学家之间有一根筷子。每位哲学家必须取到一个碗和两侧的筷子后,才能就餐,进餐完毕,将碗和筷子放回原位,并继续思考。为使尽可能多的哲学家同时就餐,且防止出现死锁现象,请使用信号量的 P、V 操作(wait()、signal() 操作)描述上述过程中的互斥与同步,并说明所用信号量及初值的含义。
回顾传统的哲学家就餐问题,假设餐桌上有 n 个哲学家、根筷子,那么可以用这种方法避免死锁:限制至多允许 n-1 个哲学家同时“抢”筷子,那么至少会有 1 个哲学家可以获得两根筷子并顺利进餐,于是不可能发生死锁的情况。
本题可以用碗这个限制资源来避免死锁:当碗的数量 m 小于哲学家的数量 n 时,可以直接让碗的资源量等于 m,确保不会出现所有哲学家都拿一侧筷子而无限等待另一侧筷子进而造成死锁的情况;当碗的数量大于等于哲学家的数量时,为了让碗起到同样的限制效果,我们让碗的资源量等于 -1,这样就能保证最多只有 n-1 个哲学家同时进餐,所以得到碗的资源量为 min{n-1, m}。在进 PV 操作时,碗的资源量起限制哲学家取筷子的作用,所以需要先对碗的资源量进行 P 操作。具体过程如下:
// 限制哲学家能同时拿到盘子的数量
semaphore fork[n] = {1};
// 并发盘子数量 < n
semaphore plate = min(m, n-1);
philosopher(int i) {
while (1) {
think();
P(plate);
P(fork[i]);
P(fork[(i + 1) % n]);
eat();
V(fork[i]);
V(fork[(i + 1) % n]);
V(plate);
}
}
某计算机系统中的磁盘有 300 个柱面,每个柱面有 10 个磁道,每个磁道有 200 个扇区,扇区大小为 512B。文件系统的每个簇包含 2 个扇区。请回答下列问题:
(1) 磁盘的容量是多少?
(2) 假设磁头在 85 号柱面上,此时有 4 个磁盘访问请求,簇号分别为 100260、60005、101660 和 110560。若采用最短寻道时间优先 (SSTF) 调度算法,则系统访问簇的先后次序是什么?
(3) 第 100530 簇在磁盘上的物理地址是什么?将簇号转换成磁盘物理地址的过程是由 I/O 系统的什么程序完成的?
1)磁盘容量 = 磁盘的柱面数每个柱面的磁道数每个磁道的扇区数每个扇区的大小 = 。
2)磁头在 85 号柱面上,对 SSTF 算法而言,总是访问当前柱面距离最近的地址。注意每 个簇包含 2 个扇区,通过计算得到,85 号柱面对应的簇号为 85000~85999。通过比较得 出,系统最先访问离 85000~85999 最近的 100260,随后访问离 100260 最近的 101660, 然后访问 110560,最后访问 60005。顺序为 100260、101660、110560、60005。
3)参考 CHS 地址,第 100530 簇在磁盘上的物理地址由其所在的柱面号、磁道号、扇区号构成。
柱面号= ⌊簇号/每个柱面的簇数⌋ = ⌊100530/(10×200/2)⌋ = 100。
磁道号 = ⌊(簇号%每个柱面的簇数)/每个磁道的簇数⌋ = ⌊530/(200/2)⌋ = 5。
扇区号 = 扇区地址%每个磁道的扇区数 = (530×2) % 200 = 60。
将簇号转换成磁盘物理地址的过程由磁盘驱动程序完成。
已知 ,计算 的 C 语言函数 f1 的源程序(阴影部分)及其在 32 位计算机 M 上的部分机器级代码如下:
int f1(int n) {
1 00401000 55 push ebp
... ... ...
if(n>1)
11 00401018 83 7D 08 01 cmp dword ptr [ebp+8],1
12 0040101C 7E 17 jle f1+35h (00401035)
return n*f1(n-1);
13 0040101E 8B 45 08 mov eax, dword ptr [ebp+8]
14 00401021 83 E8 01 sub eax, 1
15 00401024 50 push eax
16 00401025 E8 D6 FF FF FF call f1 ( 00401000)
... ... ...
19 00401030 0F AF C1 imul eax, ecx
20 00401033 EB 05 jmp f1+3Ah (0040103a)
else return 1;
}
21 00401035 B8 01 00 00 00 mov eax,1
... ... ...
26 00401040 3B EC cmp ebp, esp
... ... ...
30 0040104A C3 ret
其中,机器级代码行包括行号、虚拟地址、机器指令和汇编指令,计算机 M 按字节编址,int 型数据占 32 位。请回答下列问题:
(1) 计算 f(10) 需要调用函数 f1 多少次?执行哪条指令会递归调用 f1?
(2) 上述代码中,哪条指令是条件转移指令?哪几条指令一定会使程序跳转执行?
(3) 根据第 16 行的 call 指令,第 17 行指令的虚拟地址应是多少?已知第 16 行的 call 指令采用相对寻址方式,该指令中的偏移量应是多少(给出计算过程)?已知第 16 行的 call 指令的后 4 字节为偏移量,M 是采用大端方式还是采用小端方式?
(4) f(13)=6227020800,但 f1(13) 的返回值为 1932053504,为什么两者不相等?要使 f1(13) 能返回正确的结果,应如何修改 f1 的源程序?
(5) 第 19 行的 imul 指令(带符号整数乘)的功能是 R[eax]←R[eax]×R[ecx],当乘法器输出的高、低 32 位乘积之间满足什么条件时,溢出标志 OF=1?要使 CPU 在发生溢出时转异常处理,编译器应在 imul 指令后应加一条什么指令?
1)计算 f(10) 需要调用函数 f1 共 10 次,执行第 16 行的 call 指令会递归调用 f1。
2)第 12 行的 jle 指令是条件转移指令,其含义为小于等于时转移,本行代码的意义为:当 n≤1 时,跳转至地址 0040 1035H。第 16 行的 call 指令为函数调用指令,第 20 行的 jmp 指令为无条件转移指令,第 30 行的 ret 指令为子程序的返回指令,这三条指令一定会使程序跳转执行。
3)其长度计算机 M 上按字节编址,第 16 行的 call 指令的虚拟地址为 0040 1025H,长度为 5 字节,故第 17 行的指令的虚拟地址为 0040 1025H + 5 = 0040 102AH。第 16 行的 call 指令采用相对寻址方式,即目标地址 = (PC) +偏移量,call 指令的目标地址为 0040 1000H,所以偏移量 = 目标地址 - (PC) = 0040 1000H - 0040 102AH = FFFF FFD6H。根据第 16 行的 call 指令的偏移量字段为 D6 FF FF FF,可以确定 M 采用小端方式。
4)因为 f(13) = 6227020800,其结果超出了 32 位 int 型数据可表示的最大范围,因此 f(13) 的返回值是一个发生了溢出的错误结果。为使 f1(13) 能返回正确结果,可将函数 f1 的返回值类型改为 double(或 long long,或 long double,或 float)类型。
5)若乘积的高 33 位为非全 0 或非全 1,则 OF=1。编译器应在 imul 指令后加一条“溢出自陷指令”,使得 CPU 自动查询溢出标志 OF,当 OF=1 时调出“溢出异常处理程序”。
对于上题,若计算机 M 的主存地址为 32 位,釆用分页存储管理方式,页大小为 4KB,则第 1 行的 push 指令和第 30 行的 ret 指令是否在同一页中(说明理由)?若指令 Cache 有 64 行,采用 4 路组相联映射方式,主存块大小为 64B,则 32 位主存地址中,哪几位表示块内地址?哪几位表示 Cache 组号?哪几位表示标记(tag)信息?读取第 16 行的 call 指令时,只可能在指令 Cache 的哪一组中命中(说明理由)?
因为页大小为 4KB,所以虚拟地址的高 20 位为虚拟页号。第 1 行的 push 指令和第 30 行的 ret 指令的虚拟地址的高 20 位都是 00401H,因此两条指令在同一页中。
指令 Cache 有 64 块,采用 4 路组相联映射方式,故指令 Cache 共有 64/4 = 16 组,Cache 组号共 4 位。主存块大小为 64B,故块内地址为低 6 位。综上所述,在 32 位主存地址中,低 6 位为块内地址,中间 4 位为组号,高 22 位为标记。
因为页大小为 4KB,所以虚拟地址和物理地址的最低 12 位完全相同,因而 call 指令虚拟地址 0040 1025H 中的 025H = 0000 0010 0101B 为物理地址的低 12 位,对应的 7~10 位为组号,故对应的 Cache 组号为 0。
某网络拓扑如题 47 图所示,其中 R 为路由器,主机 HI~H4 的 IP 地址配置以及 R 的各接口 IP 地址配置如图中所示。现有若干台以太网交换机(无 VLAN 功能)和路由器两类网络互连设备可供选择。
请回答下列问题:
(1) 设备 1、设备 2 和设备 3 分别应选择什么类型网络设备?
(2) 设备 1、设备 2 和设备 3 中,哪几个设备的接口需要配置 IP 地址?并为对应的接口配置正确的 IP 地
址。
(3) 为确保主机 H1~H4 能够访问 Internet,R 需要提供什么服务?
(4) 若主机 H3 发送一个目的地址为 192.168.1.127 的 IP 数据报,网络中哪几个主机会接收该数据报?
1)以太网交换机(无 VLAN 功能)连接的若干 LAN 仍然是一个网络(同一个广播域),路由器可以连接不同的 LAN、不同的 WAN 或把 WAN 和 LAN 互联起来,隔离了广播域。IP 地址 192.168.1.2/26 与 192.168.1.3/26 的网络前缀均为 192.168.1.0,视为 LAN1。IP 地址 192.168.1.66/26 与 192.168.1.67/26 的网络前缀均为 192.168.1.64,视为 LAN2。所以设备 1 为路由器,设备 2、3 为以太网交换机。
2)设备 1 为路由器,其接口应配置 IP 地址。IF1 接口与路由器 R 相连,其相连接口的 IP 地址为 192.168.1.253/30,253 的二进制表示形式为 11111101,故 IF1 接口的网络前缀也应为 192.168.1.111111,已分配 192.168.1.253,去除全 0 全 1,IF1 接口的 IP 地址应为 192.168.1.254。LAN1 的默认网关为 192.168.1.1,LAN2 的默认网关为 192.168.1.65,网关的 IP 地址是具有路由功能的设备的 IP 地址,通常默认网关地址就是路由器中的 LAN 端口地址,设备 1 的 IF2、IF3 接口的 IP 地址分别设置为 192.168.1.1 和 192.168.1.65。
3)私有地址段:C 类 192.168.0.0~192.168.255.255,即 H1~H4 均为私有 IP 地址,若要能够访问 Internet,R 需要提供 NAT 服务,即网络地址转换服务。
4)主机 H3 发送一个目的地址为 192.168.1.127 的 IP 数据报,主机号全为 1,为本网络的广播地址,由于路由器可以隔离广播域,只有主机 H4 会接收到数据报。
关卡模式
每次只看一题,提交后立即显示对错、答案和解析。退出到阅读模式时会自动保留进度。
有 7 题因缺少可判定答案,已自动跳过,不影响当前闯关。
结算结果
本次全对。