shuatigo
只考虑主考点
计算机408

2019计算机408全卷预览

2019年计算机408真题

2019年计算机408真题完整试卷,包含 40 道选择题、0 道填空题和 7 道解答题,共 47 题,题目分值合计 150 分。可按目录阅读全卷,展开参考答案解析,或进入对应题目练习。

返回年度练习
47题全卷题目
150分题目分值合计
40题选择题 · 80分
0题填空题 · 0分
7题解答题 · 70分

选择题

40 题 · 共 80 分

第 1 题

数据结构
2 分

设n是描述问题规模的非负整数,下列程序段的时间复杂度是( )。

c 复制代码
x = 0;
while (n >= (x + 1) * (x + 1))
    x = x + 1;

A. O(logn)

B. O(n1/2)O(n^{1/2})

C. O(n)

D. O(n2)O(n^2)

查看答案与解析收起答案与解析

参考答案:B

答案:B。

**思路:**时间复杂度取决于循环体执行次数。变量 x 从 0 开始,每次只增加 1,循环条件要求 (x+1)2≤n(x+1)^2\le n,因此循环会把 x 增加到满足 x2≤nx^2\le n 的最大整数,即 ⌊n⌋\lfloor\sqrt n\rfloor。

例如 n=10 时,依次检查 1、4、9、16,前三次满足,循环体执行 3 次,最终 x=3;一般也是约 n\sqrt n 次,每次乘法、比较、自增按基本常数时间操作计算,所以为 Θ(n)\Theta(\sqrt n),选 B。A 的对数复杂度通常对应每轮成倍缩小或增加规模,本程序没有这种变化;C、D 没利用平方条件对循环次数的限制。n=0 时循环一次也不执行,不影响渐近结论。复杂度分析采用题目的整数运算抽象,不把实际类型乘法溢出当作正常循环行为。

进入练习

第 2 题

数据结构
2 分

若将一棵树T转化为对应的二叉树BT,则下列对BT的遍历中,其遍历序列与T的后根遍历序列相同的是( )。

A. 先序遍历

B. 中序遍历

C. 后序遍历

D. 按层遍历

查看答案与解析收起答案与解析

参考答案:B

答案:B。

**基础:**树转二叉树采用左孩子、右兄弟表示:二叉树左指针指向原树第一个孩子,右指针指向下一个兄弟。原树后根遍历先从左到右完成各孩子子树,最后访问根;二叉树中序则先左、再根、再右。

对某个原树孩子,中序先处理它的左孩子链,完成自己的全部后代,再访问自己;接着沿右兄弟转向下一孩子,依次重复。于是所有孩子都按原顺序后根访问,最后回到原树根,恰好等同于原树后根遍历,选 B。例:根 A 有孩子 B、C,B 有孩子 D;原树后根为 D,B,C,A,转换后的二叉树中序也是如此。A 先序会先输出 A,C 后序会把右兄弟 C 排到 B 前,D 按层输出先根后浅层,都不符合后根规则。

进入练习

第 3 题

数据结构
2 分

对n个互不相同的符号进行哈夫曼编码。若生成的哈夫曼树共有115个结点,则n的值是( )。

A. 56

B. 57

C. 58

D. 60

查看答案与解析收起答案与解析

参考答案:C

答案:C。

**基础:**n 个符号对应哈夫曼树的 n 个叶结点,构造中每次把两棵树合成一棵,生成一个有两个孩子的内部结点。从 n 棵单结点树合并到 1 棵,需要 n−1 次合并,所以内部结点恰为 n−1,总结点数为 n+(n−1)=2n−1n+(n-1)=2n-1。

题目给出总数 115,解 2n−1=1152n-1=115,得 n=(115+1)/2=58n=(115+1)/2=58,选 C。A 的 56 对应总数 111;B 的 57 对应 113;D 的 60 对应 119,均不匹配。也可从二叉树性质推导:没有度为 1 的结点时,叶数比度为 2 的结点数多 1。不能把 115 直接当成符号数量,因为多数结点是构造时添加的内部结点,并不代表原始符号。

进入练习

第 4 题

数据结构
2 分

在任意一棵非空平衡二叉树(AVL 树)T1T_{1} 中,删除某结点 v 之后形成平衡二叉树 T2T_{2},再将 v 插入 T2T_{2} 形成平衡二叉树 T3T_{3}。下列关于 T1T_{1} 与 T3T_{3} 的叙述中,正确的是( )。

I. 若 v 是 T1T_{1} 的叶结点,则 T1T_{1} 与 T3T_{3} 可能不相同

II. 若 v 不是 T1T_{1} 的叶结点,则 T1T_{1} 与 T3T_{3} 一定不相同

III. 若 v 不是 T1T_{1} 的叶结点,则 T1T_{1} 与 T3T_{3} 一定相同

A. 仅I

B. 仅II

C. 仅I、II

D. 仅I、III

查看答案与解析收起答案与解析

参考答案:A

答案:A。

**基础:**AVL 只保证有序与每结点左右高度差不超过 1,同一组关键字可能有不同合法树形;删除后重新插入,不是对删除过程逐步做逆操作。

I 为真。例如原树根为 4,左孩子 2(孩子为 1、3),右孩子为叶 5。删除 5 后需对 4 右旋,根变为 2、右孩子为 4(左孩子 3);再插入 5 到 4 的右侧,新树仍平衡,根保持 2,和原树不同。

II 为假:树根 2、左右叶 1、3,删除非叶根 2 时以 3 替代,再插入 2 引起 LR 调整,可回到根 2、左右叶 1、3。III 也为假:原树根 2、左叶 1、右孩子 4(左右叶 3、5);删除 2 用后继 3 替代,再插入 2 为 1 的右孩子,树已平衡,无需恢复根 2。故非叶删除重插既可能相同,也可能不同,只有 I 正确,选 A;B、C含错误的II,D含错误的III。

进入练习

第 5 题

数据结构
2 分

下图所示的AOE网表示一项包含8个活动的工程。活动d的最早开始时间和最迟开始时间分别是( )。

2019 年第 5 题配图

A. 3和7

B. 12和12

C. 12和14

D. 15和15

查看答案与解析收起答案与解析

参考答案:C

答案:C。

**基础:**AOE 网的边表示活动,顶点表示事件。活动 d 是 2→4、持续 7;最早开始等于起点事件的最早时间,最迟开始等于终点事件的最迟时间减活动长度。事件需等待所有前置活动完成,正向取最大值;反向求最迟时间则取最小值。

设事件 1 最早为 0,事件 3 为 8;事件 2 为 max⁡(3,8+4)=12\max(3,8+4)=12;事件 4 为 12+7=1912+7=19;事件 5 为 max⁡(12+6,8+10)=18\max(12+6,8+10)=18;终点 6 为 max⁡(19+6,18+9)=27\max(19+6,18+9)=27。由终点反推,事件 4 最迟为 27−6=2127-6=21,所以 d 最迟为 21−7=1421-7=14,最早为 12,选 C。A 忽略 3→2 的前置约束,B 把 d 错认成没有余量的关键活动,D 与实际正反向时间均不符。d 有 2 个时间单位余量。

进入练习

第 6 题

数据结构
2 分

用有向无环图描述表达式((x+y)*((x+y)/x)),需要的顶点个数至少是( )。

A. 5

B. 6

C. 8

D. 9

查看答案与解析收起答案与解析

参考答案:A

答案:A。

**基础:**表达式树通常为每次出现的操作数和运算建立结点;表达式 DAG 则允许重复的同一子表达式共享一个结果结点,从而减少结点数。本题两个 x+y 完全相同,只需算一次并让乘法与除法共同引用它,变量 x 的多次使用也可共享。

建立两个叶结点 x、y;一个加法结点 P=x+y;一个除法结点 Q=P/x;一个乘法结点 R=P×Q。总数为 2+1+1+1=52+1+1+1=5,选 A。B 的 6 保留了不必要的重复变量结点,C 的 8、D 的 9 都没有充分共享重复部分;直接建立不共享的表达式树会有更多结点。少于 5 也不可行,因为 x、y 是不同变量,而 +、/、× 是三个不同的必要运算,每种都至少需要一个结点。

进入练习

第 7 题

数据结构
2 分

选择一个排序算法时,除算法的时空效率,下列因素中,还需要考虑的是( )。

I. 数据的规模

II. 数据的存储方式

III. 算法的稳定性

IV. 数据的初始状态

A. 仅III

B. 仅I、II

C. 仅II、III、IV

D. I、II、III、IV

查看答案与解析收起答案与解析

参考答案:D

答案:D。

**逐项理解:**I 数据规模影响算法选择,小规模用简单插入排序可能开销低,大规模更应关注 O(nlog⁡n)O(n\log n) 等效率。II 存储方式影响能否高效随机访问,例如数组适合下标访问,链表不宜反复按位置扫描,而归并可较自然地处理链表。

III 稳定性用于保留相等关键字记录的原先次序,多关键字逐次排序时尤其重要;某些场景必须选稳定算法。IV 初始状态影响实际工作量,例如直接插入排序处理基本有序数据很快,而某些枢轴选法的快速排序遇到有序序列可能退化。四项都是时空效率之外的实际选择依据,选 D。A 只考虑稳定性,B 漏掉稳定性与初始状态,C 漏掉数据规模。不能仅比较最坏复杂度公式就忽视输入结构与业务对相同关键字顺序的要求。

