[操作系统概念]第三部分——CPU调度

来源:互联网 发布:淘宝如何搜索优选好店 编辑:程序博客网 时间:2024/05/17 07:00

CPU调度

  • CPU调度的方案可以分为“非抢占式”调度(又称“协作式”调度),以及“抢占式”调度。

所谓抢占,是指在稍后的时间启动的一个进程,因为优先级或者所需资源少等原因,可以打断当前CPU执行的进程,抢占当前进程的CPU资源(以及其他资源)归自己所用。现代操作系统基本都是抢占式的调度,非抢占式的调度主要用于嵌入式的系统,因为非抢占式不需要特别的硬件。

CPU调度可能出现在4种情况下:

  1. 一个进程从运行切换到等待
  2. 一个进程从运行切换到就绪
  3. 一个进程从等待切换到就绪
  4. 一个进程从运行完毕,终结

如果一个调度方案只处理进程终止、进程切换到等待两种情况的话,则这个调度方案是“非抢占”的,否则是“抢占式”的。

CPU调度方案的评判条件

  1. CPU使用率:调度方案应当是CPU尽可能不空闲
  2. 吞吐量:单位时间内完成的进程数量
  3. 周转时间:指进程从提交到执行完毕的所有之间之和,包括阻塞调用的等待时间,也包括在就绪队列中的等待时间
  4. 等待时间:特指在就绪队列中等待的时间
  5. 响应时间:指从进程提交到进程产生第一响应的时间,因为有些对于有些进程,人们关心它产生响应的快慢胜过对整个进程执行耗时的多少。

CPU调度算法

  1. 先到先服务调度(FCFS):非抢占式的调度方案。按时间排序,先提交的进程先执行,一直等到进程执行结束或者因为I/O操作等阻塞操作而等待再执行下一个进程的方案。

    • 优缺点:最简单,但是无脑,进程的平均等待时间不是最短的,而且因为是非抢占式的,对于分时系统(多用户系统)来说很不好。
  2. 最短作业优先调度(SJF):也称“最短下一个CPU区间”算法。可以是抢占式也可以是非抢占式,衍生的抢占SJF也被成为“最短剩余时间优先”算法。在当前时刻,对所有已经提交的进程用时排序,按最短耗时到最长好使排序,优先执行最短耗时的进程(任务),相同耗时的按FCFS调度。
    优缺点:可以证明SJF是最好的,平均时间是最短的。但是SJF算法难在知道下一个CPU区间的长度(也就是进程的耗时)。对于批处理系统,可以将用户指定的进程时间极限作为耗时。进而,SJF通常用于批处理系统。

  3. 优先级调度算法:将进程按贴上优先级的标签,按优先级的高低来判断是否优先执行,相同优先级按FCFS调度。上面提到的SJF,就是一种优先级调度算法,这里的优先级是按进程耗时的倒数计算。
    优缺点:优先级调度最大的问题是可能一个优先级第的进程长时间不能执行,导致进程饿死,解决的办法是“进程老化”——每经过一个时间段,将进程的优先级提高一定级别,进而避免饿死。

  4. 轮转法(RR):相当于抢占式的FCFS算法。通过将进程放入一个循环队列当中,划分时间片,每过一个时间片,如果进程执行完,则执行下一个(队列首)进程,如果没执行完,则放入循环队列的队尾再次等待执行,有新进程来临也放入队列的队尾。

    • 如果轮转法的时间片设置的过长,以至于所有进程在一个时间片中都能执行完毕,那么这就成了FCFS算法,但是如果时间片设置的过于短,每次进程切换导致的上下文切换(堆栈数据保存恢复,寄存器数据保存恢复等)开销太大,也不好。推荐是时间片最好大于80%的进程耗时。
  5. 多级队列调度:因为不同类型的进程(CPU密集型和I/O密集型,长期任务和短期任务)的特征是不同的,用户对不同类型进程的调度要求也不同,所以干脆,将不同类型的进程分配在优先级不同的队列当中,队列间按优先级调度,队列内部选用合适的调度算法。

  6. 多级反馈队列调度:类似与上述第5中“多级队列调度”,但是增加了队列之间,进程可以提升优先级或者将低优先级切换所在队列,优化计算机的效率。

多CPU调度的问题

单核调度比较方便,多核因为涉及到协调通信问题,更加复杂。
一般将多核的调度方法分成两大类:非对称多处理方法和对称多处理方法。
* 非对称多处理方法:多个CPU的地位不对等,一般是有一个主CPU处理所有调度决定和系统进程,访问系统的数据结构,其他CPU服从主CPU的指挥和执行用户代码
* 对称多处理方法:多个CPU地位对等,各自执行自己的调度方法,多个CPU之间协同通信处理。

对称多处理方法的问题

  • 处理器亲和性:一个处理器对一个进程的临时数据,缓存可能已经保存了一遍了,如果进程下次被调度到另一个处理器上执行,这些数据需要再生成一遍,浪费资源,所以一般都要尽量保持一个进程在一个处理器上执行完。
  • 负载均衡:多处理器中,可能出现几个处理器无所事事,另几个处理器却忙的要死的情况。
0 0
原创粉丝点击