操作系统之进程篇(5)--常用进程调度算法

1. 调度算法要达到的目标:

  • 公平性考量: 让每个进程尽量平均的占用CPU;
  • 效率考量: 尽量增大CPU的吞吐率,让CPU在所有时间基本上处于忙碌状态;
  • 响应时间考量: 让交互用户之间的响应时间达到最小;
  • 回转(TurnAround): 让批处理用户等待输出的时间尽可能的小;
  • 吞吐率(ThroughPut): 让一段时间内CPU尽可能多的处理任务;

  但在实际情况下基本上无法同时满足上述几个条件,所做的只能在其中寻找平衡; 进程调度中常常遇到的情况是,每个进程都有不同的特点,可以将每个进程看成是这个一个单位里的每个人,每个人都有其特殊的个性: 有的勤奋,有的懒惰; 有的活泼开朗,有的伤感忧郁; 有的乐于助人,有的自私自利。要想调和这些人之间的矛盾纠葛,让单位最终能够和谐共处,并发挥最大的效益,这个就是管理者的任务,而在计算机世界中这个管理者就是操作系统。

   为了不让一个进程过度占有CPU,计算机内部有一个电子时钟,每个一定的时间产生一个时钟中断(一般每秒产生50~60次中断)。在每次时钟中断的时刻,操作系统检查当前运行在CPU上的程序的条件,看其是否仍然满足运行条件,如果满足继续运行; 如果不满足则中断,让其他进程运行。

  这种让进程定期中断的调度方式就是所谓的"优先级调度",与之相对应的就是批处理系统中的"运行直到结束"的调度方式。这两种方法各优缺点: "优先级调度"方式可以让进程在任何时间中断,但这样同时就引入了竞争情形,这样就得引进复杂的诸如信号量,消息传递等等的并发控制机制。"运行知道结束"虽然可以避免并发情形,但却有可能造成一个高CPU运算量的进程长时间占用CPU而大部分其他进程饿死的情形。

 

2. Round Robin Scheduling[循环制调度]:

循环制调度的特点是,每个进程被分配一个执行时间片,CPU在如上图所示的循环链表中执行,但循环调度的特点是: 将每个进程的时间片分配果断将导致进程的切换时间占用大量的CPU使用时间,降低CPU使用效率; 如果进程时间片分配过长,将导致进程等待相应的时间过长。在实际情况中,常常将进程时间片的长度取100毫秒。

 

3. 优先级调度:

  循环调度进行了这样一个假设: 系统中所有进程具有相同的优先级别。带实际上由于外界的因素,每个进程应该拥有不同的优先级别。[比如一个进程必须在一段时间内执行完毕,否者会造成巨大损失; 一个客户服务系统中有的是处理VIP用户请求的进程,其他是处理普通用户的进程,显然前者优先级要高一些!]

  常用的优先级调度方法: 

  • 为了阻止高优先级的进程的无限运行,在每个时钟中断的时刻,降低正在运行的进程的优先级别,当这个进程的优先级降低到次高优先级进程以下时,就会发生进程的切换;
  • 每个进程都有一个时间片,当当前的最高优先级的进程的时间片用完了的时候,将CPU的使用权交给具有次高优先级的进程;
  • 系统动态的为每个进程分配优先级[为了某个系统目标]: 比如有一个I/O敏感的进程,每个进程被分配一个优先级1/f,其中f是该进程已经运行时间和时间片的比例。比如时间片大小是100,该进程处理I/O时间是100,这样f = 1,priority = 1,那么这个进程获得了最高优先级,获得CPU的使用权。这样就避免了这样的I/O敏感进程因为得不到CPU的使用权而大量占用内存。

 

4. 最短工作优先算法:

  最短工作优先算法的核心思想是让最短执行时间的任务尽量早的运行。现在假设我们有4个进程,进程I的执行时间为a,进程II的执行时间是b,进程III的执行时间是c,进程IV的执行时间是d。假设这四个进程依次执行,那么进程I执行结束的时刻是a,进程II执行结束的时刻是a+b,进程III执行结束的时刻是a+b+c,进程IV执行结束的时间是a+b+c+d,最终四个进程的平均执行时间是:(4a+3b+2c+d)/ 4 = (a + 0.75b + 0.5c + 0.25d); 显然a对平均执行时间的贡献最大,b次之,c再次之,e最小。为了使平均执行时间最小,应该将执行时间少的任务放在前面执行。

  但最短工作优先算法有一些缺陷,当各个任务到达系统的时刻是相同的,并且操作系统可以估计到进程的执行时间时,最短工作优先算法才能达到应有的效果。

 

5. 有保证的调度算法: 在一个单用户操作系统中,有n个进程在运行,那么每个进程只能获得CPU处理能力的1/n; 

  为了进行这个保证,系统必须记录每个进程创建开始到现在使用CPU的时间数量Th,每个进程被保证的占用CPU的时间总数T。那么Th/T就是当前进程占用其保证时间的比例,选取当前比例最小的进程执行。

 

6. Lottery Scheduling(乐透调度)

  原理是为系统中的进程发放彩票,中奖后的奖励就是某种系统资源,比如CPU时间,当调度程序运行的时候,某张彩票被随机选择为中奖,持有该彩票的用户占用该种资源。某些更加重要的进程会被给予更多的彩票以增加其获得调度的概率。形式化的说法是: 当一个进程占用彩票总数的f(0<=f<=1)时,那么进程久获得相应比例的CPU执行时间。

  乐透调度的一个有趣的原理是: 协作进程之间可以互相赠与彩票。

 

7. 实时调度:
 在许多场合下,得到一个延迟的答案和得到一个错误的答案的效果是一样的,因为在这些场合中时间处于一个相当重要的位置。

   实时调度系统又分为硬实时和软实时,硬实时系统表示每个进程都必须在截止时间之前执行完毕。软实时指的是超过这个截止时间也是被容许的,这个截止时间只是一个标准,一个进程最好在这个截止时间之前完成,但没有完成也不会出现什么问题。

  周期性实时调度系统:

   假设系统中有m个周期性的时间,那么就有m个周期性的进程来处理这m个事件,假设每个事件i的周期是Pi,CPU的处理时间是Ci,那么只有满足下面的条件时这个事件流才会被处理:

                  Ci / Pi 总和  < 1

 

8. 两层调度:
 主要是为从磁盘上调入进程而设计的。

posted on 2014-06-05 19:35  Dream Catcher(DC)  阅读(1855)  评论(0编辑  收藏  举报

导航