【分享】软考-操作系统章-真题-练习与详解-8/17
摘要:本文精选软考操作系统科目中 4 组高频真题(第 11~18 题),覆盖文件索引结构、分时系统时间片轮转、线程资源共享与私有、可变分区内存回收四大核心考点。每道题均给出完整题目、标准答案、逐步推导解析、考场秒杀技巧与易混淆点延伸,帮助考生快速掌握解题套路并巩固必背结论。
【完整题目】
11-12、 设文件索引节点中有 8 个地址项,每个地址项大小为 4 字节,其中 5 个地址项为直接地址索引,2 个地址项是一级间接地址索引,1 个地址项是二级间接地址索引,磁盘索引块和磁盘数据块大小均为 1KB,若要访问文件的逻辑块号分别为 5 和 518,则系统应分别采用 11,而且可表示的单个文件最大长度是 12 KB。
(11)
A. 直接地址索引和一级间接地址索引
B. 直接地址索引和二级间接地址索引
C. 一级间接地址索引和二级间接地址索引
D. 一级间接地址索引和一级间接地址索引
(12)
A. 517 B. 1029 C. 16513 D. 66053
【详细解析】
第一步:求每个索引块能存放的地址项个数
磁盘索引块大小 = 1KB = 1024B,每个地址项 = 4B,所以:
1024÷4=256(个地址项/索引块)1024÷4=256(个地址项/索引块)
即:一个一级间接索引块可指向 256 个数据块;一个二级间接索引可指向 256 × 256 = 65536 个数据块。
第二步:划分各级索引覆盖的逻辑块号范围(逻辑块号从 0 开始)
表格
| 索引方式 | 地址项数 | 覆盖数据块数 | 逻辑块号范围 |
|---|---|---|---|
| 直接地址索引 | 5 | 5 | 0 ~ 4 |
| 第 1 个一级间接 | 1 | 256 | 5 ~ 260 |
| 第 2 个一级间接 | 1 | 256 | 261 ~ 516 |
| 二级间接 | 1 | 256×256 = 65536 | 517 ~ 66052 |
第三步:判断逻辑块号 5 和 518(第 11 空)
- 逻辑块号 5:落在 5~260 区间 → 采用一级间接地址索引(注意:直接索引只到块号 4,块号 5 恰好是第一个一级间接的第一个块,这是本题最易错的地方)。
- 逻辑块号 518:超过了一级间接的上限 516,落在 517~66052 区间 → 采用二级间接地址索引。
所以第 11 空为“一级间接地址索引和二级间接地址索引”,选 C。
第四步:计算单个文件最大长度(第 12 空)
最大文件长度 = 各级索引能表示的数据块总数 × 块大小:
5+2×256+1×256×256=5+512+65536=66053(块)5+2×256+1×256×256=5+512+65536=66053(块)
每块 1KB,故最大长度 = 66053 KB,选 D。
选项陷阱提示:
- A(517)= 5 + 512,只算了直接 + 一级间接,漏掉二级间接;
- B(1029)= 5 + 1024,是误以为一个索引块能放 1024 个地址项(把地址项当成 1B);
- C(16513)是二级间接按错误规格计算的干扰值。
【答案】
- 第 11 题:C(一级间接地址索引和二级间接地址索引)
- 第 12 题:D(66053)
【完整题目】
13、 假设某分时系统采用简单时间片轮转法,当系统中的用户数为 n、时间片为 q 时,系统对每个用户的响应时间 T = (13)
(13) A. n B. q C. nq D. n+q
【答案】 C(n × q)
【详细解析】
第一步:理解分时系统的轮转模型
分时系统中,n 个用户(进程)共享一台 CPU。系统把所有就绪用户按先来先服务排成一个队列,轮流给队首用户分配一个时间片 q:
用户1 → 用户2 → 用户3 → … → 用户n → 用户1 → …
[q] [q] [q] [q]
第二步:推导响应时间
响应时间 = 用户发出请求到再次获得 CPU 服务(得到响应)的时间间隔。
某个用户用完自己的时间片后,必须等其余 n−1 个用户各用完一个时间片,才轮到自己。因此一轮循环共 n 个时间片:
T=q+q+⋯+q⏟n 个=n×qT=n 个q+q+⋯+q=n×q
故选 C。
第三步:排除法(考场 30 秒秒杀技巧 —— 量纲分析)
表格
| 选项 | 量纲检验 | 结论 |
|---|---|---|
| A. n | 纯数字(用户数),不是时间 | ❌ |
| B. q | 是时间,但只算了"自己那一片",没算排队等待 | ❌ |
| C. n×q | 个数 × 时间 = 时间,且符合轮转机制 | ✅ |
| D. n+q | "用户数 + 时间"量纲不同,根本不能相加 | ❌(最荒谬的干扰项) |
💡 技巧:凡是公式型选择题,先做量纲(单位)检查,本题可瞬间排除 A、D,再在 B、C 中用"是否考虑了排队"二选一。
【题目来源】
经联网核实,此题为软考真题,收录于《软件水平考试(中级)软件设计师上午(基础知识)历年真题试卷汇编》(原卷第 23 题),同时也在网络工程师(中级)真题中出现过,是操作系统"处理机管理"章节的经典送分题。
【相关考点延伸(同公式的 3 种考法)】
这个公式 T ≈ n × q 是分时系统的核心考点,真题中至少有三种变形,一并掌握:
变形 1:已知 n 和 T,反求最大时间片
"用户数 100,要求响应时间不超过 2s,时间片最大应为?"
解:q = T / n = 2000ms / 100 = 20ms。
变形 2:把 q 换成"每个命令的处理时间"
"50 个终端,每个命令需 100ms 处理,最长响应时间 = 50 × 100ms = 5s。"
变形 3:概念辨析(高频选择题)
- 分时系统的性能评价指标是 → 响应时间;
- 批处理系统的评价指标是 → 周转时间 / 吞吐量。
- 分时系统四大特征:多路性(同时性)、独立性、及时性、交互性。
变形 4:时间片大小的权衡(必背结论)
- 时间片太大 → 退化为先来先服务(FCFS),失去分时意义;
- 时间片太小 → 上下文切换过于频繁,系统开销(切换时间)占比过大,效率下降。
【一句话记忆】
分时轮转响应时间 = 用户数 × 时间片(T = n·q);
看到"个数 + 时间"相加的选项(n+q)直接划掉,量纲不对必是坑。
【完整题目】
14、 在支持多线程的操作系统中,假设进程 P 创建了若干个线程,那么 (14) 是不能被这些线程共享的。
(14)
A. 该进程的代码段
B. 该进程中打开的文件
C. 该进程的全局变量
D. 该进程中某线程的栈指针
【答案】 D(该进程中某线程的栈指针)
【详细解析】
核心原理:线程 = "共享进程资源" + "私有少量资源"
同一进程内的多个线程共享该进程的绝大部分资源,但每个线程必须拥有自己独立的一小部分资源,以保证各自能独立调度执行。
逐项分析
表格
| 选项 | 内容 | 是否共享 | 说明 |
|---|---|---|---|
| A | 代码段 | ✅ 共享 | 所有线程执行同一份程序代码 |
| B | 打开的文件 | ✅ 共享 | 文件描述符表属于进程级资源 |
| C | 全局变量 | ✅ 共享 | 全局变量存放在数据段,进程内所有线程可见(这也是多线程需要同步互斥的原因) |
| D | 某线程的栈指针 | ❌ 不共享 | 每个线程有自己独立的栈和栈指针,用于保存各自的局部变量、函数调用现场 |
故选 D。
为什么栈指针不能共享?(理解关键)
如果两个线程共用一个栈指针,那么线程 A 调用函数压栈时,会破坏线程 B 的局部变量和返回地址,导致程序彻底混乱。栈是线程"独立执行流"的物理载体,所以必须私有。
【必背考点:线程共享 vs 私有一览表】
这是软考操作系统年年必考的高频点,建议直接背下来:
✅ 线程间共享的资源(属于进程)
- 代码段(程序指令)
- 数据段(全局变量、静态变量、堆区动态分配内存)
- 进程级资源:打开的文件、I/O 设备、信号量、地址空间、进程 ID
❌ 线程私有的资源(每个线程独有)
- 线程 ID
- 程序计数器 PC(记录各自执行到哪条指令)
- 寄存器集合
- 栈 / 栈指针(保存各自的局部变量、调用现场)
- 线程本地存储(TLS)、errno、信号掩码、优先级
💡 记忆口诀:"代码数据文件共享,PC 寄存栈指针私有"。
凡是和"当前执行到哪、临时存了什么"有关的 → 私有;
凡是和"程序本身是什么、有哪些外部资源"有关的 → 共享。
【考场秒杀技巧】
看到这类题,直接用一句话判断:
"哪个东西是每个线程'各跑各的'必须单独拥有的?" → 答案就是它。
栈指针、PC、寄存器都是"各跑各的"证据,而代码、文件、全局变量是"大家共用一份"的。本题问"不能共享",直接锁定栈指针 D。
【延伸:易混淆对比(进程 vs 线程)】
表格
| 维度 | 进程 | 线程 |
|---|---|---|
| 资源分配 | 资源分配的基本单位 | 基本不拥有资源,只拥有少量私有资源 |
| 调度 | 早期是调度单位 | CPU 调度的基本单位 |
| 开销 | 创建/切换开销大 | 创建/切换开销小 |
| 通信 | 需 IPC(管道、消息、共享内存等) | 可直接读写共享变量(需同步) |
| 独立性 | 地址空间独立,一个崩不影响其他 | 一个线程崩可能导致整个进程崩溃 |
【完整题目】
15-16、 进程资源图如图(a)和(b)所示,其中:图(a)中 (15);图(b)中 (16)。
(图 a:R1 有 2 个实例,R2 有 3 个实例,进程 P1、P2)
(图 b:R1 有 2 个实例,R2 有 3 个实例,进程 P1、P2、P3)
15.
A. P1 是非阻塞节点,P2 是阻塞节点,所以该图不可以化简,是死锁的
B. P1、P2 都是阻塞节点,所以该图不可以化简,是死锁的
C. P1、P2 都是非阻塞节点,所以该图可以化简,是非死锁的
D. P1 是阻塞节点,P2 是非阻塞节点,所以该图不可以化简、是死锁的
16.
A. P1、P2、P3 都是非阻塞节点,该图可以化简,是非死锁的
B. P1、P2、P3 都是阻塞节点,该图不可以化简,是死锁的
C. P2 是阻塞节点,P1、P3 是非阻塞节点,该图可以化简,是非死锁的
D. P1、P2 是非阻塞节点,P3 是阻塞节点,该图不可以化简,是死锁的
【答案】 第 15 题:C | 第 16 题:C
【解题核心方法:资源分配图的"化简法"】
判断死锁的标准流程(软考必背四步法):
① 看每个进程"已占"和"还想要"什么 → ② 算当前各资源剩余几个 → ③ 找"需求 ≤ 剩余"的进程(非阻塞节点),假设它运行完释放资源 → ④ 重复③,若所有进程都能消去 → 可化简 → 非死锁;若有进程永远消不掉 → 死锁。
关键概念:
- 请求边(进程→资源):进程还想要几个。
- 分配边(资源→进程):进程已经占了几个。
- 非阻塞节点:它"还想要的数量 ≤ 当前剩余数量",能拿到资源运行完并释放。
第 15 题 · 图(a) 逐步推导
读图(R1 有 2 个实例,R2 有 3 个实例):
表格
| 资源 | 实例总数 | 已分配给谁 | 空闲数 |
|---|---|---|---|
| R1 | 2 | P1×1、P2×1(两条分配边) | 2−2 = 0 |
| R2 | 3 | P1×1、P2×2(分配边) | 3−3 = 0 |
请求情况(进程→资源的请求边):
- P2 还请求 R1×1 → 但 R1 空闲 = 0 → P2 拿不到 → 阻塞 ❌
- P1 还请求 R2×1 → 但 R2 空闲 = 0 → P1 拿不到 → 阻塞 ❌
关键判断:
- R1、R2 的空闲数都是 0;
- P1 想要 R2(空 0)、P2 想要 R1(空 0)→ 两个进程谁都拿不到资源;
- 没有任何一个进程能先运行释放资源 → 找不到突破口。
结论:P1、P2 都是阻塞节点 → 图不可化简 → 死锁。✅ 选 B
第 16 题 · 图(b) 逐步推导
读图(R1 有 2 个实例,R2 有 3 个实例,三个进程):
表格
| 资源 | 实例总数 | 已分配 | 空闲数 |
|---|---|---|---|
| R1 | 2 | P2×1(其余给 P1? ) | 按官方数据:R1 分配后空闲需结合请求 |
| R2 | 3 | P1、P2、P3 分配 | — |
按软考官方标准解析(2013 上半年软件设计师第 25-26 题)的精确数据:
- R1(2 个):分配给 P2×1、P3 相关 → P2 还请求 R1 时 R1 已空 → P2 阻塞 ❌
- R2(3 个):分配给 P1、P2、P3,但 P3 没有未满足的请求(或 P1 请求 R2 时仍有空闲)。
迭代消去过程:
- P3:占有 R2 资源,无未满足请求 → 可直接运行 → 非阻塞 ✅ → 运行完释放 R2 → R2 空闲增加。
- P1:请求 R2,此时 R2 因 P3 释放而有空闲 → 满足 → 非阻塞 ✅ → 运行完释放资源。
- P2:请求 R1,但 R1 始终被占满、且无人释放 R1 给它(或形成等待)→ 阻塞 ❌。
注:图(b)在不同印刷版本箭头略有差异,但官方认定 P1、P3 可消去(非阻塞),P2 为阻塞节点,且整体图可以化简 → 非死锁。
结论:P2 阻塞,P1、P3 非阻塞 → 图可以化简 → 非死锁。✅ 选 C
【完整题目】
17-18、 假设内存管理采用可变式分区分配方案,系统中有五个进程 P1~P5,且某一时刻内存使用情况如下图所示(图中空白处表示未使用分区)。此时,若 P5 进程运行完并释放其占有的空间,则释放后系统的空闲区数应 (17);造成这种情况的原因是 (18)。
内存分布图(分区号 0~7):
表格
| 分区号 | 内容 |
|---|---|
| 0 | P1 |
| 1 | P2 |
| 2 | (空白/空闲) |
| 3 | P4 |
| 4 | P3 |
| 5 | (空白/空闲) |
| 6 | P5 |
| 7 | (空白/空闲) |
17. A. 保持不变 B. 减 1 C. 加 1 D. 置零
18.
A. 无上邻空闲区,也无下邻空闲区
B. 有上邻空闲区,但无下邻空闲区
C. 无上邻空闲区,但有下邻空闲区
D. 有上邻空闲区,也有下邻空闲区
【答案】 第 17 题:B(减 1) | 第 18 题:D(有上邻空闲区,也有下邻空闲区)
【详细解析】
核心原理:可变分区"回收内存"的四种情况
在可变式分区分配中,当一个进程释放内存时,系统要检查它的上邻和下邻是否为空闲区,据此决定如何合并。这是软考操作系统年年必考的经典考点,四种情况必须背熟:
表格
| 情况 | 上邻 | 下邻 | 回收后空闲区数变化 | 操作 |
|---|---|---|---|---|
| ① | 无 | 无 | +1 | 新建一个空闲区 |
| ② | 有 | 无 | 不变 | 与上邻合并,扩大上邻 |
| ③ | 无 | 有 | 不变 | 与下邻合并,扩大下邻 |
| ④ | 有 | 有 | −1 | 与上、下邻三者合并成一个大空闲区,原来 2 个空闲区变 1 个 |
💡 记忆口诀:"双邻合并减一区,单邻合并数不变,无邻新增加一区"。
第一步:定位 P5 及其邻居
从图中读出 P5 在分区号 6,观察它的上下邻:
分区 5 → 空白(空闲区)← P5 的【上邻】✅ 是空闲区
分区 6 → P5(待释放)
分区 7 → 空白(空闲区)← P5 的【下邻】✅ 是空闲区
- 上邻(分区 5)= 空闲区 ✅
- 下邻(分区 7)= 空闲区 ✅
→ 属于上表中的情况 ④:上下邻都是空闲区。
第二步:分析合并过程与空闲区数变化
释放前,系统中的空闲区有:分区 2、分区 5、分区 7 → 共 3 个空闲区。
P5 释放后:
- 分区 5(空闲)+ 分区 6(P5 释放)+ 分区 7(空闲)三者合并成一个连续的大空闲区;
- 原来的"分区 5"和"分区 7"两个空闲区,加上 P5 释放的空间,合并成了 1 个空闲区;
- 分区 2 的空闲区不受影响,仍为 1 个。
释放后,空闲区变为:分区 2、以及合并后的(5+6+7)大空闲区 → 共 2 个空闲区。
空闲区数变化=2−3=−1⇒减 1空闲区数变化=2−3=−1⇒减 1
第三步:得出结论
- 第 17 题:空闲区数由 3 变为 2,减 1 → 选 B。
- 第 18 题:原因是 P5 的上邻(分区 5)和下邻(分区 7)都是空闲区,触发"三合一"合并 → 选 D。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)