进入练习

第 8 题

数据结构
2 分

现有长度为11且初始为空的散列表 HT,散列函数是 H(key) = key % 7,采用线性探查(线性探测再散列)法解决冲突。将关键字序列 87,40,30,6,11,22,98,20 依次插入 HT 后,HT查找失败的平均查找长度是( )。

A. 4

B. 5.25

C. 6

D. 6.29

查看答案与解析收起答案与解析

参考答案:C

答案:C。

**步骤:**散列初始地址由 key mod 7 给出,但线性探测的回绕范围是整张长度 11 的表,不能改写散列函数。依次插入:87→3,40→5,30→2,6→6,11→4,22→1,98→0,20 初始为 6,遇到 6 号已占用,改放 7。

下标 0 1 2 3 4 5 6 7 8 9 10
内容 98 22 30 87 11 40 6 20 空 空 空

失败查找从初始地址一路探测到空槽,包含探测空槽的一次。初始地址只有 0~6,分别到 8 号空槽需 9、8、7、6、5、4、3 次;等概率平均为 42/7=642/7=6,选 C。A、B、D 均不等于这七条失败路径的平均值。表长虽为 11,8~10 等位置可以被探测,但 mod 7 不会把它们作为起始地址。

进入练习

第 9 题

数据结构
2 分

设主串 T = "abaabaabcabaabc",模式串 S = "abaabc",采用 KMP 算法进行模式匹配,到匹配成功时为止,在匹配过程中进行的单个字符间的比较次数是( )。

A. 9

B. 10

C. 12

D. 15

查看答案与解析收起答案与解析

参考答案:B

答案:B。

**基础:**KMP 失配时利用已匹配部分的最长相同前后缀移动模式指针,主串指针不回退。用从 1 开始的字符位置编号,模式 S=abaabc,主串开始为 abaabaabc。

前五次比较 T[1..5] 与 S[1..5],即 abaab,全部相同;第六次比较 T[6]=a 与 S[6]=c,失配。已匹配 abaab 的最长相同真前后缀为 ab,长度 2,所以保留这两个字符,模式回到 S[3],主串仍停在 T[6]。

随后四次为 T[6]=a 对 S[3]=a、T[7]=a 对 S[4]=a、T[8]=b 对 S[5]=b、T[9]=c 对 S[6]=c,均成功,在 T[4..9] 找到模式。共 5+1+4=105+1+4=10 次,选 B。A 的 9 漏掉失配比较;C、D 把 KMP 已复用的匹配信息当成需要重新逐字符比较,多算了次数。预先求模式回退表的比较不计入本题的匹配过程。

进入练习

第 10 题

数据结构
2 分

排序过程中,对尚未确定最终位置的所有元素进行一遍处理称为一“趟”。下列序列中,不可能是快速排序第二趟结果的是( )。

A. 5, 2, 16, 12, 28, 60, 32, 72

B. 2, 16, 5, 28, 12, 60, 32, 72

C. 2, 12, 16, 5, 28, 32, 72, 60

D. 5, 2, 12, 28, 16, 32, 72, 60

查看答案与解析收起答案与解析

参考答案:D

答案:D。

**基础:**快速排序每次划分把一个枢轴放到最终位置,其左侧均比它小、右侧均比它大。第一趟划分整段,第二趟再处理两边尚未定位的分区。判断时不能仅数“看上去有序”的元素,而要检查枢轴两侧的整体大小。

A 可以第一趟用末尾最大值 72 作枢轴,第二趟左分区用 28;B 可第一趟用 72,第二趟左分区用最小值 2;C 可第一趟用 28,第二趟左右分区分别用 2、32,均可能。

D 中只有 12、32 满足左小右大的全局定位条件。若第一枢轴为 12,左侧 [5,2] 的第二趟必须再确定一个枢轴,但二者均未定位;若第一枢轴为 32,右侧 [72,60] 同样必须再定位一个,却也没有。两个候选都不能支持第二趟结果,故选 D。第一趟枢轴位于边界时可能只有一侧需划分,所以不能笼统要求所有第二趟结果都恰有三个枢轴。

进入练习

第 11 题

数据结构
2 分

设外存上有 120 个初始归并段,进行 12 路归并时,为实现最佳归并,需要补充的虚段个数是( )。

A. 1

B. 2

C. 3

D. 4

查看答案与解析收起答案与解析

参考答案:B

答案:B。

**基础:**最佳 k 路归并对应 k 叉哈夫曼树。若每个内部结点都有 k 个孩子,内部结点数为 I、叶数为 L,则边数一方面是 kI,另一方面是 I+L−1,故 L−1=(k−1)IL-1=(k-1)I。叶子数若不满足这个整除条件,需要补零长度虚段,避免归并树出现不完整分支而增加代价。

本题 k=12,需 (L−1) mod 11=0(L-1)\bmod11=0。初始 L=120,120−1=119120-1=119 除以 11 余 9,再加 2 个叶子得到 L=122,122−1=121=11×11122-1=121=11\times11,正好满足,选 B。A 补 1 后余数为 10,还不够;C 补 3、D 补 4 都超过最少需要的数量。虚段长度为 0,不表示增加实际数据;条件是叶数减 1 被 11 整除,而不是叶数本身被 12 整除。

进入练习

第 12 题

计算机组成原理
2 分

下列关于冯·诺依曼结构计算机基本思想的叙述中,错误的是( )。

A. 程序的功能都通过中央处理器执行指令实现

B. 指令和数据都用二进制数表示,形式上无差别

C. 指令按地址访问,数据都在指令中直接给出

D. 程序执行前,指令和数据需预先存放在存储器中

查看答案与解析收起答案与解析

参考答案:C

答案:C。

**基础:**冯·诺依曼计算机采用存储程序思想,把指令与数据用二进制存入存储器,CPU 取指、译码、执行,从而完成程序功能。A 描述 CPU 通过执行指令驱动程序,B 说明指令和数据形式上都是二进制,D 说明执行前要存入程序与数据,均符合基本思想。

C 前半句“指令按地址访问”成立,后半句“数据都在指令中直接给出”错误。立即数寻址的确把某个操作数直接放进指令,但其他操作数可在主存或寄存器中,CPU 要根据地址或寄存器编号取得。例如一条加法可读取主存变量,不需把变量值写在指令字里。因此选 C。不能把一种寻址方式的特点推广成全部数据的存放规则;存储程序结构恰恰允许程序和独立数据一起保存在存储器中。

进入练习

第 13 题

计算机组成原理
2 分

考虑以下 C 语言代码:

c 复制代码
unsigned short usi = 65535;
short si = usi;

执行上述程序段后,si 的值是( )。

A. -1

B. -32767

C. -32768

D. -65535

查看答案与解析收起答案与解析

参考答案:A

答案:A。

**步骤:**本题默认 short 和 unsigned short 均为 16 位、有符号整数采用补码,且超范围转换按保留低 16 位的实现约定处理;在这一模型中,unsigned short 的范围为 0~65535,65535 的位模式是 16 个 1,即 FFFFH。把这一位模式转换为同宽有符号 short 后,最高位成为符号位,FFFFH 应按负补码解释。

可用“无符号值减 2162^{16}”求有符号值:65535−65536=−165535-65536=-1;或对 FFFFH 取反加 1,得到绝对值 0001H,故 si=−1,选 A。B 的 −32767 对应 8001H,C 的 −32768 对应 8000H,都不是原来的全 1 位串;D 的 −65535 超过 16 位 short 的可表示范围。这里不能保留 unsigned 的 65535 数值来解释有符号结果。

**语言边界:**C 语言并不普遍保证 short 恰为 16 位;当无符号数不能由目标有符号类型表示时,转换结果由实现定义,也可能引发由实现定义的信号。若某实现的 short 更宽、能表示 65535,转换就保持 65535。因此 −1 是本题上述机器模型下的结果,不能把它表述为所有 C 实现都必然如此。

进入练习

第 14 题

计算机组成原理
2 分

下列关于缺页处理的叙述中,错误的是( )。

A. 缺页是在地址转换时 CPU检测到的一种异常

B. 缺页处理由操作系统提供的缺页处理程序来完成

C. 缺页处理程序根据页故障地址从外存读入所缺失的页

D. 缺页处理完成后回到发生缺页的指令的下一条指令执行

查看答案与解析收起答案与解析

参考答案:D

答案:D。

**基础:**缺页发生在虚拟地址转换时:当前指令要访问的页有效位为“不在内存”,CPU 产生页故障异常。操作系统根据故障地址定位所缺页,必要时置换其他页面,从外存调入并更新页表,随后恢复原程序。

A 正确,缺页由 CPU/MMU 在地址转换中检测,属于同步异常。B 正确,调页等复杂处理由操作系统的缺页处理程序完成。C 正确,处理程序据页故障地址确定要读取的页。D 错误,因为引发缺页的指令所需数据尚未获得,它还没有完整执行;处理完应返回该指令重新执行,而不是直接到下一条,否则这次读写或计算就被跳过了,故选 D。缺页是可修复后重试的故障,不能套用“中断处理后总从下一条继续”的简化说法。

进入练习

