进程(四) --- 进程调度算法
进程调度类型
-
抢占调度
执行的进程允许把他的cpu 给剥夺 -
非抢占调度
一旦某个进程得到cpu,就会一直占用到终止或者等待状态
调度算法性能指标
- cpu 利用率: cpu 忙碌的程度,cpu 越繁忙,调度算法越好
- 响应时间:从提交任务到第一次响应的时间(主要是交互式系统,比如终端执行
ls -l
) - 等待时间: 进程累加再就绪队列中等待的时间
- 周转时间:从进程从就绪队列提交到完成的时间
- 吞吐率:每个时钟单位处理的任务数量
- 公平性: 以合理的方式让各个进程共享cpu
调度算法
先来先服务(FCFS)
First-Come,First-Serverd(FCFS),通过一个 FIFO
队列来管理,当一个进程进入就绪队列之后,他的 PCB
控制块会被加到 FIFO
队列的尾部. cpu每次 会从FIFO 队列的头部拿去进程来执行。
缺点:
该算法会导致进程平均等待事件变长。假设有三个进程再队列中的顺序为p1,p2,p3
进程名 | 执行时间 | 等待时间 |
---|---|---|
P1 | 24ms | 0 |
P2 | 3ms | 24 |
P3 | 3ms | 24+3=27 |
三个进程执行完成的平均等待时间为
(0+24+27)/3 = 17
三个进程执行完成的平均周转时间为
(24+27+30)/3 = 27
如果换一下顺序,如下所示,则明显降低平均等待时间
进程名 | 执行时间 | 等待时间 |
---|---|---|
P2 | 3ms | 0 |
P3 | 3ms | 3 |
P1 | 24ms | 3+3=6 |
三个进程执行完成的平均等待时间为
(0+3+6)/3 = 3
三个进程执行完成的平均周转时间为
(3+6+30)/3 = 13
最短作业优先服务(SJF)
Shortest-Job-First (SJF),FCFS的问题在于,执行时间长的进程再队列最前面,只要将队列的顺序按照执行时间从小到大排序,那么进程的平均等待时间就是最小的。但是进程的执行时间是个未知数,我们无法知道一个进程接下来需要占用多久的cpu.
估算
因为我们无法知道未来进程占用多久的cpu,那我们通过这个进程历史上占用cpu的时间来估算下一刻这个进程会要占用多久的cpu ,从而来排序
缺点:
可能造成饥饿现象,长进程可能长时间无法获得cpu.
解决方式:
优先级调度
Priority Scheduling 是一个特殊的SJF 算法。优先级通常为固定区间的数字,比如 [0,10].其中数字的大小与优先级高低的关系再不同系统中实现是不一样的,在linux系统中0是最高优先级.
优先级调度策略就是给每个进程附上优先级(SJF 就是最短执行时间的优先级最高),优先级调度可以是抢占式
和非抢占式
的。
SRTF
Shortest Remaining Time First (SRTF):抢占式算法,SJF 是非抢占式的,当p1(24ms) 优先到来,过了1ms 之后 p2,p3 再过来,虽p2,p3是短作业,但是还是要等待p1 执行完成之后才可以执行p2,p3。SRTF 的作用就是可以抢占,当p1执行1ms 后p2,p3 到来,则优先执行p2,p3,接着再执行p1.
优先级的定义
- 静态优先级
优先级保持不变,可能造成饥饿现象,短进程一直占用着cpu,长进程可能长时间无法获得cpu.
- 动态优先级
通过老化(aging) 的方式:多级反馈队列(Multi-level Feedback QUeue,MLFQ)
根据进程占用的cpu时间,当进程占用cpu的总时间越长,则慢慢降低他的优先级
根据进程再就绪队列等待的时间,当进程再就绪队列等待的事件越长,则慢慢提升他的优先级
时间片轮转(RR)
Round-Robin (RR): 每个进程都可以得到相同的CPU时间(CPU时间片)。当时间便到达晋城,将为剥夺CPU并加入就绪队列的尾部。因此该调度算法是一个抢占式调度算法。
假设时间片的长度为2ms 则,以下执行的顺序是
进程名 | 执行时间 | 等待时间 |
---|---|---|
P1 | 14ms | 0 |
P2 | 3ms | 14 |
P3 | 3ms | 14+3=17 |
三个进程执行完成的平均等待时间为
p1 = (6-2)+(10-8) =6
p2 = 2+(8-4)=6
p3= 4+(9-6)=7
(6+6+7)/3=6.33
三个进程执行完成的平均周转时间为
(20+10+9)/3=13
该算法的实现难处在于时间片的选取,
- 取值太小:进程切换开销显著增大
- 取值太大: 响应速度下降,会让后面的进程等待事件变成(取值无穷大就退化成FCFS)
- 对长作业带来额外的切换开销
一般时间片的选取范围为 10ms-100ms ,上下文切换的事件大概为0.1ms-1ms(1%的CPU时间片开销)