进程的调度及调度算法
参考文档
《现代操作系统》
文章目录
一、调度的概念
1.1 调度的三个层次
- 调度
当有一堆任务要处理,但由于资源有限,没法同时处理。这就需要确定某种规则来决定处理这些任务的顺序,这就是“调度”研究的问题。
- 处理机调度
在多道程序系统中,进程的数量往往是多于处理机的个数的,这样不可能同时并行地处理各个进程。处理机调度就是从就绪队列中按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程的并发执行。
- 调度的三个层次:
要做什么 | 调度发生 | 发生频率 | 对进程状态的影响 | |
---|---|---|---|---|
高级调度(作业调度) | 按照某种规则,从后备队列中选择合适的作业将其调入内存,并为其创建进程 | 外存到内存(面向作业) | 低 | 无 -> 创建态 -> 就绪态 |
中级调度(内存调度) | 按照某种规则,从挂起队列中选择合适的进程将其数据调回内存 | 外存到内存(面向进程) | 中 | 挂起态 -> 就绪态(或阻塞挂起 -> 阻塞态) |
低级调度(进程调度) | 按照某种规则,从就绪队列中选择一个进程为其分配处理机 | 内存到CPU | 高 | 就绪态 -> 运行态 |
- 作业调入是将作业从外存第一次调入内存并创建线程。
- 内存调度将内存中暂时不会使用的内存映像调到外存,之后需要使用了,再次调回。
- 内存调度内存中进程的PCB是不会迁移到外存的,而是会进入内存的挂起队列中。
- 补充:
暂时调到外存等待的进程状态为挂起态,挂起态又可以进一步细分为就绪挂起、阻塞挂起两种状态。
- 衍生的五状态模型 -> 七状态模型:
1.2 进程调度的方式
进程调度(低级调度)就是按照某种算法从就绪队列中选择一个进程为其分配处理机。
- 进程调度的方式
非剥夺调度方式,又称非抢占方式。即只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻塞态。
剥夺调度方式,又称抢占方式。当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程。适合于分时操作系统、实时操作系统。
二、调度算法
2.1 评价指标
- CPU利用率:
- 系统吞吐量:
- 周转时间:
- 响应比:
-
等待时间:进程/作业处于等待处理机状态时间之和。
-
响应时间:从用户提交请求到首次产生响应所用的时间。
2.2 早期的批处理系统调度算法
算法 | 思想 | 是否可抢占 | 优点 | 缺点 | 是否导致饥饿 |
---|---|---|---|---|---|
先来先服务(FCFS) | 在作业/进程调度时,每次调度都是从后备 / 就绪队列中选择最早到达的作业/线程为其服务(作业调度将作业调入内存、分配资源、创建进程;进程调度为之分配处理机) | 非抢占式 | 公平且实现简单 | 对长作业有利,但对短作业不利 | 否 |
最短作业优先(SJF) | 在作业/进程调度时,每次调度都是从后备/就绪队列中选择最短服务时间的作业/线程为其服务(对于进程调度时称为短进程优先SPF) | SJF和SPF是非抢占式的;最短剩余时间优先算法(SRTN)是抢占式的 | 平均周转时间短,进程等待时间短 | 对短作业有利,但不利于长作业,短作业的频繁到来可能导致长作业的饥饿 | 是 |
高响应比优先(HRRN) | 在作业/进程调度时,计算每个作业/进程的响应比,选择响应比最高的作业/进程为其服务 | 非抢占式 | 综合考虑了等待时间和运行时间,既考虑了作业的到达先后顺序,又能避免长作业不被响应的问题 | 每次调度前需要计算响应比增加系统开销 | 否 |
2.3 交互式系统调度算法
算法 | 思想 | 是否可抢占 | 优点 | 缺点 | 是否导致饥饿 | 其它 |
---|---|---|---|---|---|---|
时间片轮转(RR) | 只针对进程,以各进程到达就绪队列的顺序(队首),轮流让各个进程执行一个固定大小的时间片。在时间片结束后,如果未执行完就立即剥夺其处理机,并重新进入就绪队列队尾等待 | 抢占式(时钟中断) | 公平、响应快 | 高频率的进程切换,系统开销较大,且不区分任务紧急程度 | 否 | 时间片大小对算法的效果影响较大,时间片过大算法就向FCFS算法趋近,而时间片过小则进程切换过于频繁,系统开销巨大 |
优先级调度算法 | 调度时选择优先级最高的作业/进程进行调度,甚至还会用于I/O调度 | 均有 | 优先级区分了任务的重要程度;动态优先级调整可以灵活调整各作业/进程的偏好程度 | 高优先级的进程源源不断到来会导致低优先级进程的饥饿 | 是 | 进程的优先级设置中有静态优先级和动态优先级 |
多级反馈队列调度算法 | 1. 设置多级就绪队列,各级队列优先级从高到低,时间片从小到大;2. 新进程首先进入第1级队列,按FCFS等待被分配,若时间片结束进程未结束,进入下一级队列队尾(如果已在最后一级则重新返回这级队列队尾,采用RR方式运行);3. 只有第k级队列为空时,才会为k+1级队列队首进程分配时间片 | 抢占式 | 对各进程较为公平(FCFS);每个新到达的进程可以快速被响应(RR);短进程只需要较少时间就能完成(SPF) ;不必估计进程运行时间;灵活调整对进程的偏好 | 可能会产生饥饿(源源不断的短进程进入) | 是 | 如何理解灵活调整进程偏好:比如I/O密集型进程由于阻塞重新放回就绪队列,此时I/O进程仍然会被放入原队列保持较高优先级 |
优先级设置规则:
- 静态优先级中,系统进程优先级高于用户进程;
- 前台进程优先级高于后台进程;
- 操作系统更偏好于I/O繁忙型进程(I/O设备和CPU可并行,先让I/O密集型进程完成I/O,可以提高系统吞吐量);
- 动态优先级中,提升就绪队列中等待时间长的进程的优先级,降低占用处理机运行时间长的进程的优先级。
三、补充
3.1 CFS——完全公平调度
每个进程都有一个nice值(友好度),表示其静态优先级,nice值越小,进程的权重越大。一个进程在一个调度周期中的运行时间为:
分配给进程的运行时间 = 调度周期 * 进程权重 / 所有进程权重之和
调度周期:固定值,由sysctl_sched_latency变量保存