第 15 题

计算机组成原理
2 分

某计算机采用大端方式,按字节编址。某指令中操作数的机器数为 1234 FF00H,该操作数采用基址寻址方式,形式地址(用补码表示)为 FF12H,基址寄存器的内容为 F000 0000H,则该操作数的 LSB(最低有效字节)所在的地址是( )。

A. F000 FF12H

B. F000 FF15H

C. EFFF FF12H

D. EFFF FF15H

查看答案与解析收起答案与解析

参考答案:D

答案:D。

**步骤:**先求操作数起始地址,再按大端确定其中最低有效字节的位置。形式地址 FF12H 是 16 位补码负位移,绝对值为 EEH,所以位移为 −238;扩成 32 位需复制符号位,得到 FFFFFF12H,不能零扩展成 0000FF12H。

基址 F0000000H 加负位移,得到 F0000000H−EEH=EFFFFF12HF0000000\mathrm H-EE\mathrm H=EFFFFF12\mathrm H。操作数 1234FF00H 占 4 B,大端存放顺序为地址起点放 12,随后放 34、FF、00;LSB 是最后的 00,在起点+3,即 EFFFFF15H,选 D。A、B 把负位移零扩展,地址整体错误;C 正确求出起点,却没有再移到最低有效字节。机器数的字节序不会改变基址加位移的计算规则。

进入练习

第 16 题

计算机组成原理
2 分

下列有关处理器时钟脉冲信号的叙述中,错误的是( )。

A. 时钟脉冲信号由机器脉冲源发出的脉冲信号经整形和分频后形成

B. 时钟脉冲信号的宽度称为时钟周期,时钟周期的倒数为机器主频

C. 时钟周期以相邻状态单元间组合逻辑电路的最大延迟为基准确定

D. 处理器总是在每来一个时钟脉冲信号时就开始执行一条新的指令

查看答案与解析收起答案与解析

参考答案:D

答案:D。

**基础:**时钟给处理器内部状态变化提供统一节拍,时钟周期与指令执行周期不是同一概念。一条指令可能经过多个周期才能完成;流水线即使在理想情况下能每周期接收一条,也可能因相关、资源冲突或转移而暂停,不能说处理器“总是”每来一个脉冲就开始新指令,D 错误。

A 描述时钟信号由脉冲源整形、分频后得到的形成过程;B 按题目对完整时钟节拍的表述说明周期倒数为主频;C 说明时钟需容纳相邻状态单元之间最长组合逻辑延迟,实际还需相应锁存等开销,均是时钟的通常原理。因此选 D。主频为每秒多少个时钟节拍,并不直接等于每秒执行多少条指令;还需考虑 CPI 和流水线状态。

**术语约定与边界:**本题 B 中“宽度”沿用完整时钟节拍的表述口径,按一个完整时钟周期理解,才能得到题目要求的单选答案 D。严格的电路术语中,脉冲宽度通常是高电平或低电平持续时间,而周期是相邻同类边沿之间的时间,两者不能直接画等号。学习实际时序图时应区分脉冲宽度、占空比和周期;这里保留原题文字并明确其考试口径。

进入练习

第 17 题

计算机组成原理
2 分

某指令功能为 R[r2]←R[r1] + M[R[r0]],其两个源操作数分别采用寄存器、寄存器间接寻址方式。对于下列给定部件,该指令在取数及执行过程中需要用到的是( )。

I. 通用寄存器组(GPRs) II. 算术逻辑单元(ALU)

III. 存储器(Memory) IV. 指令译码器(ID)

A. 仅I、II

B. 仅I、II、III

C. 仅II、III、IV

D. 仅I、III、IV

查看答案与解析收起答案与解析

参考答案:B

答案:B。

**步骤:**指令 R[r2]←R[r1]+M[R[r0]]R[r2]\leftarrow R[r1]+M[R[r0]] 有两个源:第一个直接读取 r1,第二个先读取 r0 中的地址,再到主存取该地址的数据。结果要写回 r2,所以通用寄存器组 I 负责读源地址、读源值、写结果;Memory III 负责取得间接寻址的主存操作数;ALU II 完成加法。

因此取数及执行所需部件为 I、II、III,选 B。IV 指令译码器用于确定指令类型与控制要求,属于此前译码工作,本题限定“取数及执行过程”,不把它列入。A 漏掉间接寻址必需的主存,C 漏掉通用寄存器组且多列译码器,D 漏掉加法必需的 ALU。最常见错误是只看到寄存器名 r0,就把 M[R[r0]]M[R[r0]] 误读为寄存器 r0 本身的数据。

进入练习

第 18 题

计算机组成原理
2 分

在采用“取指、译码/取数、执行、访存、写回”5段流水线的处理器中,执行如下指令序列,其中s0、s1、s2、s3和t2表示寄存器编号。

asm 复制代码
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]

下列指令对中,不存在数据冒险的是( )。

A. I1和I3

B. I2和I3

C. I2和I4

D. I3和I4

查看答案与解析收起答案与解析

参考答案:C

答案:C。

**基础:**按这条顺序五段流水线,重点检查后一条是否在前一条结果写回前就要读取它,即写后读依赖所引起的 RAW 数据冒险。先列读写关系:I1 读 s1、s0 写 s2;I2 读 t2、主存写 s3;I3 读 s2、s3 写 s2;I4 读 s2、t2 写主存。

A 的 I1→I3 依赖 s2,B 的 I2→I3 依赖加载结果 s3,D 的 I3→I4 依赖要存出的 s2,均可能在流水重叠时需要转发或停顿。C 的 I2 和 I4 虽都使用地址寄存器 t2,但都只读取它,I4 不读取 I2 写出的 s3;主存访问又按指令先后完成,没有后一条必须等待前一条寄存器结果的关系。因此 C 不存在本题所指的数据冒险。共同读取同一寄存器不构成写后读依赖。

进入练习

第 19 题

计算机组成原理
2 分

假定一台计算机采用3通道存储器总线,配套的内存条型号为DDR3-1333,即内存条所接插的存储器总线的工作频率为1333MHz,总线宽度为64位,则存储器总线的总带宽大约是( )。

A. 10.66GB/s

B. 32GB/s

C. 64GB/s

D. 96GB/s

查看答案与解析收起答案与解析

参考答案:B

答案:B。

**基础:**带宽是每秒传输次数乘每次传输数据量,再乘通道数。64 位总线一次传 64/8=864/8=8 B,共 3 个通道。按题中 DDR3-1333 的型号含义,1333 表示约 1333 百万次/s 的有效数据传输率,虽然题面以 MHz 表述,这个数已经包含 DDR 双边沿传输的效果。

单通道带宽为 1333×106×8=10.664×1091333\times10^6\times8=10.664\times10^9 B/s,三通道总计 3×10.664=31.9923\times10.664=31.992 GB/s,约 32 GB/s,选 B,GB/s 按十进制计。A 的 10.66 只计一个通道;C 的 64 再乘了一次 DDR 的 2 倍;D 的 96 也超过给定通道与有效传输率。若给的是原始时钟频率才需考虑双边沿因子,不能对 DDR3-1333 这个有效速率重复翻倍。

**术语边界:**DDR3-1333 的数据传输率约为 1333 MT/s,对应双边沿传输的 I/O 时钟约为 667 MHz。题面把型号中的有效传输率写成“工作频率 1333 MHz”,表述不够严格,本题按 DDR3-1333 的有效传输率约定计算。若另一个题目真正给出 1333 MHz 的物理总线时钟且每周期双边沿传输,三通道带宽才约为 64 GB/s;不能把这两种量混用。

进入练习

第 20 题

计算机组成原理
2 分

下列关于磁盘存储器的叙述中,错误的是( )。

A. 磁盘的格式化容量比非格式化容量小

B. 扇区中包含数据、地址和校验等信息

C. 磁盘存储器的最小读写单位为一字节

D. 磁盘存储器由磁盘控制器、磁盘驱动器和盘片组成

查看答案与解析收起答案与解析

参考答案:C

答案:C。

**基础:**磁盘的数据按扇区组织,每个扇区除用户数据外还需地址标识、校验等信息,读写以扇区为基本单位。即使程序只改一个字节,系统也要经过缓冲等机制操作相应扇区,不能把磁盘当作可独立访问任意字节的主存,所以 C 是错误项。

A 正确,格式化要占用一部分盘面记录扇区组织、校验和间隔等,能供用户存储的数据容量小于非格式化的原始容量。B 正确,扇区除数据外还需定位与可靠性信息。D 正确,磁盘存储系统由控制器、驱动器和保存信息的盘片等构成。文件系统还可能把多个扇区组成一个簇作为空间分配单位,簇与扇区也不是“单字节读写”。判断要区分程序请求长度、文件分配单位和磁盘物理传输单位。

进入练习

第 21 题

计算机组成原理
2 分

某设备以中断方式与CPU进行数据交换,CPU主频为1GHz,设备接口中的数据缓冲寄存器为32位,设备的数据传输率为50kB/s。若每次中断开销(包括中断响应和中断处理)为1000个时钟周期,则CPU用于该设备输入/输出的时间占整个CPU时间的百分比最多是( )。

A. 1.25%

B. 2.5%

C. 5%

D. 12.5%

查看答案与解析收起答案与解析

