软考中级习题与解答——第三章_操作系统(2)
例题11
1、知识点总结
调度算法 | 核心思想 | 抢占性 | 对 CPU-bound 作业 | 对 I/O-bound 作业 |
时间片轮转 (RR) | 公平轮流,用完时间片就换人 | 抢占式 | 公平 | 较有利 (能保证响应时间) |
先来先服务 (FCFS) | 按到达顺序排队,不插队 | 非抢占式 | 非常有利 (一旦占用,可长期使用) | 非常不利 (可能长时间等待) |
短作业优先 (SJF) | 谁快谁先上 | 可抢占/可不抢占 | 不利 (长作业可能饥饿) | 非常有利 (CPU区间短,总被选中) |
优先权调度 | 按优先级高低 | 可抢占/可不抢占 | 取决于优先级设置 | 通常被赋予较高动态优先级,较有利 |
2、题目解析
这道题考察的是不同的 CPU 调度算法对两类不同作业(进程)的“偏好”程度。
CPU 繁忙型 (CPU-bound): 也叫计算密集型。这类作业的大部分时间都在进行大量的计算,很少请求 I/O 操作。它会倾向于用完整个 CPU 时间片。
I/O 繁忙型 (I/O-bound): 也叫输入/输出密集型。这类作业大部分时间都在等待 I/O 操作(如读写文件、网络请求)完成,每次只需要很短的 CPU 时间来进行处理。
A. 时间片轮转调度算法
工作方式: 将所有就绪进程排成一个队列,按先来后到的顺序,给队首进程分配一个固定的“时间片”。进程用完时间片后,无论是否完成,都会被移到队尾,等待下一轮。
分析: 这种算法对两类作业都比较公平。
CPU 繁忙型作业会用完整个时间片,然后回到队尾。
I/O 繁忙型作业可能只用很短的 CPU 时间就去进行 I/O 操作了,它会提前释放 CPU,然后进入阻塞队列。当 I/O 完成后,它会重新回到就绪队列的末尾。
结论: 时间片轮转的设计初衷就是为了保证交互式进程(通常是I/O繁忙型)的响应时间,防止它们被长计算任务“饿死”。因此,它相对有利于 I/O 繁忙型作业,而不是不利于。
B. 先来先服务调度算法
工作方式: 完全按照进程进入就绪队列的先后顺序进行调度。一旦一个进程获得了 CPU,它会一直运行下去,直到它自愿释放 CPU(因为任务完成或需要进行 I/O)或者被阻塞。这是一种非抢占式的算法。
分析:
对于 CPU 繁忙型作业: 简直是天堂。一旦它拿到 CPU,它可以长时间地、不间断地运行,直到它那漫长的计算任务结束。
对于 I/O 繁忙型作业: 简直是噩梦。如果一个 I/O 繁忙型作业排在一个 CPU 繁忙型作业的后面,它可能需要等待非常长的时间,才能获得那一点点它急需的 CPU 时间。这会导致 I/O 设备长时间空闲,系统整体吞吐量下降。
结论: FCFS 算法非常有利于 CPU 繁忙型作业,而极其不利于 I/O 繁忙型作业。这与题干描述完全吻合。
C. 短作业(进程)优先算法
工作方式: 优先调度估计运行时间最短的进程。可以有抢占式和非抢占式两种。
分析: 这种算法的“偏好”对象是短作业,而不是特定类型(CPU繁忙型或I/O繁忙型)。
一个 I/O 繁忙型作业,其每次的 CPU 执行时间(CPU burst)通常很短,因此SJF 算法会非常偏爱 I/O 繁忙型作业。
一个 CPU 繁忙型作业,其 CPU 执行时间很长,在 SJF 算法下可能会一直得不到调度,产生“饥饿”现象。
结论: SJF 算法有利于 I/O 繁忙型作业,不利于(长)CPU 繁忙型作业。与题干描述相反。
D. 优先权调度算法
工作方式: 为每个进程分配一个优先级,每次总是选择就绪队列中优先级最高的进程来运行。
分析: 这种算法的“偏好”完全取决于优先级的分配策略。
如果系统将高优先级赋予 CPU 繁忙型作业,那么它就对 CPU 繁忙型有利。
在很多现代操作系统中,为了提高交互性和响应速度,通常会给 I/O 繁忙型作业更高的动态优先级(因为它们很快就会释放CPU),这样反而对 I/O 繁忙型作业有利。
结论: 优先权算法本身是中性的,它的效果依赖于具体的优先级设置。它并不天生就有利于 CPU 繁忙型作业。
3、最终答案:B
例题12
1、知识点总结
什么是信号量?
信号量是由计算机科学家 Dijkstra 提出的一种经典的、用于管理并发进程对临界资源访问的同步机制。它本质上是一个受保护的整数变量,只能通过两种特殊的原子操作来访问:
- P 操作 (wait, down, acquire): 申请资源。
- V 操作 (signal, up, release): 释放资源。
记录型信号量
为了解决原始信号量可能导致的“忙等”问题,引入了记录型信号量。它除了一个整数值(value)之外,通常还包含一个等待队列(list),用于存放被阻塞的进程。
其 value 值的物理意义非常关键:
value > 0:
value 的值表示当前可用的资源数量。
例如,如果 value = 2,表示有 2 个资源实例可供进程申请。
此时,等待队列为空。
value = 0:
表示所有资源都已被占用,没有可用的资源。
此时,等待队列也为空。
value < 0:
表示不仅所有资源都已被占用,而且还有进程在排队等待。
value 的绝对值(|value|)就表示正在等待队列中被阻塞的进程的数量。
例如,如果 value = -3,表示有 3 个进程正在排队等待该资源。
2、题目解析
题目给出: 信号量的当前值为 -3。
根据定义: 当信号量的值为负数时,其绝对值代表了正在等待该资源的进程数量。
计算: |-3| = 3。
因此,当前有 3 个进程正在等待。
3、最终答案:C
例题13
1、知识点总结
什么是死锁?
死锁是指两个或多个进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
产生死锁的四个必要条件 (必须同时满足):
互斥条件: 资源在同一时间只能被一个进程使用。
请求与保持条件: 进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占用,此时请求进程被阻塞,但对自己已获得的资源保持不放。
不可剥夺条件:进程已获得的资源,在未使用完之前,不能被强行剥夺,只能在使用完后由自己释放。
循环等待条件:存在一种进程资源的循环等待链,链中每个进程已获得的资源同时被链中下一个进程所请求。
2、题目解析
3、最终答案:C
例题14
1、知识点总结
在并发系统中,进程之间的关系主要有两种:
进程互斥
- 源于: 多个进程竞争同一个临界资源(一次只能被一个进程使用的资源,如打印机、共享变量)。
- 关系: 竞争关系。进程之间互相“抢夺”资源的使用权。
- 目标: 确保在任何时刻,最多只有一个进程能访问临界资源,以保证数据的一致性和正确性。
- 关键词: 竞争、临界资源、互斥。
进程同步
- 源于: 多个进程为了完成一个共同任务而协同工作。
- 关系: 协作关系。进程之间在执行的逻辑顺序上存在依赖。
- 目标: 确保这些相互协作的进程,能够按照预定的、正确的顺序来执行。一个进程的执行可能需要等待另一个进程提供“信号”或数据。
- 关键词: 协作、顺序、等待-通知、制约。
2、题目分析
制约: 非常精确地描述了进程同步的本质。
同步的产生,是因为并发执行的多个进程为了协同完成一个共同的任务,它们之间存在执行顺序上的依赖。
一个进程的执行,需要等待另一个进程提供消息或完成某个操作。
这种“等待-通知”的关系,就是一种相互制约:进程A必须等待进程B,进程A的执行受到了进程B的制约;反过来,进程B完成操作后需要通知进程A,它的行为也与进程A有关。
例如,“生产者-消费者”问题中,消费者必须等待生产者生产了产品才能消费(消费者受生产者制约),生产者必须等待缓冲区有空位才能生产(生产者受消费者制约)。
3、最终答案:B
例题15
1、知识点总结
信号量: 用于管理对临界资源的访问,是解决进程同步与互斥问题的经典机制。
P/V 操作:
P(S): 申请一个由信号量 S 管理的资源。
V(S): 释放一个由信号量 S 管理的资源。
用 PV 操作解决同步互斥问题的一般原则:
互斥: 对于一个临界资源,设置一个初值为1的互斥信号量 mutex。在进入临界区前执行 P(mutex),退出临界区后执行 V(mutex)。
资源计数: 对于有 N 个实例的同类临界资源(如此题的发货员),设置一个初值为 N 的资源信号量 S。申请资源时执行 P(S),释放时执行 V(S)。
同步 (顺序): 为协调两个进程(或一个进程的两个步骤)的先后顺序,设置一个初值为 0 的同步信号量 sync。前一个操作完成后执行 V(sync),后一个操作开始前执行 P(sync)。
PV 操作的正确配对和位置:
P 操作和 V 操作必须成对出现。
P 操作应放在访问临界资源之前。
V 操作应放在访问临界资源之后。
为了提高并发度和资源利用率,申请和释放操作应尽可能地靠近实际使用资源的代码段,即“临界区应该尽可能小”。本题的正确答案 C 正是遵循了这一原则。
2、题目分析
资源与约束分析:
发货员: 共有 2 名。顾客提货需要占用一名发货员。这是一个临界资源,最多只能被 2 个顾客进程同时使用。
审核员: 共有 1 名。顾客检验需要占用审核员。这也是一个临界资源,一次只能被 1 个顾客进程使用。
流程顺序: 顾客必须先完成提货,然后才能进行检验。这是一个同步关系。
信号量定义:
S1: 用于管理发货员资源。
共有 2 名发货员,所以 S1 的初值为 2。
S2: 用于管理审核员资源。
共有 1 名审核员,所以 S2 的初值为 1。
PV 操作含义:
P 操作 (wait): 申请资源。执行 P(S) 会使信号量 S 的值减 1。如果结果小于 0,则进程阻塞;否则继续执行。
V 操作 (signal): 释放资源。执行 V(S) 会使信号量 S 的值加 1。如果有进程在等待该信号量,则唤醒一个。
现在,我们将顾客的流程与 PV 操作一一对应:
a: 顾客进入仓库,准备提货
动作: 顾客需要申请一名发货员。
对应操作: 对管理发货员的信号量 S1 执行 P 操作。
所以 a 应该是 P(S1)。
在仓库提货
这是顾客正在占用一名发货员资源的过程
b: 顾客提货完成
动作: 顾客不再需要发货员了,应该释放占用的发货员资源,以便其他等待的顾客可以使用。
对应操作: 对管理发货员的信号量 S1 执行 V 操作。
所以 b 应该是 V(S1)。
c: 提货完成后,准备检验
动作: 顾客需要申请审核员。
对应操作: 对管理审核员的信号量 S2 执行 P 操作。
所以 c 应该是 P(S2)。
检验
这是顾客正在占用审核员资源的过程。
d: 检验完成,准备离开
动作: 顾客不再需要审核员,应该释放审核员资源。
对应操作: 对管理审核员的信号量 S2 执行 V 操作。
所以 d 应该是 V(S2)。
这个组合 P(S1)、V(S1)、P(S2) 和 V(S2) 与选项 C 完全匹配。
3、最终答案:C
例题16
1、知识点总结
同上
2、题目解析
前趋图中的箭头表示了进程之间的执行依赖关系。一个箭头 A -> B 意味着进程 A 必须在进程 B 开始之前执行完毕。
综合 P1 和 P3 对 P4 的依赖:P4 的执行必须同时等待 P1 和 P3 都结束。
信号量设置: 题目已经为我们设置了 S1, S2, S3, S4 四个信号量,初值都为 0,专门用于同步。我们需要为每一个依赖关系分配一个信号量。
P1 -> P2 同步: 使用信号量 S1。
P2 -> P3 同步: 使用信号量 S2。
P3 -> P4 同步: 使用信号量 S3。
P1 -> P4 同步: 使用信号量 S4。
进程 P1:
P1 是起始进程,它不依赖于任何其他进程,所以它在开始前不需要 P 操作。
P1 执行完毕后,需要“通知”等待它的 P2 和 P4。
通知 P2: 执行 V(S1)。
通知 P4: 执行 V(S4)。
所以,a 处应该是 V(S1) 和 V(S4)
进程 P2:
P2 的执行依赖于 P1。所以在开始前,它需要等待 P1 的信号。
等待 P1: 执行 P(S1) (这已经在图 3-3 中给出)。
P2 执行完毕后,需要“通知”等待它的 P3。
通知 P3: 执行 V(S2)。
所以,b 处应该是 V(S2)。
进程 P3:
P3 的执行依赖于 P2。所以在开始前,它需要等待 P2 的信号。
等待 P2: 执行 P(S2)。
P3 执行完毕后,需要“通知”等待它的 P4。
通知 P4: 执行 V(S3) 。
所以,c 处应该是 P(S2)。
进程 P4:
P4 的执行同时依赖于 P1 和 P3。这意味着,在它开始之前,必须收到来自 P1 和 P3 的两个信号。
等待 P1: 执行 P(S4)。
等待 P3: 执行 P(S3)。
P4 执行完毕后,没有其他进程依赖它,所以它不需要 V 操作。
所以,d 处应该是 P(S4) 和 P(S3) (顺序无所谓)。
3、最终答案:C
例题17
1、知识点总结
Spooling(Simultaneous Peripheral Operations On-Line,假脱机)技术是操作系统中用于提高I/O 设备使用效率的一种技术。它通过在磁盘上开辟输入井和输出井,将低速 I/O 设备的输入数据预先存入输入井,或把要输出到低速 I/O 设备的数据预先存入输出井,使得 CPU 和 I/O 设备可以并行工作,减少了 CPU 因等待 I/O 操作而浪费的时间,进而提升了 I/O 设备的利用率。
2、题目分析
- 选项 A:Spooling 系统主要作用并非提高操作系统自身的使用效率,操作系统是管理计算机硬件与软件资源的程序,Spooling 是其管理 I/O 设备的一种技术手段,所以 A 错误。
- 选项 B:Spooling 系统与内存使用效率的直接关联不大,内存效率更多与内存分配、回收等内存管理机制相关,所以 B 错误。
- 选项 C:CPU 使用效率的提高通常通过进程调度、多道程序设计等方式,Spooling 主要针对 I/O 设备,并非直接提升 CPU 效率,所以 C 错误。
- 选项 D:Spooling(假脱机)系统的核心思想是利用磁盘等辅助存储设备,将低速 I/O 设备(如打印机、磁带机等)的输入 / 输出操作转化为对磁盘的操作,使得多个进程可以 “同时” 使用低速 I/O 设备,从而提高了 I/O 设备的使用效率,所以 D 正确。
3、最终答案:D
例题18
1、知识点总结
读取一块磁盘数据所需的总时间,由三部分构成:
总时间 = 寻道时间 + 旋转延迟时间 + 传输时间
- 寻道时间: 磁头从当前磁道移动到目标磁道所需的时间。
- 旋转延迟时间: 磁头到达目标磁道后,等待磁盘旋转,直到目标扇区转到磁头下方所需的时间。
- 传输时间: 磁头开始从目标扇区读取数据,直到将整个数据块读完所需的时间。
2、题目分析
3、最终答案:C
例题19
1、知识点总结
本题考查操作系统中银行家算法,用于判断系统是否处于安全状态。安全状态是指系统能按某种进程顺序(安全序列)为每个进程分配所需资源,使每个进程都能顺利完成。
银行家算法的关键步骤:
- 计算剩余可用资源:可用资源数减去已分配资源数的总和。
- 计算每个进程的需求资源:最大需求量减去已分配资源数。
- 尝试寻找一个进程,其需求资源能被剩余可用资源满足。该进程完成后,会释放已分配资源,更新剩余可用资源,重复此过程,直到所有进程都能完成,则找到安全序列
2、题目分析
首先计算初始剩余可用资源和各进程的需求资源:
3、最终答案:C
例题20
1、知识点分析
本题考查操作系统中死锁恢复的方法。死锁恢复是指当系统发生死锁后,采取措施解除死锁,使系统恢复正常运行。常见的死锁恢复方法有撤销进程(终止一个或多个进程以释放资源)和资源剥夺(从一个或多个进程那里剥夺足够的资源,分配给死锁进程,使死锁进程能够继续运行)。
2、题目分析
- 选项 A:阻塞进程会使进程进入等待状态,这是导致死锁的原因之一(进程因等待资源而阻塞,且资源被其他阻塞进程持有,形成循环等待),而不是解除死锁的方法,所以 A 错误。
- 选项 B:资源剥夺是死锁恢复的有效方法,通过从相关进程那里剥夺足够的资源,分配给死锁进程,打破死锁的循环等待条件,从而解除死锁,所以 B 正确。
- 选项 C:提高进程优先级是进程调度的策略,用于决定进程执行的先后顺序,与死锁的解除无关,所以 C 错误。
- 选项 D:降低进程优先级同样是进程调度的策略,和死锁的解除没有直接关系,所以 D 错误。