一、调度介绍
当两个以上进程处于就绪状态,就会发生多个进程竞争CPU的问题。在操作系统中完成选择工作的程序叫做调度程序。
内核管理线程的时候,调度经常是按线程来调度的,基本与进程没有关联。
调度要解决的三个问题:
1、按什么选择下一个要调度的程序(即调度算法的选择)
不同的环境需要不同的调度算法。调度环境可分为三种:批处理、交互式、实时性。
批处理:在批处理系统中,不会有用户在终端等待一个短请求。因此非抢占算法或者每个进程都有长时间周期的抢占式算法。这种方式减少了进程的切换而改善了性能。
交互式:为了避免一个进程霸占CPU而拒绝其他进程服务,抢占式必须的。
2、何时进行进程选择(即调度时机)
事件发生-->CPU暂停当前运行的进程-->硬件机制响应后-->进入操作系统处理相应事件-->结果处理后:
就绪队列有调整-->利用调度算法从就绪队列选中一个进程
3、如何让被选中的进程运行在CPU上(即调度过程,进程的上下文切换)
例如:进程A下CPU,进程B上CPU
1、进程A保存上下文环境
2、更新进程A的PCB
3、把进程A移至合适的队列
4、将进程B设置为运行态
5、从进程B中恢复上下文
上下文切换的开销:
1、直接开销
内核完成切换所用的CPU时间
2、间接开销
高速缓存、缓冲区缓存
二、调度算法
算法好坏的衡量标准:
1、批处理系统:
a、吞吐量:每单位时间完成的进程数目。
b、周转时间:从提交到终止间的最小时间。
c、CPU利用率:保持CPU始终忙碌。
2、交互式系统
a、响应时间:快速响应请求。
b、均衡性:满足用户的期望。
2.1、批处理系统中的调度
1、先来先服务算法(按进程就绪的先后顺序使用CPU、非抢占式)
有一个就绪进程的单一队列。当正在运行的进程阻塞时,队列中的第一个进程就接着运行,在被阻塞的进程变为就绪时,就像一个新来到的进程一样,排在队列的末尾。
2、最短作业优先(具有最短完成时间的进程优先执行,非抢占)
只有在所有的作业都同时运行的情形下,最短作业优先算法才是最优化的。
3、最短剩余时间优先(抢占式)
当一个新就绪的进程比当前进程具有更短的完成时间,系统抢占当前进程,选择新就绪的进程之星。
短作业优先的缺点:当源源不断的短任务来,长任务得不到执行,则会发生饥饿现象。
2.2、交互式系统中的调度
1、轮转调度(每个进程分配一个时间段,允许该进程在该时间段中运行)
如果时间片结束时,进程还在运行,则将剥夺CPU并分配给下一个进程。如果该进程在时间片结束前阻塞或结束,则CPU立即进行过切换。
时间片设置的太短,会导致过多的进程切换,降低了CPU效率。设置的太长又可能对短的交互请求响应时间变长。
2、优先级调度(选择优先级最高的进程投入运行)
优先级反转问题:
一个低优先级进程持有一个高优先级进程所需要的资源,使得高优先级进程等待低优先级进程运行。而中优先级一直运行导致低优先级无法运行。
3、多级队列
a、设置多个就绪队列,第一个优先级最高
b、给不同就绪队列分配不同的长度的时间片,第一级时间片最短
c、当第一级队列为空的时候,第二级队列得到调度
d、各级队列按时间片轮转方式进行调度
e、当创建一个新的进程就绪后,进入第一级队列
f、进程用完时间片而放弃CPU,进入下一级就绪队列
g、由于阻塞而放弃CPU进程进入相应的等待队列,一旦等待事件发生,该进程回到原来一级的就绪队列。
三、线程调度
线程分为用户级线程与内核级线程。
3.1用户级线程
内核内部不知道有线程一说,和往常一样选择一个进程A执行。A中的线程调度程序选择一个进程A1来进行执行。线程没有时钟中断,所以会任意执行多长时间。如果该线程用完了进程的时间片,内核会选择另一个进程执行。
在进程A又一次执行的时候,线程A1继续执行。
3.2内核级线程
内核级线程在线程切换的时候需要完整的上下文切换,修改内存映像,使高速缓存失效等,这些会产生延迟,影响性能。另一方面,在内核级线程一旦阻塞在I/O上就不需要像用户级线程中那样讲整个进程挂起。