面试题答案
一键面试进程调度方案设计
- 基于优先级的调度算法:
- 为不同类型进程分配不同优先级。I/O 密集型进程优先级相对较高,因为它们大部分时间在等待 I/O 完成,让出 CPU 时间给其他进程能提高整体资源利用率。CPU 密集型进程优先级稍低,但并非最低,以确保有机会执行。
- 优先级可根据进程的资源需求历史动态调整。例如,如果一个 I/O 密集型进程近期 I/O 操作很少,可适当降低优先级;而 CPU 密集型进程如果长时间未得到执行,可提高其优先级。
- 时间片轮转结合优先级:
- 为每个进程分配一个时间片。优先级高的进程时间片可稍短,确保它们能频繁获取 CPU 执行 I/O 请求,但不会长时间占用 CPU。优先级低的 CPU 密集型进程时间片稍长,减少上下文切换开销。
- 当一个进程时间片用完后,如果其优先级未改变且仍在就绪队列中,它将回到就绪队列尾部等待下次调度。
解决资源竞争问题
- 资源分配图算法:
- 构建资源分配图,图中节点表示进程和资源,边表示进程对资源的请求或占有关系。
- 通过算法(如银行家算法的变种)检查资源分配图是否存在死锁环。若存在,则通过剥夺某些进程的资源来打破死锁环。例如,剥夺优先级较低进程的资源给优先级高且等待该资源的进程。
- 资源锁机制:
- 为每个资源设置锁。进程在请求资源时先获取锁,确保同一时间只有一个进程能访问该资源。
- 采用公平锁策略,避免某些进程长时间等待资源。例如,按照请求顺序分配锁,先进先出。
解决进程饥饿问题
- 老化机制:
- 随着进程在就绪队列中等待时间增加,逐渐提高其优先级。例如,每等待一个时间单位,优先级增加一个固定值。
- 设定一个最大等待时间阈值,当进程等待时间超过该阈值时,直接将其优先级提升到最高,确保其能尽快执行。
- 反馈队列:
- 将就绪队列分成多个优先级队列。新进程进入最高优先级队列,每次时间片用完后,若未完成则进入下一级优先级队列。
- 定期将低优先级队列中的进程提升到高优先级队列,确保低优先级进程也有机会执行。
解决多核负载均衡问题
- 任务迁移:
- 监控每个核心的负载情况,可通过统计 CPU 利用率、进程数量等指标。当某个核心负载过高,而其他核心负载较低时,将部分进程从高负载核心迁移到低负载核心。
- 选择合适的迁移时机,如在进程时间片结束或进入 I/O 等待时进行迁移,减少迁移开销。
- 亲和性调度:
- 记录进程上次执行的核心,并尽量将其调度到同一核心上执行。这样可以利用 CPU 缓存,提高执行效率。
- 当负载不均衡时,适当打破亲和性,进行进程迁移以平衡负载。
方案在不同工作负载变化情况下的适应性和鲁棒性
- 适应性:
- 工作负载增加:动态优先级调整和时间片分配机制可适应更多进程竞争资源的情况。高优先级的 I/O 密集型进程仍能优先获取资源,CPU 密集型进程也能通过老化机制获得执行机会。负载均衡机制会更加频繁地进行任务迁移,以平衡多核负载。
- 工作负载减少:各进程能更轻松获取资源,优先级调整和时间片分配相对稳定,系统资源利用率仍能保持较高水平,避免资源浪费。
- 鲁棒性:
- 面对突发 I/O 高峰:由于 I/O 密集型进程优先级较高,它们能及时获取资源执行 I/O 操作。资源分配图算法和锁机制可有效处理因 I/O 资源竞争可能导致的死锁问题。
- 面对突发 CPU 高峰:CPU 密集型进程通过老化机制和反馈队列能逐渐提高优先级,获得更多执行时间。负载均衡机制可将过多的 CPU 密集型进程分散到不同核心,确保系统不会因单个核心负载过高而性能下降。