大家都知道,学习这种类型的算法,在很多时候,我们只是学习它的一种思想,那有没有好的学习调度算法的思路呢?
我们可以基于一下路线,来学习调度算法:
- 1、算法思想
- 2、算法规则
- 3、这种调度算法是用于 作业调度 还是 进程调度?
- 4、抢占式,还是非抢占式?
- 5、优点和缺点
- 6、是否会导致饥饿(饥饿是指某个进程/作业长期得不到服务,一直处于等待状态)
那么我们就基于以上路线,来学习常见的调度算法:
先来先服务(FCFS)
算法思想:先来先服务
算法主要是从"公平"的角度考虑,类似我们在生活中排队买东西一样,谁先来就谁先买到。
算法规则:按照作业/进程达到的先后顺序,按照顺序依次执行。
用于作业/进度调度:用于作业调度时,考虑的是哪个作业先到达后备队列;用于进程调度时,考虑的是哪个进程先到达就绪队列。
是否可抢占:由于这种算法的思想是从“公平”的角度考虑,所以当然是非抢占式,按照排队顺序依次执行。
优缺点:优点的话就是对于每个作业/进程都是公平的,算法实现简单。缺点的话就是排在长作业,或者长进程后面的短作业/进程来说,需要等待很长的时间,带权周转时间很大,对短作业来说用户体不好。 就比如说,我们都在排队买奶茶,我自己只需要买一杯,可是我前面那个大兄弟,他要买20杯,假设做一杯奶茶需要1分钟,那我至少需要等20分钟,才轮到我,而我自己本身就只买一杯奶茶,也就等1分钟就走了。但是现在由于先来先服务算法,所以我需要等20分钟以上。
是否会导致饥饿:不会,因为都是按顺序执行,好好排队,总会轮到你的。
短作业优先(SJF)
算法思想:这个算法追求最少的平均等待时间、最少的平均周转时间,最少的平均带权周转时间。
算法规则:最短的作业/进程优先得到服务,这里说的最短,指的是要求服务时间最短。
用于作业/进度调度:可用于作业调度,也可以用于进程调度,用于进程调度时,称之为”短进程优先“。
是否可抢占:有非抢占式的版本,也有抢占式的版本
优缺点:优点是 “最短的” 平均等待时间、平均周转时间,对于短作业/进程来说,可得到优先执行的机会。缺点就是不公平,对短作业有利,对长作业不利。可能会产生饥饿现象。
是否会导致饥饿:会,如果有源源不断的短作业/进程到来,可能会使得长作业/进程很长时间得不到服务,产生饥饿
现象,如果一直得不到服务,则称之为饿死
。
高响应比优先(HRRN)
算法思想:针对上面两种算法来说,都有各自的优点和缺点,为了综合上面两种算法,所以要综合考虑作业/进程的等待时间和要求服务的时间。
算法规则:在每次调度时,先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务。
用于作业/进度调度:可用于作业调度,也可以用于进程调度。
是否可抢占:非抢占式算法,因此只有当前运行的作业/进程主动放弃 CPU 时,才需要调度,计算响应比,从而选择响应比最高的作业/进程来执行。
优缺点:综合考虑了等待时间和运行时间,等待时间相同时,运行时间短的优先执行,运行时间相同时,等待时间长的优先执行,对于长作业来说,随着等待时间越来越久,其响应比也会越来越大,从而避免了长作业饥饿的问题。
是否会导致饥饿:不会。
上三种算法对比
时间片轮转
算法思想:公平地、轮流的为各个进程服务,让每个进程在一定时间间隔内都可以获得响应。
算法规则:按照各个进程到达就绪队列的顺序,轮流让各个进程执行一个时间片。。若进程未在一个时间片内执行完,则剥夺 CPU 资源,讲进程重新放到就绪队列队尾重新排队。
用于作业/进度调度:用于进程调度,只有作业放入到内存建立相对应的进程之后,才能被分配 CPU 时间片。
是否可抢占:若进程未能在时间片内运行完,将被强行剥夺 CPU 使用权,因此时间片轮转调度算法属于抢占式的算法。由时钟装置发出时钟中断来通知 CPU 时间片已到。
优缺点:优点是公平、响应快,适用于分时操作系统,缺点是由于高频率的进程切换,因此有一定的开销,而且不区分任务的紧急程度。
是否会导致饥饿:不会。
优先级调度
算法思想:随着计算机的发展,特别是实时操作系统的出现,越来越多的应用场景需要根据任务的紧急程度来决定处理顺序。
算法规则:调度时选择优先级最高的作业/进程。
用于作业/进度调度:可用于作业调度,也可以用于进度调度。
是否可抢占:抢占式、非抢占式都有,非抢占式只需要在进程主动放弃 CPU 执行权的时候进行调度,而抢占式当就绪队列变化时,检查是否发生抢占。
优缺点:优点就是用优先级区分紧急程度、重要程度、适用于实时操作系统。可灵活地调整对各种作业/进程偏好程度。缺点就是如果有不断的高优先级进程/作业进来,则会导致饥饿现象。
是否会导致饥饿:会。
多级反馈队列
算法思想:对其他调度算法的这种权衡。
算法规则:
1、设置多级就绪队列,各级队列优先级从高到低,时间片从小到大。
2、新进程达到时,先进入1级队列,按照先来先服务的规则排队等待被分配时间片,若时间片用完还未结束,则进程进入下一级队列队尾。 如果此时已经是在最下级的队列,则重新放回该队列的队尾。
3、只有1级队列为空时,才会为2级队列对头的进程重新分配时间片,以此类推。
用于作业/进度调度:用于进程调度。
是否可抢占:抢占式算法,假设在第2级队列的进程在运行过程中,突然1级队列进入了一个新的进程,则由于新进程处于优先级更高的队列中,因此新进程会占用 CPU 执行权,原来运行的进程会放回之前队列的队尾。
优缺点:对各类型进程相对公平,每个新到达的进程都可以很快就得到响应,段进程只用较少的时间就可以完成,不必实现估计进程的运行时间,可灵活地调整对各类进程的偏好程度,比如 CPU 密集型进程、I/O 密集型进程。
是否会导致饥饿:会。
上三种算法对比
多级队列调度
队列之间采取固定优先级,或者时间片划分。
固定优先级:高优先级空时,低优先级进程才能被调度。
时间片划分:如三个队列分配时间为第一个队列占时间片 50%、第一个队列占时间片 40%、第三个队列占时间片 10%。
各个队列可采用不同的调度策略,比如系统进程采用优先级调度,交互式进程才有时间片轮转,批处理进程采用先来先服务。