选择题
数据结构
以下 C 代码的时间复杂度是( )。
int count = 0;
for (int i=0; i*i<n; i++)
for (int j=0; j<i; j++)
count++;
查看答案与解析
正确答案:B
正确答案:B外层循环的条件是 ,因此 i 的最大值为 。内层循环的的次数同样与 i 相同。所以总的循环次数为 ,时间复杂度为 。
整卷阅读
作答方式
阅读模式保留整卷文档,游戏模式按题闯关并即时反馈。
| 1 | B | 2 | D | 3 | D | 4 | B | 5 | D |
| 6 | C | 7 | C | 8 | C | 9 | A | 10 | D |
| 11 | A | 12 | D | 13 | D | 14 | D | 15 | C |
| 16 | B | 17 | C | 18 | B | 19 | A | 20 | A |
| 21 | B | 22 | A | 23 | D | 24 | C | 25 | C |
| 26 | B | 27 | D | 28 | C | 29 | C | 30 | A |
| 31 | C | 32 | B | 33 | B | 34 | C | 35 | C |
| 36 | C | 37 | B | 38 | A | 39 | B | 40 | A |
以下 C 代码的时间复杂度是( )。
int count = 0;
for (int i=0; i*i<n; i++)
for (int j=0; j<i; j++)
count++;
正确答案:B
正确答案:B对于括号匹配问题,符号栈初始为空,容量为 3,下列表达式不能实现的是( )。
正确答案:D
正确答案:D栈的容量为 3,意味着在任何时候,栈中的元素数量不能超过 3。需要选择一个在某些时刻栈的深度超过 3 的表达式。通过分析各个选项的嵌套深度,可以发现:
(a+[b+(c+d)e]+f)+g-h([(+)]),最多 3 个未匹配括号,正确。[a*((b+c)/(d-e)+f/g)]-h[(())],最多 3 个未匹配括号,正确。[a*(b-(c-d)*e/(f+g))-h][()()],最多 3 个未匹配括号,正确。[a-(b+[c*(d+e)-f]+g+h)][([])],最多 4 个未匹配括号,错误。若二叉树的节点值均为正整数,采用顺序存储方式保存在数组 R 中,用 -1 表示节点不存在,则下列数组中,不能表示一棵二叉树的是()。
正确答案:D
正确答案:D在二叉树的顺序存储表示中,数组中的每个位置对应二叉树中特定节点。若节点值非负(-1 表示不存在),则非 -1 节点的父节点必须存在(根节点除外)。
对于选项 D,索引 8 处的节点值为 19,其父节点索引为 3(由公式
计算),但索引 3 处的值为 -1,即父节点不存在,违反了二叉树顺序存储的规则。因此,选项 D 不能表示一棵二叉树。