参考答案:A

答案:A。

**步骤:**接口缓冲寄存器为 32 位,每次交换 32/8=432/8=4 B。设备最大数据率为 50 kB/s,按十进制单位换成 50000 B/s,因此每秒最多需要 50000/4=1250050000/4=12500 次中断传送。

每次开销 1000 个时钟周期,CPU 每秒用于该设备的周期数最多为 12500×1000=1.25×10712500\times1000=1.25\times10^7。CPU 主频 1 GHz 表示每秒有 10910^9 周期,所以占比为 1.25×107/109×100%=1.25%1.25\times10^7/10^9\times100\%=1.25\%,选 A。也可算每次中断 1 μs,每秒合计 0.0125 s。B、C、D 都没有按 4 B 传输单位、1000 周期开销和总周期正确相除。开销已用周期给出,不能再乘某个未提供的 CPI;bit 与 B 也必须先换算。

进入练习

第 22 题

计算机组成原理
2 分

下列关于DMA方式的叙述中,正确的是( )。

I. DMA传送前由设备驱动程序设置传送参数

II. 数据传送前由DMA控制器请求总线使用权

III. 数据传送由DMA控制器直接控制总线完成

IV. DMA传送结束后的处理由中断服务程序完成

A. 仅I、II

B. 仅I、III、IV

C. 仅II、III、IV

D. I、II、III、IV

查看答案与解析收起答案与解析

参考答案:D

答案:D。

**基础:**DMA 使数据在设备与主存之间由控制器直接批量传输,CPU 仍需负责建立任务和结束后的处理,而不是完全不参与 I/O。I 正确,设备驱动在传送前设置主存起始地址、长度、方向等参数,属于预处理。

II 正确,DMA 控制器要先请求并获得总线使用权,才能访问主存;III 正确,获得权限后由 DMA 控制器直接发出地址与读写控制,完成数据传送,无需 CPU 对每个字执行搬运指令;IV 正确,完成后通常通过中断通知 CPU,由中断服务程序进行后处理,例如更新状态、唤醒等待者。四项均成立,选 D。A 漏掉实际传送与后处理,B 漏掉总线申请,C 漏掉初始化。减少 CPU 逐字搬运不等于省去全部软件管理步骤。

进入练习

第 23 题

操作系统
2 分

下列关于线程的描述中,错误的是( )。

A. 内核级线程的调度由操作系统完成

B. 操作系统为每个用户级线程建立一个线程控制块

C. 用户级线程间的切换比内核级线程间的切换效率高

D. 用户级线程可以在不支持内核级线程的操作系统上实现

查看答案与解析收起答案与解析

参考答案:B

答案:B。

**基础:**内核级线程由操作系统内核识别和调度,用户级线程由用户空间线程库管理。B 错误,纯用户级线程的控制块与切换信息由线程库维护,内核通常只知道承载它们的进程,并不会为每个用户线程建立可由内核调度的线程控制块,所以选 B。

A 正确,内核级线程的调度由操作系统完成。C 正确,用户级线程切换一般只需在用户态保存恢复寄存器和线程库状态,避免每次陷入内核,通常开销较低。D 正确,用户级线程可通过用户程序和库实现,不要求内核先支持线程调度。要区分“线程具有管理记录”与“管理记录由谁建立”:用户线程不是没有 TCB,而是这种记录在用户空间,不是内核为每个线程建立的调度实体。

进入练习

第 24 题

操作系统
2 分

下列选项中,可能会将进程唤醒的事件是( )。

I. I/O结束 II. 某进程退出临界区 III. 当前进程的时间片用完

A. 仅I

B. 仅III

C. 仅I、II

D. I、II、III

查看答案与解析收起答案与解析

参考答案:C

答案:C。

**基础:**唤醒把因等待事件而阻塞的进程转为就绪;它不一定立即获得 CPU。I 的 I/O 结束满足了等待数据或设备完成的条件,可以唤醒等待进程。II 某进程退出临界区、释放互斥资源时,可以通过锁或信号量通知并唤醒等待进入的进程,二者都可能导致唤醒。

III 当前进程时间片用完,是使运行进程被抢占并转入就绪队列的原因,该进程此前没有因等待条件处于阻塞,因而不是唤醒。于是仅 I、II 正确,选 C。A 漏掉资源释放,B 只选了不是唤醒的时间片事件,D 多列了 III。I/O 完成和退出临界区只有在存在相应等待者时才实际唤醒,所以题目使用“可能”,不能理解为每次一定有进程被唤醒。

进入练习

第 25 题

操作系统
2 分

下列关于系统调用的叙述中,正确的是( )。

I. 在执行系统调用服务程序的过程中,CPU处于内核态

II. 操作系统通过提供系统调用避免用户程序直接访问外设

III. 不同的操作系统为应用程序提供了统一的系统调用接口

IV. 系统调用是操作系统内核为应用程序提供服务的接口

A. 仅 I、IV

B. 仅 II、III

C. 仅 I、II、IV

D. 仅 I、III、IV

查看答案与解析收起答案与解析

参考答案:C

答案:C。

**基础:**系统调用是应用程序向操作系统内核请求服务的入口,例如打开文件、读设备、创建进程。调用时经过受控陷入,从用户态转为内核态,执行内核的服务程序,因此 I、IV 正确。

II 也正确,普通用户程序不能直接随意执行设备 I/O 等特权操作,而是提交参数给系统调用,由内核检查权限并协调外设使用,保证隔离与保护。III 错误,不同操作系统的系统调用名称、编号、参数和语义可能不同,不能保证统一;程序库可以提供部分跨系统的封装,但那不等于内核接口都相同。故选 C 的 I、II、IV。A 漏掉外设保护作用,B、D 都包含错误的 III。用户程序调用一个库函数时,并非全部库代码都在内核态,只有进入实际系统调用服务后才执行内核服务。

进入练习

第 26 题

操作系统
2 分

下列选项中,可用于文件系统管理空闲磁盘块的数据结构是( )。

I. 位图 II. 索引结点 III. 空闲磁盘块链 IV. 文件分配表(FAT)

A. 仅 I、II

B. 仅 I、III、IV

C. 仅 I、III

D. 仅 II、III、IV

查看答案与解析收起答案与解析

参考答案:B

答案:B。

**逐项判断:**I 位图为每个磁盘块设置一位,约定某值表示空闲,分配与释放时修改对应位,能管理空闲块。III 空闲磁盘块链把空闲块串起来,分配时取链上结点、释放时加回,也能管理。IV FAT 为磁盘块保存分配状态和连接信息,其中空闲标识可用于寻找尚未分配的块,同样符合。

II 索引结点 inode 保存某个文件的属性和数据块地址,描述的是“这个文件占哪些块”,不作为整个文件系统的空闲块集合结构。因此正确为 I、III、IV,选 B。A、D 包含错误的 II;C 虽列出两种可用方法,却漏掉 FAT。文件索引与空闲空间管理相互配合但职责不同,不能因为 inode 也含磁盘地址,就把它直接当成空闲块表。

进入练习

第 27 题

操作系统
2 分

系统采用二级反馈队列调度算法进行进程调度。就绪队列 Q1 采用时间片轮转调度算法,时间片为10ms;就绪队列 Q2 采用短进程优先调度算法;系统优先调度 Q1 队列中的进程,当 Q1 为空时系统才会调度 Q2 中的进程;新创建的进程首先进入 Q1;Q1 中的进程执行一个时间片后,若未结束,则转入 Q2。若当前 Q1、Q2 为空,系统依次创建进程 P1、P2 后即开始进程调度,P1、P2 需要的 CPU 时间分别为30ms 和 20ms,则进程 P1、P2 在系统中的平均等待时间为( )。

A. 25ms

B. 20ms

C. 15ms

D. 10ms

查看答案与解析收起答案与解析

参考答案:C

答案:C。

**步骤:**两进程先后进入高优先级 Q1,按到达顺序轮转,各得到 10 ms。P1 需要 30 ms,用完后剩 20 ms转入 Q2;P2 需要 20 ms,用完后剩 10 ms也转入 Q2。Q1 此时为空,Q2 按短进程优先,应先运行剩余时间较短的 P2。

时间段 运行进程 结束后的情况
0~10 ms P1 剩 20 ms,转 Q2
10~20 ms P2 剩 10 ms,转 Q2
20~30 ms P2 完成
30~50 ms P1 完成

题目未给创建间隔或切换开销,按开始调度前均已创建计算。P1 等待 10~30 共 20 ms,P2 等待 0~10 共 10 ms,平均 (20+10)/2=15(20+10)/2=15 ms,选 C。A、B 多算等待,D 少算 P1 在 Q2 等待的时间。等待时间不含进程自身实际占用 CPU 的时间。

进入练习

第 28 题

操作系统
2 分

在分段存储管理系统中,用共享段表描述所有被共享的段。若进程 P1 和 P2 共享段 S,下列叙述中,错误的是( )。

A. 在物理内存中仅保存一份段 S 的内容

B. 段 S 在 P1 和 P2 中应该具有相同的段号

C. P1 和 P2 共享段 S 在共享段表中的段表项

D. P1 和 P2 都不再使用段 S 时才回收段 S 所占的内存空间

查看答案与解析收起答案与解析

参考答案:B

