《Modern Operating System》、《Operating Systems:Three easy pieces》阅读笔记
1 作业周转时间【turnaround time】?
周转时间 = 完成时间 − 到达时间
也就是,每个进程从提出要求到完成的时间
2 先来先服务【FCFS】算法?
按照进程就绪的先后顺序来使用CPU
优点:实现简单,公平
缺点:在长进程后面的短进程需要等待很长的时间,不利于用户体验
三个进程A,B,C同时到达
服务的先后顺序是A->B->C,那么
周转时间的计算为:
A:T = 100 - 0 = 100
B:T = 110 - 0 = 110
C:T = 120 - 0 = 120
则,平均周转时间 = (100 + 110 + 120)/ 3 = 110
3 短作业优先【SJF】算法?
若运行时间可预知,那么运行时间最短的进程优先,非抢占式
优点:最短的平均周转时间
缺点:长进程可能会因为源源不断的短进程而饥饿
但是我们再来看另外一个例子:
A在 t = 0的时候到达,需要100s
而B、C在 t = 10的时候到达,各需要10s的执行时间
SJF的第一个例子的平均周转时间为50,而这里却上升到了103.33
4 抢占式短作业优先【STCF】算法?
【Shortest Time-to-Completion First 】
也就是最短剩余时间优先,当前就绪队列中剩余时间更短的进程优先调度
还是同样的例子,我们看到,跟SJF不同的是
在B、C到达的时候,算法会判断所有进程的剩余时间决定谁优先执行
因此,在A执行了10s后,B、C到达,然后CPU调度进程B、C,等待其完成后再完成A剩余的部分
可以看出,这是一个抢占式的算法
5 响应时间【response time】?
响应时间 = 首次执行时间 − 到达时间
响应时间反映了执行的交互性
显然,上述的三个算法在响应时间【response time】和交互性【interactivity】上的表现并不是很好
6 轮转调度【Round Robin】算法?
周期性切换,为每个进程分配一个时间片【time slice】,利用时钟中断来轮换
优点:公平,响应时间快
缺点:进程切换增加系统开销
我们观察这个例子
在RR算法中,时间片设定为1(每 1s 轮换)
两个算法的响应时间分别为:
RR: 响应时间 = (0 + 1 + 2)/ 3 = 1
SJF:响应时间 = (0 + 5 + 10)/ 3 = 5
关于时间片的大小问题,既不能太小(context switch开销太大),也不能太大(近似于FCFS)
7 最高优先级调度算法?
选择优先级最高的进程运行
通常系统进程优先级高于用户进程
前台进程优先级高于后台进程
操作系统更偏好于IO型进程
优先级可以是静态的,也可以是动态的,比如正在CPU上运行的进程随着运行时间的增加降低优先级,而处于就绪队列的进程随着等待时间的增加而增加优先级
优点:实现简单,灵活度高,各方面表现都不错
缺点:但是不公平,可能优先级低的进程会产生饥饿现象
【注】
对于抢占式的优先级调度,存在优先级反转的问题:即两个进程,优先级高的A,优先级低进程B,共享一段临界资源,B进程先运行,进入前加锁,如果正在临界区时,被A进程挤下去了,然而A进程无法进入临界区无法工作,而B由于无法得到运行时间而释放不了临界区,所以导致两个进程都无法运行
解决方案:设置优先级上限,动态优先级,使用中断禁止
8 多级反馈队列?
结合了优先级和时间片轮转
设置多个就绪队列,第一级优先级最高,依次递减
给不同就绪队列的进程分配长度不同的时间片,第一队列时间片最小,随着优先级降低,时间片增大。(这一策略体现了当进程为CPU密集型,如果轮转过快,反而会增加大量的系统消耗,所以对于优先级较低的CPU密集型进程,时间片设置的更大一些,减少轮转)
第一级队列为空时,在第二级队列轮转,以此类推
各队列之间按优先级排序
各级队列内部按时间片轮转的方式进行调度
新创建的进程,都进入第一级队列
如果进程是用完了CPU时间,被时钟中断,那么进入下一级队列(这体现了操作系统对IO密集型的进程的偏好,IO密集型进程需要更短的时间片以提高响应速度,而对于CPU密集型进程,时间片应该更大一些。所以当进程由于用完了时间片而中断,说明进程是偏向于CPU密集型进程的,应该降级)
如果进程因为阻塞而放弃了CPU,那么它的等待时间发生后,仍然回到这个就绪队列
9 整合IO?
当一个进程在请求IO的时候,该进程会阻塞直到IO完成
这个时候,正在运行的作业在IO期间并不会去使用CPU,导致了使用效率的降低
如果我们使用抢占式方式,在IO使用期间
即CPU空闲的时间去执行另一个作业B,可以大大提升系统的使用率