其他选项均满足每个非 -1 节点(除根节点)都有存在的父节点,是有效的二叉树顺序存储表示。
下列关于二叉树及森林的叙述中,正确的是?( )。
设字符集 S 包含 7 个字符,各字符出现的频次分别是 2, 3, 4, 6, 8, 10, 11。 为 S 中的各字符构造哈夫曼编码,编码长度不小于 3 的字符个数是( )。
正确答案:D
正确答案:D按照 哈夫曼树 构造:频次为 2, 3, 4, 6, 8, 10, 11
可以得到以下二叉树:
44
/ \
19 25
/ \ / \
9 10 11 14
/ \ / \
4 5 6 8
/ \
2 3
编码长度不小于 3 的字符:2, 3, 4, 6, 8。一共有 5 个字符编码长度不小于 3,正确答案为 D。
下列关于图的叙述中,正确的是( )。
正确答案:C
正确答案:C逐个选项来看:
已知查找表中有 400 个元素,查找元素概率相同。采用分块查找法且均匀分块。若采用顺序查找法确定元素所在块,且块内也采用顺序查找法,为效率最高,每块包含元素应为( )。
正确答案:C
正确答案:C设块大小为 ,块数为 。查找复杂度为 。
根据高中数学的知识可以得知, 时,查找复杂度最低,所以 。
给 7 个不同的关键字,能够构成不同 4 阶 B 树的个数为( )。
正确答案:C
正确答案:C综上,共计 9 种可能的结构。
下列关于散列法处理冲突的叙述中,正确的是( )。
正确答案:A
正确答案:A在散列(哈希)方法中,同义词 是指不同的元素通过哈希函数映射到同一个哈希值(或哈希地址)。这意味着这些元素在散列表中会发生冲突,因为它们试图占用相同的位置。
非同义词 指的是通过哈希函数映射到不同哈希值的元素,它们通常不会在初始哈希地址上发生冲突。
对于题目中的选项:
A. 只要散列表不满,线性探查再散列一定能找到一个空闲位置。
线性探查是在发生冲突时,按顺序查找下一个可用位置。例如,如果发生冲突,就逐一检查下一个位置,直到找到空闲位置。只要散列表有空位,线性探查一定能找到一个空闲位置。因此,这个选项是正确的。
B. 只要散列表不满,二次探查再散列一定能找到一个空闲位置。
二次探查是通过二次函数(如平方)来决定下一个检查的位置。虽然理论上在某些情况下可能会更快找到空位,但由于散列表的装填因子和特定的探查序列,可能会有探查不到空闲位置的情况,因此这个选项不一定总是正确。
C. 线性探查再散列处理的冲突,一定是发生在同义词之间。
线性探查处理的冲突可能发生在同义词之间(即初始哈希值相同的元素),但也可能发生在非同义词之间(即由于探查过程而导致的冲突)。因此,这个选项是不正确的。
D. 二次探查再散列处理的冲突,一定是发生在非同义词之间。
二次探查可能会导致同义词和非同义词之间的冲突。因此,这个选项是不正确的。
下列排序算法中,最坏情况下元素移动最少的是( )。
对含 9 个关键字的初始序列进行排序,若序列的变化情况如下表所示,则下列排序算法中,采用的是( )。
| 初始序列 | 5, 25, 40, 30, 10, 20, 45, 15, 35 |
| 第 1 趟排序后的序列 | 5, 10, 20, 30, 15, 35, 45, 25, 40 |
| 第 2 趟排序后的序列 | 5, 10, 15, 25, 20, 30, 40, 35, 45 |
在 32 位计算机上执行下列 C 语言代码:
short si = -32767
unsigned int ui = si;
则 ui 的真值为( )。
已知 float 型变量用 IEEE754 单精度浮点数格式表示。若 float 型变量 x 的机器数为 4730 0000H;则 x 的值为( )。
正确答案:D
正确答案:D本题考察 IEEE 单精度浮点数表示。首先将十六进制转化为二进制:0100 0111 0011 0000 0000 0000 0000 0000。
然后从中分解符号位、指数位和尾数位:
0。1000 1110。011 0000 0000 0000 0000 0000。计算阶码: 。
计算尾数: 。
计算浮点数的值:
假设 8 位字长的计算机中,两个带符号整数 x 和 y 的补码表示分别为 , ,则通过补码加减运算器得到的 x-y 的值及 OF 标志分别为( )。
正确答案:D
正确答案:Dx 的补码二进制表示为 1010 0011。y 的补码二进制表示为 0111 0101。
x-y = x+(-y) = 1010 0011 + 1000 1011 = 0010 1110 = 32 + 8 + 4 + 2 = 46.
二进制加法时最高位有进位,所以 OF = 1。
某 32 计算机按字节编址,采用小端方式存放数据,编译器按边界对齐方式为下列 C 语言结构型数组变量 employce 分配储存空间。
struct record {
int id;
char name[10];
int salary;
} employee[200];
数组 employee 的起始地址为 0000A0B0H,employee[1].id 的机器数为 12345678H,问 56H 的地址是多少?( )。
正确答案:C
正确答案:C在 小端方式 下,数据的存放顺序是从最低有效字节到最高有效字节。例如,对于一个 4 字节的整数 12345678H,存放顺序为 78H 56H 34H 12H。
首先,我们需要计算 struct record 的大小。根据定义:
int id; 占用 4 字节。char name[10]; 占用 10 字节。int salary; 占用 4 字节。总共需要 18 字节。然而,由于编译器按 边界对齐 方式分配存储空间,通常会对齐到最接近的 4 字节边界。因此,struct record 实际上会占用 20 字节(因为 18 需要向上对齐到 20)。
数组 employee 的起始地址为 0000A0B0H。employee[1] 的起始地址为 0000A0B0H + 20 = 0000A0C4H
在 employee[1] 中,id 的值为 12345678H,存储在小端模式下:
因此,56H 的地址是 0000A0C5H。
下列选项中,由指令体系结构(ISA)规定的是( )。
正确答案:B
正确答案:B指令体系结构主要规定的是计算机系统中硬件和软件之间的接口,即指令的格式、操作码、操作数及寻址方式等。ISA 是软件开发人员和编译器设计者需要了解的部分,而硬件实现的具体细节通常由计算机体系结构的实现部分决定,而不是由 ISA 直接规定。
选项中:
下列关于 RISC 的叙述中,错误的是( )。
正确答案:C
正确答案:C下列关于 CPI 和 CPU 时钟周期的叙述中,错误的是( )。
正确答案:B
正确答案:BLOAD 执行的平均时钟周期数。❌下列关于 CPU 中的数据通路和控制器的叙述中,错误的是( )。
正确答案:A
正确答案:A某处理器总线采用同步,并行传输方式,每个总线时钟周期传送 4 次数据(quadpumped 技术),若该总线的工作频率为 1333MHz(实际单位是 MT/s,表示每秒传送 1333M/次),总线宽度为 64 位,则总线带宽约为( )。
正确答案:A
正确答案:A这一题是一道埋坑题,考查 总线指标 中工作频率和时钟频率的不同,杂货铺本人和多位同学一起确认,最后发现本题的原题中标记为 工作频率 而不是 时钟频率:

总线带宽可以通过以下方式计算:
因为题目中给出的是时钟频率,所以总线带宽计算为 1333M * 8B ≈ 10.66GB/s,答案选择 A。
如果 题目中给出的是 时钟频率为 1333MHz,则
总线每秒传输的数据量为 1333M × 8B × 4 ≈ 42.66G,此时答案选 B。
下列设备中,适合采用 DMA 输入输出的设备是( )。
I. 键盘
II. 网卡
III. 固态硬盘
IV. 针式打印机
正确答案:B
正确答案:B下列选项中,会触发外部中断请求的事件是( )。
正确答案:A
正确答案:A关于虚拟化技术,下列说法错误的是( )。
正确答案:C
正确答案:CA. 操作系统可以在虚拟机上运行 ✅
正确。虚拟机(VM)提供了一个与真实硬件类似的环境,操作系统可以像在物理机上一样运行在虚拟机中。
B. 一台主机可以支持多个虚拟机 ✅
正确。虚拟化的核心能力之一就是在同一物理主机上运行多个虚拟机实例,每个实例看起来像是一台独立的机器。
C. VMM 与操作系统特权级相同 ❌
错误。VMM(虚拟机监控器或 Hypervisor)通常运行在比普通操作系统更高的特权级,因为它需要控制底层硬件资源,并管理多个客户操作系统。例如在 x86 架构中,VMM 通常在Ring -1(即硬件支持的更低层)运行,而操作系统在 Ring 0。
即使是某些 Type 2 Hypervisor(如 VMware Workstation)运行在宿主操作系统上,也会通过硬件辅助(如 Intel VT-x)获得高特权级访问。
D. 通过虚拟机技术,可以用一台主机上模拟多种 ISA ✅
正确,尽管这项功能涉及更多的是 仿真(emulation) 而非传统虚拟化。例如使用 QEMU 可以在 x86 主机上模拟 ARM、MIPS 等架构。不过现代虚拟化系统也可以部分结合硬件虚拟化技术来提高效率。
所以正确答案是:C。
在优先权调度中,采用单链表保存进程就绪队列,高优先级进程在队头。若就绪队列长度为 n,则插入进程、选出进程的时间复杂度为( )。
正确答案:C
正确答案:C在 优先级调度 中,如果我们采用单链表来保存进程就绪队列,并且高优先级进程在队头,那么:
现有一 LRU 算法,采用固定分配局部置换的页面置换策略,已为进程分配 3 个页框,页面访问序列为 {0,1,2,0,5,1,4,3,0,2,3,2,0 },其中 0,1,2 已调入内存。则缺页次数是( )。
正确答案:B
正确答案:B在 LRU 算法中,每当需要访问一个不在当前内存中的页面时,就需要进行置换操作,并选择当前内存中最久未使用的页面进行替换。我们按照给定的页面访问序列进行模拟:
初始状态:内存中页面为 {0, 1, 2},访问序列:
| 访问页面 | 是否命中/缺页 | 之后的内存页面 |
|---|---|---|
| 0 | 命中 | {1, 2, 0} |
| 1 | 命中 | {2, 0, 1} |
| 2 | 命中 | {0, 1, 2} |
| 0 | 命中 | {1, 2, 0} |
| 5 | 缺页,替换页面 1 | {2, 0, 5} |
| 1 | 缺页,替换页面 2 | {0, 5, 1} |
| 4 | 缺页,替换页面 0 | {5, 1, 4} |
| 3 | 缺页,替换页面 5 | {1, 4, 3} |
| 0 | 缺页,替换页面 1 | {4, 3, 0} |
| 2 | 缺页,替换页面 4 | {3, 0, 2} |
| 3 | 命中 | {0, 2, 3} |
| 2 | 命中 | {0, 3, 2} |
| 0 | 命中 | {3, 2, 0} |
总计缺页次数为 6 次。
确定进程运行所需的最少页框数时,要考虑的指标是( )。
正确答案:D
正确答案:D确定进程运行所需的最少页框数时,主要需考虑以下指标:
D. 指令系统支持的寻址方式
指令系统的寻址方式直接影响进程执行时可能访问的页框数量。例如,若指令支持间接寻址,则需更多页框以处理跨页访问的情况。
每条指令若仅包含一个内存地址,则至少需1个页框;若涉及跨页访问或间接寻址,则需更多页框(如4个页框)。
其他选项分析
综上,正确答案为 D。
关于虚拟文件系统,下列说法正确的是( )。
正确答案:C
正确答案:C虚拟文件系统 是一个抽象层,提供了一种统一的接口,使操作系统能够支持不同类型的文件系统。它通过这种抽象,使得上层应用程序可以通过统一的接口访问不同的底层文件系统,而不需要关心底层文件系统的具体实现细节。
某文件系统采用索引节点方式。用户在目录中新建文件 F 时,文件系统不会做的是( )。
关于内存映射文件,下列说法正确的是( )。
I. 可实现进程间通信
II. 实现了页面到磁盘块的映射
III. 将文件映射到进程的虚拟地址空间
IV. 将文件映射到系统的物理地址空间
正确答案:A
正确答案:A本题考察 内存映射文件,现对选项进行逐一分析:
所以正确的是 I、III,选择 A。
【注意】 严格来说,II 的描述是符合现代操作系统的实现的(比如 linux 中的 mmap 接口中如果开启 MAP_SHARED(共享映射),写入页面即写入磁盘,即 页面 和 磁盘块 是双向映射关系)。
估计出卷人的意思是内存映射文件 语义 是 磁盘块 → 页面的映射,而不是 页面 → 磁盘块,所以 II 是错误的,从这种角度来看也说得通。
要是考场上这种题真的错了那就认了吧,毕竟这种概念题有分歧在 408 是很正常的,但是数量也会比较少就是了。
下列选项中,文件系统能为温彻斯特硬盘和固态硬盘提供的功能是( )。
正确答案:B
正确答案:B关于文件系统能为温彻斯特硬盘(HDD)和固态硬盘(SSD)提供的功能,分析如下:
A. 划分扇区
扇区是磁盘物理结构的固有属性,由硬盘制造商在出厂时划分,文件系统不参与扇区的物理划分。
B. 确定盘块大小
文件系统通过逻辑格式化设定文件存储的基本单位(如 4KB 的块大小),这是文件系统对物理存储的逻辑抽象,适用于 HDD 和 SSD。
C. 降低寻道时间
寻道时间是 HDD 特有的机械性能指标,文件系统无法直接优化;而 SSD 无机械部件,不存在寻道时间问题。
D. 实现均衡磨损
这是 SSD 特有的功能,由 SSD 控制器通过磨损均衡算法实现,文件系统仅能通过 Trim 指令辅助,并非直接控制。
正确答案:B(确定盘块大小) 文件系统通过逻辑格式化统一管理存储空间,为 HDD 和 SSD 定义逻辑块大小,这是两者共有的功能。
如下图所示,主机 H1 向 H2 发送一个 2MB(1MB = B)文件有三种方式:① 电路交换,建立时间为 32us,速度为 10Mbps;② 分组交换,分组长度为 400B,忽略首部;③ 报文交换。电路交换的时间为 ,报文交换的时间为 ,分组交换的时间为 ,则三者的大小关系是( )。
正确答案:B
正确答案:B参考 传输时间计算:
经计算可知 。
某差错编码的编码集为 { 10011010,01011100,11110000,00001111 },其检错和纠错能力是( )。
正确答案:C
正确答案:C先求这 4 个 8 位码字的两两 海明距离(统计对应位不同的个数):
| 码字对 | 距离 |
|---|---|
| 10011010 – 01011100 | 4 |
| 10011010 – 11110000 | 4 |
| 10011010 – 00001111 | 4 |
| 01011100 – 11110000 | 4 |
| 01011100 – 00001111 | 4 |
| 11110000 – 00001111 | 8 |
最小汉明距离 。
因此正确选项为 C:
可以检测不超过 3 位错,检错率 100%;可纠正不超过 1 位错
现有一 10BaseT 以太网,甲乙处于同一个冲突域,连续发生 11 次冲突,甲再次发送的最大时间间隔为( )。
正确答案:C
正确答案:C在以太网中,当发生冲突时,发送节点将执行 指数退避算法。在这个算法中,节点在重传之前会等待一个随机的时间间隔,这个时间间隔是以时隙(slot time)为单位计算的。
对于 10BaseT 以太网,时隙时间(slot time)为 51.2 微秒(0.0512 毫秒)。
在指数退避算法中,第 n 次重传时,节点会从 到 的范围内随机选择一个整数 k,然后等待 k 个时隙的时间。需要注意的是,当 n 达到 10 或更大时,退避范围的上限固定为 1023(即 )。
在题目中,已经发生了 11 次冲突,意味着这是第 12 次重传尝试。因此,n = 11,但因为 的时候,k 的范围是 0 到 1023。
因此,甲再次发送的最大时间间隔为 1023 个时隙时间,即:
一台新接入网络的主机 H 通过 DHCP 服务器动态请求 IP 地址过程中,与 DHCP 服务器交换 DHCP 报文过程如下图所示。封装 DHCP 的 REQUEST 报文的 P 数据报的目的 IP 地址和源 IP 地址分别是( )。
正确答案:C
正确答案:CDHCP 的 REQUEST 报文:
目的 IP 地址:DHCP 服务器的 IP 地址或者广播地址(255.255.255.255),因为主机可能不知道 DHCP 服务器的确切 IP 地址,尤其是在初始请求阶段,广播地址确保网络中的所有 DHCP 服务器都能接收到请求。
源 IP 地址:0.0.0.0,因为主机还未获得正式的 IP 地址,在这个阶段它使用 0.0.0.0 作为源地址来表示“没有 IP 地址”。
假设路由器实现 NAT 功能,内网中主机 H 的 IP 地址为 192.168.1.5/24。若 H 运行某应用向 internet 发送一个 UDP 报文段,则路由器在转发封装该 UDP 报文段的 IP 数据报的过程中,UDP 报文的首部字段会被修改的是( )。
I 源端口号
II 目的端口号
III 总长度
IV 校验和
正确答案:B
正确答案:B因此,路由器在转发封装该 UDP 报文段的过程中,可能会修改的字段是源端口号和校验和,答案选 B。
主机甲通过 TCP 向主机乙发送数据的部分过程如下图,seq 为序号,ack-seq 为确认序号,rcwnd 为接收窗口。甲在 时刻的拥塞窗口和发送窗口均为 2000B,拥塞控制阈值为 8000B,MSS=1000B。甲始终以 MSS 发送 TCP 段。若甲在 时刻收到如图所示的确认段,则甲在未收到新的确认段之前,还可以继续向乙发送的 TCP 段数是( )。
正确答案:A
正确答案:A发送窗口取拥塞窗口和接收窗口之间的较小值,即 swnd = min(cwnd, rwnd)。
根据 ack_seq = 3001 可知,目前乙已经接收到了 1000B 的数据即一个 1 个 MSS,seq = 3001 的 MSS 仍然在发送中,并且此时乙的接收窗口(swnd)为 4 个 MSS。
此外,由于甲目前仍然在慢开始阶段(发送窗口没有达到阈值),所以接收到乙的确认后,拥塞窗口要 +1,此时 cwnd = 3 MSS。
所以发送窗口 swmd = min(3, 4) = 3 MSS。
另外需要注意这个公式:
发送窗口 的大小(swnd) = 已经发送但还没有确认数据(inflight) + 还没有发送的数据。这一题问的是甲还可以向乙发送多少个 TCP 段,这要减去那些之前已经发送但还没有确认的数据(1 MSS)。
所以还可以发送 3 - 1 = 2 MSS,答案选择 B。
Time 是一个提供时间查询服务的 C/S 架构网络应用,支持客户通过 UDP 和 TCP 向 Time 服务器请求时间。若某客户与 Time 服务器通信往返时间为 8ms,则该客户分别通过 UDP 和 TCP 向该服务器请求服务,所需的最少时间分别是( )。
正确答案:B
正确答案:B关于 POP3,正确的是( )。
I 支持用户代理从邮件服务器读取邮件
II 支持用户代理向邮件服务器发送邮件
III 支持邮件服务器之间发送与接收邮件
IV 支持一条 TCP 连接收取多封邮件
正确答案:A
正确答案:A本题考察 POP3 协议,对题目提供的选项进行逐一分析:
所以 I、IV 是正确的,本题答案为 A。
设有两个长度均为 n 的一维整型数组 A 和 res,对数组 A 中的每个元素 A[i],计算 A[i] 与 A[j](0 ≤ i ≤ j ≤ n-1) 乘积的最大值,并将其保存到 res[i]中。例如,若 A[i] = {1, 4, -9, 6},则得到 res[i] = {6, 24, 81, 36}。现给定数组 A,请设计一个时间和空间上尽可能高效的算法 calMulMax,求 res 中各元素的值。函数原型为:void calMulMax(int A[], int res[], int n),要求:
(1) 给出算法的基本设计思想:(4 分)
(2) 根据设计思想,采用 C 或 C++ 语言描述算法,关键之处给出注释:(7 分)
(3) 说明你所设计算法的时间复杂度和空间复杂度。(2 分)
1)若 A[i] 为负数的话,则 A[j] 为子数组 A[i:n] 中的最小值时,A[i] * A[j] 为最大值。若 A[i] 为正数的话,则 A[j] 为子数组 A[i:n] 中的最大值时,A[i] * A[j] 为最大值。
因此算法步骤如下:
A:maxValue 来存储当前从 i 到 n-1 范围内的最大值。minValue 来存储当前从 i 到 n-1 范围内的最小值。maxValue 和 minValue。A[i] * maxValue 和 A[i] * minValue,并将它们的较大值存储在 res[i] 中。maxValue 和 minValue:在每次迭代中,maxValue 是当前元素与之前的 maxValue 的较大值,minValue 是当前元素与之前的 minValue 的较小值。2)算法实现如下:
void calMulMax(int A[], int res[], int n) {
int minValue = INT32_MAX;
int maxValue = INT32_MIN;
for (int i = n-1; i >= 0; i--) {
if (A[i] < minValue) {
minValue = A[i];
}
if (A[i] > maxValue) {
maxValue = A[i];
}
if (A[i] > 0) {
res[i] = A[i] * maxValue;
} else {
res[i] = A[i] * minValue;
}
}
}
3)算法的时间复杂度为 O(n),空间复杂度为 O(1)。
AOE 网,描述 12 个工程活动及持续时间
(1) 完成该工程的最短时间是多少?哪些是关键活动?
(2) 若以最短时间完成工程,则与活动 e 同时进行的活动可能有哪些?
(3) 时间余量最大的活动是哪个?其时间余量是多少?
(4) 假设工程从时刻 0 启动,因某种原因,活动 b 在时刻 6 开始,为保证工程不延期,在其它活动持续时间保持不变的情况下,b 的持续时间最多是多少?若不改变 b 的持续时间,则压缩哪个活动的持续时间也能保证工程不延期?
1)首先计算最早发生时间 ve:
| node | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| ve | 0 | 9 | 2 | 5 | 12 | 6 | 9 |
然后计算最晚发生时间:
| node | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| vl | 0 | 10 | 2 | 5 | 12 | 8 | 9 |
ve 和 vl 相同的顶点为 1、3、4、7、5,所以关键活动为 a、e、m、n。
2)e 的执行时间是 2~5,可以与 e 同时执行的活动为 b、d、c。
3)假设有顶点 i→j 的活动(边),则该活动的 时间余量 = vl(j) - ve(i) - 边的长度。
计算所有非关键路径上活动的时间余量,可以得到活动 j 的时间余量是最大的,为 vl(5) - ve(4) - 1 = 6。
4)为保证 1 → 2 → 5 的路径长度不超过关键路径的长度,需要保证 6 + b + k ≤ 12,所以 b ≤ 4,即 b 的持续时间最长为 4。如果想要保证 b 仍然为 5 的话,需要压缩 k 的时间长度,将 k 缩小为 1。
计算机 M 字长为 32 位,按字节编址,数据 cache 的数据区大小为 32KB,采 8 路组相联,主存块大小为 64B,cache 命中时间为 2 个时钟周期,缺失损失为 200 个时钟周期,采用页式虚拟存储,页大小为 4KB。数组 d 的起始地址为 0180 0020H(VA31~VA0)。
(1) 主存地址中的 Cache 组号,块内地址分别占几位?VA 中哪些位可以作为 Cache 索引。
(2) d[100] 的 VA 是多少?d[100] 所在主存块中对应的 Cache 组号是多少?
(3) 设代码已经在 cache 中,i,x 已装入内存,但不在 cache,则 d[0] 在其主存块内的偏移量是多少?执行 for 的过程中,访问 d 的 Cache 缺失率和数组元素的平均访问时间分别是多少?(缺失率用百分比表示,保留两位小数)
(4) d 分布在几个页中?若代码已在主存,d 不在主存,则执行 for 的过程中,访问 d 所引起的缺页次数是?
int x, d[2048], i;
for (i = 0; i < 2048; i++)
d[i] = d[i]/x;
1)cache 块大小和主存块大小一致为 64B,所以块内偏移为 6 位( )。
cache 块的数量为 32KB / 64B = 512,由于采用 8 路组相连,所以总共有 512 / 8 = 64 个组,组号占 6 位( )。
所以第 6 位到第 11 位可以作为 Cache 索引(用来定位地址可能被哪一组所缓存)。
2)&d[100] = d + 100 * 4 = 0x0180 0020 + 400 = 0x0180 01B0,对应的二进制为 0000 0001 1000 0000 0000 0001 1011 0000,组号为 000110B 即 6。
3)物理地址的结构为:页内偏移 12 位,物理页号 20 位,所以 &d[0] 的页内偏移为 020H = 32。 数组总共需要用 2048 * 4 / 64 = 128 个完整 cache 块存储,但由于数组第一个元素处于某个 cache 的中间(偏移为 32),所以总共需要 129 个 cache 块存储,在访问每个 cache 块中的第一个元素时会发生 Cache 缺失。
另外需要注意一点,对于指令 d[i] = d[i] / x,实际上是访问了两次:一次读取,一次写入。所以在计算缺失率和平均访问时间的时候需要考虑这两次访问。
缺失率 = 129 / (2048 * 2) ≈ 3.15%。
数组的平均访问时间为 = (129 * 200 + (4096 - 129) * 2) / 4096 ≈ 8.24 个时钟周期。
4)数组 d 需要占用 8KB 的存储空间,占用两个页面。由于数组的起始地址处于页面内部(偏移 32B),所以数组 d 分布在三个页面中,触发的缺页次数为 3。
接上题,R0~R4 为通用寄存器,SEXT 表示按符号扩展,M 中补码除法器,逻辑结构图如下:
机器级代码:
// x 在 R2 中,i 在 R4 中
// 数组 d 的首地址在 R3 中
mov R1,(R3+R4*4) // R1 ← d[i]
scov R1 // {R0,R1} ← SEXT(R1)
idiv R1 // R1<-({R0,R1}/R2)
(1) 若执行 idiv 指令时,d[i]=0x87654321,x=0xff,则补码除法器中 R、Q、Y 的初始值分别为多少(用十六进制表示)? 图 b 中哪个部分包含计数器?在补码除法器执行过程中,ALUop 所控制的 ALU 运算有哪几种?
(2) 假设 idiv 执行过程中会检测并触发除法异常,则执行 idiv 指令时,哪些情况下会发生除法异常(要求给出此时 d[i] 和 x 的十六进制机器数)。发生除法异常时,在异常响应过程中,CPU 需要完成哪些操作?
【答案】
1)R 中的值为 0xffffffff,Q 中的值为 0x87654321,Y 中的值为 0x000000ff。b 中的控制逻辑包含计数器,ALUop 所控制的 ALU 运算包含加法和减法。
2)第一种情况除数为 0 异常,d[i] 为任意值,x 为 0x00000000。第二种情况溢出异常,d[i] 为 0x80000000,x 为 0xffffffff,在 d[i] = -2³¹、x = -1 的情况下会发生溢出异常。
在发生除法异常时 CPU 响应的操作:
【解析】
1)寄存器初始值分析
d[1] = 0x87654321 是 32 位补码,最高位为 1(符号位),经 sccv 符号扩展为 64 位,高 32 位为 0xFFFFFFFF,低 32 位为 0x87654321。0xFFFFFFFF0x87654321x = 0xff → 0x000000FF(这里虽然只用了 8 位,但是表示的意思是 255,最高位不是符号位)计数器位置
图中控制逻辑模块包含计数器 C,用于控制除法迭代次数(32 次,对应 32 位前)。
ALU 运算类型
补码除法采用加减交替法,ALU 需支持两种运算:
R - Y(试减,判断余数符号)R + Y(若余数为负,恢复余数)2) 除法异常的情况
除法异常包括 除以 0 和 商溢出:
情况 1:除以 0
x = 0x00000000 时,无论 d[1] 为何值,触发除以 0 异常。情况 2:商溢出
[-2^31, 2^31 - 1]。d[1] = 0x80000000(-2^31,32 位补码最小值)且 x = 0xFFFFFFFF(-1)时:(-2^31) / (-1) = 2^31,超出 32 位补码最大值 2^31 - 1,触发商溢出异常。异常响应的 CPU 操作
异常响应时,CPU 需完成以下核心步骤:
三个人一起植树,甲挖坑,乙放树苗入坑并填土,丙负责为新种树苗浇水。步骤依次为:挖树坑,放树苗,填土和浇水。现在有铁锹和水桶各一个,铁锹用于挖树坑,填土。水桶用于浇水。当树坑数量小于 3 时,甲才可以挖树坑。设初始坑 = 0,铁锹水桶均可用,定义尽可能少的信号量,用 wait() 和 signal() 操作描述植树过程中三人的同步互斥关系,并说明所用信号量的作用及其初值。
这题是一个近似于流水线的结构,其过程为:挖树坑(甲)→ 放树苗、填土(乙)→ 浇水(丙)。不过甲最多可以同时挖三个树苗,也就是说不允许同时存在 4 个未被乙使用的树坑,这是比较复杂的一点。
实现甲和乙之间的同步需要使用到 pits 和 empty 这两个信号量,同时还需要一个 water 信号量来实现乙和丁的同步,代码实现如下:
semaphore mutex = 1; // 对铁锹的使用需要互斥
semaphore pits = 3; // 甲还能挖洞的数量
sempahore empty = 0; // 可以使用的树坑数量
sempahore water = 0; // 需要浇水的水苗数量
甲() {
while (1) {
wait(pits); // 最多只能挖三个未被乙使用的坑
wait(mutex); // 占用铁锹
挖树坑;
signal(mutex); // 释放铁锹
signal(empty); // 通知乙可以放树苗和填土了
}
}
乙() {
while (1) {
wait(empty); // 等待到有树坑为止
wait(mutex); // 占用铁锹
放树苗、填土;
signal(mutex); // 释放铁锹
signal(pits); // 通知甲可以继续挖坑了
signal(water); // 通知丙可以浇水了
}
}
丙() {
while (1) {
wait(water);
浇水;
}
}
某进程的虚拟地址空间如图,阴影部分为未占用区域,有 C 程序:
char * ptr;
void main() {
int length;
ptr=(char*) malloc(100);
scanf("%s", ptr);
length = strlen(ptr);
printf("length=%d\n", length);
free(ptr) ;
}
(1) 上述程序执行时,PCB 位于哪个区域,执行 scanf () 等待键盘输入时,该进程处于什么状态?
(2) main() 函数的代码位于哪个区域?其直接调用的哪些函数的功能需要通过执行驱动程序实现?
(3) 变量 ptr 被分配在哪个区域?若变量 length 没有被分配在寄存器中,则会被分配在哪个区域?ptr 指向的字符串位于哪个区域?
本题考察 进程内存空间,题目中给出的内存结构和标准 linux 进程结构由些许差异,主要不同点在于图中的 读/写代码段 将 .bss 和 .data 融合了,考生看到能够理解就可以。
1)进程管理属于操作系统提供的功能,所以 PCB(进程)位于内核区,执行 scanf() 时,进程在等待键盘 I/O,处于阻塞态。
2)main() 函数的代码位于只读代码段(.text),其直接调用的 scanf() 和 printf() 需要执行驱动程序。
3)ptr 是作为全局变量定义的,所以其位于读/写数据段,length 变量在 main 函数中定义,如果该变量不在寄存器中被分配的话,那么就位于用户栈段,ptr 指针指向的内存单元是使用 malloc 函数动态分配的,位于堆区。
(1) 忽略卫星信号中继,TR1,TR2 调制解调开销,则 R1 到 R2 之间的卫星链路单向传播时延是多少?主机 H 向总部服务器传输数据时可达到的最大吞吐量是多少?若忽略各层协议首部开销,以及以太网的传播时延,则 H → server 上传一个 4000B 的文件,至少需要多长时间?
(2) 基于 GBN 为卫星链路设计单向可靠的链路层协议 SLP,支持 R1 → R2 发送数据。SLP 数据帧长 1500B,忽略 ACK 帧长度,要求 SLP 单向信道利用率不低于 80%,则发送窗口至少为?SLP 帧序号至少为多少?
(3) 总部给工程部分配 IP 地址空间 10.10.10.0/24,再划分为 3 个子网:管理区子网、生活区子网、作业区子网。已知管理区子网地址为 10.10.10.33/26,若生活区子网不少于 120 个,作业子网、管理区子网 IP 均不少于 60 个,H 已正确配置 IP。请问作业区子网和生活区子网地址各是多少?
1)计算卫星链路的单向传播时延:在忽略卫星信号中继、TR1、TR2 调制解调开销的情况下,R1 到 R2 之间的卫星链路单向传播时延主要取决于电滋波在太空中的传播速度以及卫星与地球之间的距离。卫星到地球表面的距离大约为 36000km。电磁滋波在太空中的传播速度接近光速,即约每秒 300000 公里。
因此,R1 和 R2 之间的卫星链路的 单向传播时延 可以计算为:时延 = 2×距离/速度 = 2×36000km/(300000km/s) = 0.24 秒。
计算传播时延注意需要 × 2,因为需要通过卫星中转,首先地面 → 卫星,然后卫星 → 地面
计算主机 H 向总部服务器可达到的最大传输量:最大吞叶量与链路带宽和传播时延相关。在忽路一些开销的情况下,可以通过链路带宽和传播时延来计计算。一般公式为:
当数据帧大小足够大时,即发送足够多的数据时。吞吐量最大,近似于链路带宽,为 200kbps。
H → Server 上传一个 4000B 文件至少需要多长时间:这里需要计算传播时延和传输时间,传播时间刚刚计算了等于 0.24s,传输时间 = 文件大小(比特)/ 带宽(bps) = 4000B / 200kbps = 0.16s。
总时间 = 0.24s + 0.16s = 0.4s。
2)本题考察 GBN 的 连续 ARQ 协议 计算:
其中 SLP 数据帧长为 1500B,数据帧传输时间 = 1500B / 200kbps = 0.06s。 = 两倍单向传播时延 = 0.48s。确认帧大小和数据帧一致都为 1500B,所以确认帧传输时间 = = 0.06s。
如果要求 GBN 的信道利用率不低于 80%,就是要满足这个公式:
计算得到 ,这里 就是发送窗口的大小,所以 发送窗口最小为 8。
在 GBN 中,接收窗口大小为 1,根据 窗口大小限制,假设帧序号比特数为 k,需要满足 ,所以 ,即 帧序号至少为 4 位。
3)本题考察 变长子网划分,如果主机位长度为 N,那么子网内可用的 IP 地址数(不包括网络地址和广播地址)的个数就是 。
生活区子网需要不少于 120 个 IP 地址,计算 ,可以得到 ,所以子网掩码为 25 位,子网地址为 10.10.10.128/25,范围是 10.10.10.129 到 10.10.10.254(注意主机地址不能为全 0 或者全 1)。
作业区子网需要不少于 60 个 IP 地址,计算 ,可以得到 ,所以子网掩码为 32 位,子网地址为 10.10.10.64/26,范围是 10.10.10.65 到 10.10.10.126。
关卡模式
每次只看一题,提交后立即显示对错、答案和解析。退出到阅读模式时会自动保留进度。
有 7 题因缺少可判定答案,已自动跳过,不影响当前闯关。
结算结果
本次全对。