答案:B。

**基础:**段号是每个进程自身逻辑地址空间里的编号,不是共享物理段的全局身份。P1 可把 S 作为第 2 段,P2 把 S 作为第 5 段;只要各自段表项与共享段记录最终指向同一段基址、长度,就能共享,故 B 要求“相同段号”是错误的。

A 正确,共享的目的在于物理内存仅保存一份内容,多个进程访问该份数据。C 正确,共享段表中该段有统一记录,用于维护共享关系与使用数量,各进程通过自己的段表与它关联。D 正确,必须等 P1、P2 以及其他使用者都不再引用,才能回收物理段,不能因一个进程结束就删除仍被另一个使用的内容。因此选 B。可用引用计数等方式决定何时回收,逻辑段号不同不会阻止引用同一物理段。

进入练习

第 29 题

操作系统
2 分

某系统采用 LRU 页置换算法和局部置换策略,若系统为进程 P 预分配了 4 个页框,进程 P 访问页号的序列为 0, 1, 2, 7, 0, 5, 3, 5, 0, 2, 7, 6,则进程访问上述页的过程中,产生页置换的总次数是( )。

A. 3

B. 4

C. 5

D. 6

查看答案与解析收起答案与解析

参考答案:C

答案:C。

**基础:**LRU 淘汰最久未访问的驻留页,命中时也要更新最近使用顺序。4 个页框最初可空着,首次装入页面不需赶走旧页,是缺页而非页置换。以下状态按“最久未用→最近使用”排列。

访问页 访问后驻留顺序 结果
0、1、2、7 0,1,2,7 四次装入,无置换
0 1,2,7,0 命中
5 2,7,0,5 淘汰 1
3 7,0,5,3 淘汰 2
5 7,0,3,5 命中
0 7,3,5,0 命中
2 3,5,0,2 淘汰 7
7 5,0,2,7 淘汰 3
6 0,2,7,6 淘汰 5

换入 5、3、2、7、6 时发生置换,共 5 次,选 C。A、B 少算换出,D 多算;若把最初四次装入也算置换则会误得到 9。局部策略表示只可替换 P 自己的这四个页框,不能向其他进程借页框避免置换。

进入练习

第 30 题

操作系统
2 分

下列关于死锁的叙述中,正确的是( )。

I. 可以通过剥夺进程资源解除死锁

II. 死锁的预防方法能确保系统不发生死锁

III. 银行家算法可以判断系统是否处于死锁状态

IV. 当系统出现死锁时,必然有两个或两个以上的进程处于阻塞态

A. 仅 II、III

B. 仅 I、II、IV

C. 仅 I、II、III

D. 仅 I、III、IV

查看答案与解析收起答案与解析

参考答案:B

答案:B。

**逐项判断:**I 正确,出现死锁后可选择受害进程,剥夺其可回收资源并让其他进程继续,属于解除死锁的措施,实际需处理恢复或回滚。II 正确,死锁预防通过破坏互斥、占有等待、不可剥夺、循环等待四条件中的至少一个必要条件,确保不形成死锁。

III 错误,银行家算法检查分配后是否仍有安全序列,用于避免进入不安全状态;不安全只是可能将来发生死锁,不等于系统此刻已经死锁,故不能拿它替代当前死锁检测。

**本题默认约定:**死锁采用教材中多个进程相互等待彼此占用资源的模型。IV 在这个模型中正确,至少两进程相互等待而阻塞。于是选 B 的 I、II、IV;A、C、D 都包含错误的 III。

**定义边界:**程序重复申请自己持有的不可重入锁,也可能陷入单进程自锁。若使用把这种情形也纳入的广义死锁定义,IV 的“必然有两个或两个以上”便不成立。本题按上述多进程相互等待的教材模型判断,不把结论推广到一切锁实现。

进入练习

第 31 题

操作系统
2 分

某计算机主存按字节编址,采用二级分页存储管理,地址结构如下所示:

[页目录号(10 位) | 页号(10 位) | 页内偏移(12 位)]

虚拟地址 2050 1225H 对应的页目录号、页号分别是( )。

A. 081H、101H

B. 081H、401H

C. 201H、101H

D. 201H、401H

查看答案与解析收起答案与解析

参考答案:A

答案:A。

**步骤:**地址从高到低分为 10 位目录号、10 位页号、12 位偏移。先去掉低 12 位,得到 20 位虚页号 20501225H≫12=20501H20501225\mathrm H\gg12=20501\mathrm H;其中低 10 位是页号,高 10 位是目录号。10 位掩码为 210−1=3FFH2^{10}-1=3FF\mathrm H。

目录号为 20501225H≫22=081H20501225\mathrm H\gg22=081\mathrm H;页号为 (20501H&3FFH)=101H(20501\mathrm H\mathbin{\&}3FF\mathrm H)=101\mathrm H,故选 A。可重组验算:(081H≪22)+(101H≪12)+225H=20501225H(081\mathrm H\ll22)+(101\mathrm H\ll12)+225\mathrm H=20501225\mathrm H。B、D 的页号 401H 超出 10 位字段最大值 3FFH;C 的目录号 201H 不是地址高 10 位。十六进制每位为 4 bit,但 10 位字段并非整数字节或整 3 位十六进制,不能直接把字符串截成三段代替位移与掩码。

进入练习

第 32 题

操作系统
2 分

在下列动态分区分配算法中,最容易产生内存碎片的是( )。

A. 首次适应算法

B. 最坏适应算法

C. 最佳适应算法

D. 循环首次适应算法

查看答案与解析收起答案与解析

参考答案:C

答案:C。

**基础:**动态分区的外部碎片是分配区之间零散的小空闲区,虽然总量可能不少,却难以满足一个较大的连续申请。最佳适应每次选能够满足请求的最小空闲区,单次剩余量最小,但重复使用后常留下很多很小、难以再利用的空洞,所以它最容易产生这种碎片,选 C。

例如剩有 10 KB、20 KB 空闲区,请求 9 KB,最佳适应切 10 KB,留下 1 KB;许多类似申请会形成大量极小残片。A 首次适应从低地址开始遇到足够大区就分配,不总追求最小残余;B 最坏适应挑最大的空闲区,倾向于保留较大的剩余区;D 循环首次适应从上次位置继续搜索,也不专门切最紧凑的区。三者并非完全没有碎片,但相较之下最佳适应的小碎片问题突出。

进入练习

第 33 题

计算机网络
2 分

OSI参考模型的第5层(自下而上)完成的主要功能是( )。

A. 差错控制

B. 路由选择

C. 会话管理

D. 数据表示转换

查看答案与解析收起答案与解析

参考答案:C

答案:C。

**基础:**OSI 自下而上七层依次是物理、数据链路、网络、传输、会话、表示、应用,因此第 5 层是会话层。它管理应用实体之间的会话,包括建立、保持和终止会话、组织对话、设置同步点等,主要功能为会话管理,选 C。

A 差错控制常涉及数据链路层的帧差错检测、重传,以及传输层的端到端可靠性等,不是第 5 层主要职责。B 路由选择属于网络层,即第 3 层,决定分组沿哪些网络转发。D 数据表示转换属于第 6 层表示层,例如编码、压缩和加密等处理。判断时先确定“自下而上”的层号,再对应职责;若反向从应用层数,会得到错误层次。会话的管理不等同于传输连接的逐字节可靠传送。

进入练习

第 34 题

计算机网络
2 分

100BaseT快速以太网使用的导向传输介质是( )。

A. 双绞线

B. 单模光纤

C. 多模光纤

D. 同轴电缆

查看答案与解析收起答案与解析

参考答案:A

答案:A。

**基础:**以太网标准的名称包含速率、传输方式和介质信息。100BaseT 中 100 表示 100 Mbps,Base 表示基带传输,T 是 Twisted Pair 的含义,即双绞线,所以选 A。

双绞线把成对导线绞合,以减少外部电磁干扰和线对间影响,适合该类快速以太网连接。B 单模光纤、C 多模光纤属于光传输介质,对应的快速以太网光纤标准通常以 FX 等标记区分,并不是本题的 T。D 同轴电缆曾用于其他以太网标准,不能因它也是导向介质就选。题目问的是具体 100BaseT 的介质,不是“以太网曾使用过什么介质”。这里的 100 也不是电缆长度,识别三个名称部分可避免机械记忆混淆。

进入练习

第 35 题

计算机网络
2 分

对于滑动窗口协议,若分组序号采用3比特编号,发送窗口大小为5,则接收窗口最大是( )。

A. 2

B. 3

C. 4

D. 5

查看答案与解析收起答案与解析

参考答案:B

答案:B。

**基础:**3 bit 序号可表示 0~7,共 23=82^3=8 种,发送到 7 后会回到 0。滑动窗口要避免接收窗口把旧批次重传包当成序号相同的新包,需要满足 Ws+Wr≤2kW_s+W_r\le2^k。本题发送窗口 Ws=5W_s=5,因此接收窗口 Wr≤8−5=3W_r\le8-5=3,选 B。

可用丢确认的情形理解:发送一批 0~4 后,接收者已经收完,若新接收窗口大小为 4,就会接收 5、6、7、0;发送方因确认丢失重传旧 0 时,接收方会误认它是新一轮的 0。窗口为 3 时新窗口仅为 5、6、7,避免这个重叠。A 的 2 可满足但不是最大;C 的 4、D 的 5 均超过上限。不能只用序号空间减去一个保留值来计算,约束来自新旧窗口的区分。

