2020-04-08

操作系统的任务调度

操作系统进行 进程/线程 调度可以是抢占的也可以是非抢占的(preemptive/nonpreemptive)

几种调度的算法:

  • 先到先服务(First-Come First-Served, FCFS)
    通过FIFO队列实现,是非抢占的。优点是实现简单,缺点是平均等待时间往往较长。

  • 最短作业优先(Shortest Job First, SJF)
    平均等待时间最短。可以是抢占的也可以是非抢占的。难点在于没有办法准确测量下次CPU执行时间。

  • 优先级调度(Priority-Scheduling)
    给每个 进程/线程 赋予一个优先级,按照优先级的高低顺序分配CPU资源。可以是抢占的也可以是非抢占的。使用优先队列实现。容易出现的问题是低优先级任务的“无穷阻塞”,可以通过增加系统中等待时间长的任务的优先级来解决。

  • 轮转调度(Round-Robin)
    设置一个(远大于上下文切换时间)的时间片,类似FCFS,但是一旦某个任务的执行时间超过这个时间片,就强制中断这个任务并放在就绪队列的末尾。很明显是抢占式调度。

  • 多级队列调度(multilevel queue)
    给任务分类,将就绪队列分成多个队列,对每一个队列执行不同的(上述的)调度算法。

  • 多级反馈队列调度(multilevel feedback queue)
    在多级队列调度算法的基础上,允许任务根据实际执行的情况在各个队列间迁移。能够适应所设计的特定系统,是最复杂的算法,也是最通用的CPU调度算法。

上面介绍的都是单处理器的CPU调度问题。对于多处理器系统,还需要考虑负载分配(load sharing)等问题。

一种方式是让一个处理器处理所有调度,其他的处理器负责执行用户命令。这叫做非对称多处理。另一种方式是对称多处理(SMP),每个处理器自我调度。所有的进程,可能处于同一个就绪队列中,或每个处理器都有自己的私有就绪队列。几乎所有现代的操作系统,都支持SMP。

SMP系统支持负载平衡有两种方式:推迁移拉迁移。对于推迁移,一个特定的任务周期性地检查每个处理器的负载,如果发现不均衡,那么通过将进程从“超载”的处理器 到相对空闲的处理器上。当空闲处理器从一个忙的处理器上 一个等待任务时,发生拉迁移。

你可能感兴趣的:(2020-04-08)