CPU调度

CPU调度

一般来说,CPU调度==处理机调度==进程调度

发生时刻

  • running to waiting
  • running to ready
  • waiting to ready
  • terminates

调度方式

  • 抢占式:一旦给某个进程分配完cpu就让该进程进行下去;
  • 非抢占式:当一个进程在运行中,系统基于某种原则,剥夺分配给该进程的CPU;

调度策略

先来看几个指标,这几个指标可以用来判断调度策略优劣的:

Throughput(吞吐量):单位时间内进程完成的数量;

Turnaround time(周转时间):执行一个进程花费的时间(从进入就绪队列到完成 Termination time - Arrival time);

Waiting time:一个进程在ready队列中等待的时间;

Response time:从进程提出请求道首次被响应的时间(不包括执行完成);

First come, First served

非抢占式的,根据它们的到达时间,系统维一个FIFO的进程列表;

Shortest-Job-First

系统在ready queue中,优先选择那些CPU burst time最少的进程。

这种调度策略分为抢占式和非抢占式两种,抢占式的没什么好说,非抢占式的:当一个新的需要更少CPU burst time的进程到达时,CPU便会重新分配。

SJF还有一种变形,即highest response ration next(等待时间+要求执行时间/要求执行时间)

Priority

同样,优先级策略也分为抢占式和非抢占式两种。

这种调度策略会导致一个非常严重的问题——starvation,优先级低的进程可能一直无法被执行。为了解决这个问题,我们可以采取动态优先级的策略,随着时间推移,我们提升某些进程的优先级。

优先级范围

  • windows的线程
    • windows的每一个线程都有优先级,范围是0-31,0最低,31最高;
  • linux的进程
    • linux的进程范围是-20-19,值越小,优先级越高。通常情况下,linux的进程优先级是由父进程继承而来,通常是0;
    • nice值反映了进程优先级;
    • 我们可以通过nice命令来对一个将要执行的命令进程nice值;通过renice重新设置nice值;

Round Robin

这是一种抢占式的策略,给队列里的每个进程分配相同的时间片,无论进程是否执行完,当时间懂啊了都切换到下一个进程。

当时间片Q太大时,就变成了FIFO;

当Q太小,但不能小到切换上下文的花费比Q还小时;

这种策略的turnaround time会比SJF更高,因为SJF选择的是更低burst time,避免等待时间增多;但response time会更少,因为它的切换频率更快,使得响应更快;

Multilevel Queue

分配进程到多个队列中,每个队列使用不同的调度算法:

前台交互式(foreground)——RR

后台批处理(background)——FCFS

Multilevel Feedback

这是一种动态的调度策略,该策略需要定义以下这些部分:

队列个数;

每个队列的调度算法;

更新队列所属队列的方法;

提升或降低进程优先级的方法;