进入练习

第 36 题

计算机网络
2 分

假设一个采用CSMA/CD 协议的 100 Mbps局域网,最小帧长是128B,则在一个冲突域内两个站点之间的单向传播延时最多是( )。

A. 2.56μs

B. 5.12μs

C. 10.24μs

D. 20.48μs

查看答案与解析收起答案与解析

参考答案:B

答案:B。

**基础:**CSMA/CD 要保证最远端碰撞的信号能在发送者仍发送帧时返回。因此最小帧发送时间必须不小于最远站点间的往返传播时延,即 Tmin⁡≥2τT_{\min}\ge2\tau,其中 τ 是所求单程时延。系数 2 是检测最坏碰撞情形的关键。

128 B=128×8=1024128\times8=1024 bit,传输速率 100 Mbps=10810^8 bit/s,所以最小帧发送时间为 1024/1081024/10^8 s=10.24 μs。于是单程上限为 τ≤10.24/2=5.12 μs\tau\le10.24/2=5.12\,\mu s,选 B。A 的 2.56 μs 额外除了一次 2;C 的 10.24 μs 是整个往返时延上限;D 的 20.48 μs 超出最短发送时长。不要把帧发送时间直接等同于单向传播时间,二者由协议约束联系但不是同一物理过程。

进入练习

第 37 题

计算机网络
2 分

若将101.200.16.0/20划分为5个子网,则可能的最小子网的可分配IP地址数是( )。

A. 126

B. 254

C. 510

D. 1022

查看答案与解析收起答案与解析

参考答案:B

答案:B。

思路:“划分”为 5 个子网按完整覆盖原 /20 地址空间理解,可使用不同长度前缀。CIDR 子网对应把一个地址块二等分,分一次,子网总数增加 1;从 1 块变成 5 块恰需 4 次分裂。要得到尽可能小的块,应每次继续分裂同一条分支,最大把 /20 延伸 4 位至 /24。

一种完整划分的块大小为 /21、/22、/23、/24、/24,地址数 2048+1024+512+256+256=40962048+1024+512+256+256=4096,刚好覆盖 /20。最小 /24 有 256 个地址,扣除网络与广播,可分配 254 个,选 B。A 的 126 对应 /25,至少需 5 次分裂、形成至少 6 个子网;C 的 510 可以出现在别的划分中,但不是可能达到的最小值;D 的 1022 对应 /22,五块这么大无法放入原地址空间。若只挑五个块而不要求完整划分,是不同题意。

进入练习

第 38 题

计算机网络
2 分

某客户通过一个 TCP 连接向服务器发送数据的部分过程如题 38 图所示。客户在 t0t_{0} 时刻第一次收到确认序列号 ack_seq=100 的段,并发送序列号 seq=100 的段,但发生丢失。若 TCP 支持快速重传,则客户重新发送 seq=100 段的时刻是( )。

2019 年第 38 题配图

A. t1t_{1}

B. t2t_{2}

C. t3t_{3}

D. t4t_{4}

查看答案与解析收起答案与解析

参考答案:C

答案:C。

**基础:**TCP 快速重传在收到三个重复确认后,不等重传计时器超时就重发最早缺失的段。重复确认号表示接收方仍在等待同一个起始字节,虽然更靠后的段已陆续到达。

图中 t₀ 首次收到 ack=100,随后发送 seq=100,却丢失。服务器收到 seq=200、300、400 时,都因缺少 100 开始的数据而再次发 ack=100。它们在 t₁、t₂、t₃ 到达客户,分别是第 1、2、3 个重复 ACK;第三个到达即触发重传,所以选 C 的 t₃。A 的 t₁、B 的 t₂ 重复确认数尚不足;D 的 t₄ 是计时器超时点,快速重传已可更早行动。最常见错误是把 t₀ 那个首次确认也算入三个重复确认,导致提前一轮重传。

进入练习

第 39 题

计算机网络
2 分

若主机甲主动发起一个与主机乙的TCP连接,甲、乙选择的初始序列号分别为2018和2046,则第三次握手TCP段的确认序列号是( )。

A. 2018

B. 2019

C. 2046

D. 2047

查看答案与解析收起答案与解析

参考答案:D

答案:D。

**基础:**TCP 确认号是下一次期望收到的序列号。建立连接时 SYN 即使不携带普通数据,也占用一个序号;第三次握手由主动方甲发送,用来确认乙在第二次握手发出的 SYN。

第一步甲发 SYN,seq=2018;第二步乙发 SYN+ACK,seq=2046、ack=2019,确认甲的 SYN;第三步甲发 ACK,应确认乙占用的序号 2046,所以 ack=2046+1=20472046+1=2047,选 D。A 的 2018 是甲自己的初始序号,B 的 2019 是乙确认甲时的确认号或甲第三步所用的序号,均不是此处所问的确认号;C 的 2046 未计 SYN 占一个序号。不能把主动方的初始序号与第三次握手确认的对象混淆。

进入练习

第 40 题

计算机网络
2 分

下列关于网络应用模型的叙述中,错误的是( )。

A. 在P2P模型中,结点之间具有对等关系

B. 在客户/服务器(C/S)模型中,客户与客户之间可以直接通信

C. 在C/S模型中,主动发起通信的是客户,被动通信的是服务器

D. 在向多用户分发一个文件时,P2P模型通常比C/S模型所需的时间短

查看答案与解析收起答案与解析

参考答案:B

答案:B。

**基础:**C/S 模型由服务器提供服务,客户向服务器主动发出请求并接收结果;客户之间的业务交换通常需通过服务器,不是模型内的直接对等通信。所以 B“客户与客户之间可以直接通信”是本题的错误描述。

A 正确,P2P 节点在模型中地位对等,一个节点可向其他节点请求数据,也可向它们提供数据。C 正确,C/S 中主动请求的一方称客户,提供并等待请求的一方称服务器。D 按通常文件分发情形正确,P2P 让已取得文件部分的节点继续上传,新增接收者也能贡献上传能力,较只靠服务器出口更有扩展性,通常缩短多用户分发时间,但不是任何网络参数下都保证更快。因此选 B。某个具体应用同时使用服务器与点对点连接属于组合模型,不能据此改写纯 C/S 的基本通信关系。

进入练习

解答题

7 题 · 共 70 分

第 41 题

数据结构
13 分

设线性表 L=(a1,a2,a3,…,an−2,an−1,an)L=(a_{1},a_{2},a_{3},…,a_{n-2},a_{n-1},a_{n}) 采用带头结点的单链表保存,链表中的结点定义如下:

c 复制代码
typedef struct node {
    int data;
    struct node *next;
} NODE;

请设计一个空间复杂度为 O(1)O(1) 且时间上尽可能高效的算法,重新排列 LL 中的各结点,得到线性表 L′=(a1,an,a2,an−1,a3,an−2,…)L'=(a_{1},a_{n},a_{2},a_{n-1},a_{3},a_{n-2},…)。要求:

1)给出算法的基本设计思想。

2)根据设计思想,采用 C 或 C++ 语言描述算法,关键之处给出注释。

3)说明所设计算法的时间复杂度。

查看答案与解析收起答案与解析

**(1)设计思想。**目标次序是“头部取一个、尾部取一个”交替排列。单链表不能直接从尾往前走,若每次重新找尾会达到 O(n2)O(n^2)。可以把后半段原地反转,使尾部元素变成可向前依次取的链,再和前半段交错合并。

分三步:用快慢指针找中点,fast 每轮走两步、slow 走一步,把链表分成前半与后半,前半长度等于或比后半多 1;切断两段并反转后半;每次把反转后半的一个结点插到前半当前结点后,继续处理各自原来的下一个结点。只修改 next,不复制数据、不申请新结点。

例如 1→2→3→4→5,分成 1→2→3 与 4→5,后半反转为 5→4,交错插入得 1→5→2→4→3。偶数长度 1→2→3→4 则分成等长两段,得到 1→4→2→3。

**(2)C 实现。**head 是表头结点,不参与数据排列;改链接前保存原 next,避免剩余链断失。

c 复制代码
#include <stddef.h>
typedef struct node {
    int data;
    struct node *next;
} NODE;

void reorder(NODE *head) {
    if (head == NULL || head->next == NULL) return;
    NODE *slow = head->next, *fast = head->next;
    while (fast->next != NULL && fast->next->next != NULL) {
        slow = slow->next;
        fast = fast->next->next;
    }
    NODE *p = slow->next;
    slow->next = NULL; // 切断前后半段
    NODE *rev = NULL;
    while (p != NULL) {
        NODE *next = p->next;
        p->next = rev;
        rev = p;
        p = next;
    }
    p = head->next;
    while (rev != NULL) {
        NODE *leftNext = p->next, *rightNext = rev->next;
        p->next = rev;
        rev->next = leftNext;
        p = leftNext;
        rev = rightNext;
    }
}

