进程调度策略

进程调度

调度指标:周转时间

任务的周转时间定义为任务完成时间减去任务到达系统的时间。公式化描述是T 周转时间= T完成时间−T到达时间。周转时间是一个性能指标,调度系统中可以优化性能,但是付出的代价往往是阻止一些工作的运行。

  • 先进先出(First In First Out,FIFO) / 先到先服务(First Come First Served,FCFS)调度

​ 假设系统中存在A、B、C三个任务,如果按照先后顺序进行调度,对应平均周转时间是(10 + 20 + 30)/ 3 = 20,但是考虑一个极端情况,就是当A的作业时长是100的时候,对应B在110时刻完成作业,C任务在120时刻完成作业,计算平均周转时间就是(100 + 110 + 120)/ 3 = 110。那么先进先出这种调度策略带来的问题是不是很大,这个问题被称为护航效应,简单来说就是由于前面某些超长时间的任务导致后续的短时间任务等待了很长时间。

进程调度策略_第1张图片

  • 最短任务优先(Shortest Job First, SJF)- 非抢占式调度

​ 为了解决护航效应,从运筹学借鉴到方法应用到计算机任务调度中。简言之,就是谁任务执行时间最短谁先占用CPU资源。仍然使用前面的假设A(任务100s)、B、C三个任务每个任务10s,平均周转时间是(10 + 20 + 120) / 3 = 50s,比FIFO调度策略要快很多。但是仍然存在一个问题,就是如果A先来的,但是A已经开始执行了,在执行过程中B、C任务来了,此时由于是非抢占式的调度策略,B、C只能往后面推,对应平均周转时间(100 + 100 + 110)/ 3 = 103.3s。也遭遇了同样的护航问题。

进程调度策略_第2张图片

  • 最短完成时间优先(Shortest Time-to-Completion First,STCF)/抢占式短作业优先(Preemptive Shortest Job First ,PSJF)

​ 对于抢占式任务,可以避免由于非抢占式调度策略产生的护航问题,即上文的如果A运行中,B、C任务到了,是可以抢占A的CPU资源进行服务的,这导致平均周转时间大大减少(120 + 10 + 20)/ 3 = 50s。

进程调度策略_第3张图片


​ 基于前面的三种抢占式/非抢占式任务,可以发现衡量指标只有周转时间,抢占式短作业优先是一个很好的例子。这种参考对于早期的批处理系统很有效,但是分时系统出现改变了这一局面。由此产生新的度量:响应时间。公式化的表达是T响应时间 = T首次运行 - T到达时间。还是按照上文的STCF调度策略,三个任务同时来的时候,按照顺序来都得等待前一个任务完成之后才行。响应时间很长。由此提出轮转

  • 轮转(Round-Robin, RR)

​ 轮转就是在一个时间片中运行一个工作,别管工作完没完成。切换到下一个任务,就是大家伙按照某一个时间片大小轮着来使用计算机资源。从下图可以看到时间片轮转的响应时间很好,平均响应时间是:(0 + 1 + 2)/3 = 1; SJF 算法平均响应时间是:(0 + 5 + 10)/ 3 = 5。

进程调度策略_第4张图片

​ 这里有一个问题,就是时间片的长短如何设置,太短了响应时间好,但是对于性能损耗是很大的,太长了响应时间就不那么好了,由此引出摊销技术(amortize):摊销技术就是当系统某些操作有固有成本的时候,可以减少成本的频度,从而减少系统的总成本。

总结两类方法:

1、运行最短工作,优化周转时间

2、交替运行工作,优化响应时间

​ 刚才所有的调度策略都是建立在CPU资源的基础上的,没有考虑进程执行I/O。程序在执行I/O期间是不会使用CPU资源的,上述调度方案对于CPU密集型来说是十分高效的。当前有两个任务A、B,每项工作需要50ms的CPU时间,但是A会在运行10ms之后发起一次I/O请求,而B任务只执行CPU请求,不占用I/O。就会出现左图的情况,但是如果我们重叠执行任务的话。会出现右图情况,可以看到重叠可以很好的利用资源。
进程调度策略_第5张图片

​ 总的来说,就是当任务执行IO的时候,会空闲出占用的CPU资源,此时会把资源转让给别的任务。然后等到IO结束之后,也会让出CPU资源,让CPU密集型作业继续运行,从而更好的利用处理器。

到IO结束之后,也会让出CPU资源,让CPU密集型作业继续运行,从而更好的利用处理器。

你可能感兴趣的:(体系结构,系统架构)