**(3)正确性与复杂度。**反转后的后半依次为 an,an−1,…a_n,a_{n-1},\ldots,前半保持 a1,a2,…a_1,a_2,\ldots。合并每轮链接一对前、后元素,所以前 k 轮得到 a1,an,…,ak,an−k+1a_1,a_n,\ldots,a_k,a_{n-k+1},与目标前缀一致;后半耗尽后若有前半中间结点,留在末尾即可。先切断前半,防止反转与合并形成环;每个原结点最终恰好出现一次。

找中点、反转、合并分别为线性时间,总时间 O(n)O(n),只使用固定数量指针,额外空间 O(1)O(1)。所有结点一般都需访问,线性时间已经足够高效。空链、只有一项时无需重排,两个结点时次序也保持正确,奇数长度的中间结点最终位于末尾。

进入练习

第 42 题

数据结构
10 分

请设计一个队列,要求满足:①初始时队列为空;②入队时,允许增加队列占用空间;③出队后,出队元素所占用的空间可重复使用,即整个队列所占用的空间只增不减;④入队操作和出队操作的时间复杂度始终保持为 O(1)。请回答下列问题:

(1) 该队列是应选择链式存储结构,还是应选择顺序存储结构?

(2) 画出队列的初始状态,并给出判断队空和队满的条件。

(3) 画出第一个元素入队后的队列状态。

(4) 给出入队操作和出队操作的基本过程。

查看答案与解析收起答案与解析

(1)存储结构选择。采用保留空闲结点的循环单链表。普通链队列出队后释放结点,不能保留空间;动态数组扩容通常需复制已有元素,某次入队不是 O(1)O(1)。循环链表可把出队结点留在环中重复使用,空间不足时只插入一个新结点,每次只改固定数量链接。

**(2)初始状态与边界。**约定 front 指向下一次出队的结点,rear 指向下一次入队将写入的空闲结点。沿 next 从 front 到 rear 之前为有效数据区;rear 所在结点作为保留空位,使空队与空间耗尽可以区分。初始化申请一个不存有效数据的结点,使其 next 指向自己,front、rear 都指向它:

text 复制代码
初始: front,rear → [空闲] ─┐
                    ↑      │
                    └──────┘

队空条件是 front == rear。空间耗尽(需要扩容)条件是 rear->next == front,表示除 rear 这个保留空位外,已无其他空闲结点。初始化只有一个结点,两条件同时成立并不矛盾:队列确实没有数据,下一次入队又确实需加一个结点才能保留空位。这里“满”用于判断扩容,不能据此拒绝入队。

**(3)首次入队。**先在 rear 后插入一个新空闲结点,形成两个结点的环;把 e 写入原 rear,再把 rear 移到新的空结点,front 不变:

text 复制代码
front → [e] → [空闲] ← rear
          ↑      │
          └──────┘

**(4)基本操作。**入队先检查是否需扩容,至多申请一个结点并插在 rear 后;然后写 rear,rear 前进一步。出队先判断队空,非空则读取 front 并前进一步,不释放该结点,它自动成为环上的可复用空间:

text 复制代码
enqueue(e):
    if rear.next == front:
        p = 新申请一个结点
        p.next = rear.next
        rear.next = p
    rear.data = e
    rear = rear.next

dequeue():
    if front == rear: 返回队空
    e = front.data
    front = front.next
    返回 e

**为什么满足要求。**写入总在 rear、读取总在 front,两个指针只沿环前进,所以元素仍先进先出;出队后旧结点保留,后续 rear 绕回时可覆盖其中旧数据。连续入队超出已有容量才申请新结点,因此容量只增不减,达到过的最大规模可复用。按通常数据结构分析中的常数时间结点分配模型,入队最多一次分配和固定次数链接修改,出队只读数据、改一个指针,两操作的时间始终为 O(1)O(1),不用搬移或遍历现有队列。

进入练习

第 43 题

操作系统
8 分

有 n(n≥3)位哲学家围坐在一张圆桌边,每位哲学家交替地就餐和思考。在圆桌中心有 m(m≥1)个碗,每两位哲学家之间有一根筷子。每位哲学家必须取到一个碗和两侧的筷子后,才能就餐,进餐完毕,将碗和筷子放回原位,并继续思考。为使尽可能多的哲学家同时就餐,且防止出现死锁现象,请使用信号量的 P、V 操作 [wait()、signal()操作] 描述上述过程中的互斥与同步,并说明所用信号量及初值的含义。

查看答案与解析收起答案与解析

**思路与信号量。**每根筷子只能被一人拿走,定义二值信号量 chopstick[i]=1,i=0~n−1;哲学家 i 使用 chopstick[i] 和 chopstick[(i+1) mod n]。另定义计数信号量 bowl=min⁡(m,n−1)\min(m,n-1),表示可进入“持碗取筷、就餐”阶段的名额。

当 m<n 时名额不超过实际碗数;当 m≥n 时虽然碗很多,仍只允许 n−1 人同时进入取筷阶段,至少一人暂不占筷子,破坏所有人各持一根等待下一根的环。碗可视为同类资源,名额申请成功即可取一个实际空闲碗。

text 复制代码
semaphore chopstick[0..n-1] = 1
semaphore bowl = min(m, n-1)

philosopher(i):
    while TRUE:
        思考
        P(bowl)
        P(chopstick[i])
        P(chopstick[(i+1) mod n])
        就餐
        V(chopstick[(i+1) mod n])
        V(chopstick[i])
        V(bowl)

**互斥与无死锁理由。**每根筷子用独立 P/V 保护,相邻哲学家不能同时就餐;每人先 P(bowl),保证不会超过碗资源。筷子等待的方向统一为 i 等 i+1,要形成循环等待必须整圈 n 人全部参与,但名额限制为 n−1,排除了这个必要情形,总会有等待链末端能取得第二根筷子并完成,归还资源后其他人继续。

进餐后先归还两根筷子、再归还碗名额,思考阶段不占这些资源。没有用一个互斥锁包住整个就餐过程,非相邻者仍可同时进餐。每人需两筷且相邻不能并吃,物理并发上限为 min⁡(m,⌊n/2⌋)\min(m,\lfloor n/2\rfloor);n≥3 时 n−1 不小于 ⌊n/2⌋\lfloor n/2\rfloor,因此所加名额限制不降低能达到的就餐并发上限。m=1 时自然一次只允许一人,仍无死锁。

进入练习

第 44 题

操作系统
7 分

某计算机系统中的磁盘有 300 个柱面,每个柱面有 10 个磁道,每个磁道有 200 个扇区,扇区大小为 512B。文件系统的每个簇包含 2 个扇区。请回答下列问题:

(1) 磁盘的容量是多少?

(2) 假设磁头在 85 号柱面上,此时有 4 个磁盘访问请求,簇号分别为 100 260、60 005、101 660 和 110 560。若采用最短寻道时间优先(SSTF)调度算法,则系统访问簇的先后次序是什么?

(3) 第 100 530 簇在磁盘上的物理地址是什么?将簇号转换成磁盘物理地址的过程是由 I/O 系统的什么程序完成的?

查看答案与解析收起答案与解析

**(1)磁盘容量。**每个柱面有 10 个磁道,每道 200 扇区,每扇区 512 B,所以总容量为

300×10×200×512=307200000B=300000KiB,300\times10\times200\times512=307200000\mathrm B=300000\mathrm{KiB},

其中 1KiB=1024B1\mathrm{KiB}=1024\mathrm B;题目传统写法中以 1024 B 为一单位的 KB 对应这里的 KiB。若采用十进制 MB,则为 307.2 MB,不能直接把这两个单位混写。每簇 2 扇区即 1024 B,也可用总簇数 300×10×200/2=300000300\times10\times200/2=300000 乘 1024 B 复核。

**(2)SSTF 服务次序。**寻道比较柱面号,不直接比较簇号。每柱面有 10×200/2=100010\times200/2=1000 簇,因此簇号整除 1000 得柱面号:100260→100,60005→60,101660→101,110560→110。

起点 85 到四个柱面的距离分别为 15、25、16、25,先选 100;在 100 处剩余距离为到 60 的 40、到 101 的 1、到 110 的 10,选 101;在 101 处到 110 的 9 小于到 60 的 41,选 110;最后到 60。故簇访问次序为 100260、101660、110560、60005。SSTF 每次从当前磁头位置重新比较,不是把全部请求按距最初 85 的距离一次排序。

(3)簇号转物理位置。

**默认约定:**原题未逐项明示编号起点,解题采用簇、柱面、磁头及道内扇区均从 0 起号的计算模型。100530 所在柱面为 ⌊100530/1000⌋=100\lfloor100530/1000\rfloor=100,柱面内剩余 100530−100000=530100530-100000=530 簇。每磁道有 200/2=100200/2=100 簇,故磁头/磁道号为 ⌊530/100⌋=5\lfloor530/100\rfloor=5,道内为第 30 簇。每簇占两个扇区,所以起始扇区号 30×2=6030\times2=60,另一扇区为 61,物理位置为 (柱面100,磁头5,起始扇区60)。

也可先换算线性起始扇区号 201060,再依次除以每柱面 2000 扇区、每道 200 扇区,得到同样结果。这里的 60 是同一磁道内从 0 开始的扇区序号;若底层接口的扇区字段从 1 起号,同一物理位置的首扇区应写为 61,两个扇区写为 61、62。编号标签变化不改变所指的物理位置,不能把后一种接口表示反过来当成原题要求的另一套物理地址。簇号到设备物理地址的转换由 I/O 系统的 磁盘驱动程序 完成。

进入练习

第 45 题

计算机组成原理
16 分

已知 f(n) = n! = n×(n-1)×(n-2)×…×2×1,计算 f(n) 的 C 语言函数 f1 的源程序(阴影部分)及其在 32 位计算机 M 上的部分机器级代码如下:
其中,机器级代码行包括行号、虚拟地址、机器指令和汇编指令,计算机M按字节编址,int型数据占32位。请回答下列问题:

2019 年第 45 题配图

(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)调用次数与递归指令。**源程序在 n>1 时返回 n×f1(n−1),否则返回 1。因此 f1(10) 依次调用 f1(9)、…、f1(1),共有 10 次函数调用,包括外部的首次调用;其中递归调用本身为 9 次。第 14 行先把参数减 1,第 15 行压入新参数,第 16 行 call f1 才转入函数,执行递归调用。

**(2)转移指令分类。**第 11 行 cmp 把 n 与 1 比较并设置标志,第 12 行 jle 根据比较结果决定是否跳到 else,是条件转移指令。第 16 行 call 保存返回地址后跳到 f1,20 行 jmp 无条件跳到函数收尾,30 行 ret 从栈取返回地址并转到调用者;执行到这三条时都一定改变控制流。cmp、push、imul 虽影响标志、栈或数据,本身不执行这样的跳转。

**(3)相对地址与字节序。**16 行从 00401025H 开始,机器码 E8 D6 FF FF FF 共 5 B,所以紧接其后的第 17 行地址为 00401025H+5=0040102AH00401025\mathrm H+5=0040102A\mathrm H。相对 call 以完整指令之后的地址为基准,目标为 00401000H,偏移为

D=00401000H−0040102AH=−2AH=−42.D=00401000\mathrm H-0040102A\mathrm H=-2A\mathrm H=-42.

−42 的 32 位补码为 FFFFFFD6H,后四个字节却按 D6、FF、FF、FF 存储,最低有效字节在低地址,故 M 采用 小端。不能用 call 自身起点作相对基准,也不能把偏移的负数符号忽略。

**(4)为什么 13! 不等于返回值。**32 位有符号 int 最大值为 231−1=21474836472^{31}-1=2147483647,13!=62270208006227020800 超过它,无法完整表示。给定机器的 32 位乘法保留低 32 位,完整结果减去 232=42949672962^{32}=4294967296 后为 19320535041932053504,正好是所给返回值。改成 unsigned int 仍不足,因为 13! 也超过 32 位无符号上界。

应把返回类型及递归乘法改成 64 位整数,使中间结果也在宽类型中运算,例如:

cpp 复制代码
long long factorial(int n) {
    if (n <= 1) return 1;
    return static_cast<long long>(n) * factorial(n - 1);
}

此处递归返回 long long,n 也显式转换为 long long 后相乘,避免先在 int 中发生溢出再扩大结果。64 位有符号整数足够保存 13!,但不能据此宣称任意 n 都不溢出。实际 C/C++ 有符号 int 溢出属于未定义行为;保留低位是本题给定机器级执行结果,不能把它推广成语言普遍保证。

**(5)有符号乘法溢出检测。**完整乘积有 64 位,而 eax 只保存低 32 位。无溢出时,高 32 位必须恰好是低 32 位符号位的扩展:低半最高位为 0 时高半全 0,低半最高位为 1 时高半全 1。若不满足其中相应条件,就说明截断后无法恢复完整有符号数,置 OF=1。

若希望检测后自动进入异常处理,编译器可在 imul 后插入一条溢出自陷指令;题目的 32 位 x86 可用 INTO,OF=1 时触发溢出异常,OF=0 时继续。单独生成 imul 虽设置 OF,并不等于一定会自动转异常处理。

进入练习

第 46 题

计算机组成原理
7 分

32 位计算机 M 按字节编址,int 型数据占 32 位。计算阶乘 f(n)=n! 的 C 语言函数 f1 及部分机器级代码如下图所示,代码行包含行号、虚拟地址、机器指令和汇编指令。

2019 年第 46 题机器级代码

若计算机 M 的主存地址为 32 位,采用分页存储管理方式,页大小为 4KB,则第 1 行的 push 指令和第 30 行的 ret 指令是否在同一页中(说明理由)?若指令 Cache 有 64 行,采用 4 路组相联映射方式,主存块大小为 64B,则 32 位主存地址中,哪几位表示块内地址?哪几位表示 Cache 组号?哪几位表示标记(tag)信息?读取第 16 行的 call 指令时,只可能在指令 Cache 的哪一组中命中(说明理由)?

查看答案与解析收起答案与解析

**同页判断。**页面大小 4 KB=2122^{12} B=1000H,因此低 12 位为页内偏移,其余高位为页号。push 起点 00401000H 的页号为 00401H、偏移为 000H;ret 在 0040104AH,页号仍为 00401H、偏移为 04AH。两条都位于虚页范围 00401000H~00401FFFH,映射时也使用同一物理页框,所以在同一页。不能仅因地址十六进制写法不同就判断分页不同。

**Cache 地址划分。**64 行、4 路说明每组 4 行,共 64/4=16=2464/4=16=2^4 组。主存块 64 B=262^6 B,块内偏移需 6 位;组号需 4 位;32 位物理地址剩下 32−6−4=2232-6-4=22 位为 Tag,划分如下:

32 位地址字段 位范围(最低位为 0)
块内偏移 0~5
Cache 组号 6~9
Tag 10~31

**call 的组号。**第 16 行地址为 00401025H,页内偏移 025H,小于一个块的 40H,且其第 6~9 位全 0。组号计算为 (00401025H≫6)&FH=0(00401025\mathrm H\gg6)\mathbin{\&}F\mathrm H=0,只可能在 第 0 组 的四路之一命中;映射方式不允许改到其他组。

题目给的是虚地址而 Cache 使用主存地址,但组号与块内偏移合计 10 位,全部位于地址转换不改变的低 12 位页内偏移中,所以不必知道该页具体映射的物理页框,也能确定组号。物理 Tag 的高位则会受页框映射影响,不能同样直接从虚页号当作物理 Tag。call 共 5 B,025H~029H 也没有跨出这个 64 B 块。

进入练习

第 47 题

计算机网络
9 分

某网络拓扑如题47图所示,其中 R 为路由器,主机 H1~H4 的 IP 地址配置以及 R 的各接口 IP 地址配置如图中所示。现有若干以太网交换机(无 VLAN 功能)和路由器两类网络互连设备可供选择。

2019 年第 47 题配图

请回答下列问题:

(1)设备 1、设备 2和设备 3 分别应选择什么类型的网络设备?

(2)设备 1、设备 2和设备 3 中,哪几个设备的接口需要配置 IP 地址?为对应的接口配置正确的 IP 地址。

(3)为确保主机 H1~H4 能够访问 Internet,R 需要提供什么服务?

(4)若主机 H3 发送一个目的地址为 192.168.1.127 的 IP 数据报,网络中哪几个主机会接收该数据报?

查看答案与解析收起答案与解析

(1)选设备类型。H1、H2 的 /26 地址属于 192.168.1.0/26;H3、H4 属于 192.168.1.64/26;R 下面的 /30 接口属于 192.168.1.252/30。设备 1 连接这三个不同子网,需要按 IP 路由,故应选择路由器。设备 2、3 分别连接同一子网内的两台主机与上联接口,只需转发以太网帧,可选以太网交换机。无 VLAN 的交换机不能替代设备 1 提供图中三个子网间的网关。

**(2)哪些接口要配置 IP。**设备 1 的三个路由接口需有所在网络内的有效地址。IF2、IF3 必须分别使用图中主机已设置的默认网关 .1、.65;IF1 与 R 的 .253 位于 /30,另一个可用地址是 .254。配置如下:

接口 IP 地址 前缀
IF1 192.168.1.254 /30
IF2 192.168.1.1 /26
IF3 192.168.1.65 /26

IF1 所在 /30 的网络为 .252,广播为 .255,不能把它们分给接口。设备 2、3 的二层转发接口不需配置 IP,交换机按 MAC 表完成工作;可选管理 IP 不属于本题的数据转发要求。

**(3)访问 Internet 所需服务。**H1~H4 的 192.168.. 是私网地址,不能以这些地址在公网获得正常全局路由。R 应提供 NAT,将内部源地址转换为其公网地址 101.1.2.10;多个主机同时使用同一公网地址时,可通过端口转换 NAPT 区分连接,并把返回数据恢复为相应内部地址。仅有路由转发而无私网到公网的转换,不能满足图中这一公网出口方式。

**(4)广播接收范围。**192.168.1.64/26 保留 6 位主机号,范围为 .64~.127,网络地址 .64、广播地址 .127。H3 发向 192.168.1.127,是向自己子网广播;设备 3 会把帧转发到同广播域的其他端口,除发送者 H3 外,接收该数据报的主机是 H4。设备 1 不把普通子网广播转发到另一子网,H1、H2 位于 .0/26,因而不会接收。广播范围由子网前缀与路由器边界决定,不是看到前 24 位都为 192.168.1 就认为四主机在同一子网。

进入练习