一、 先来先服务 (First Come First Severd FCFS)
最简单的调度算法,就是非抢占式的先来先来先服务(First Come First Severd FCFS)
顾名思义就是按照进入就绪队列的顺序一次服务,知道进程退出或被阻塞才会选择下一个进程运行。
这种算法看起来很公平但是在长作业时间很长的情况下后面的短作业就会被一直阻塞,不利于短作业。适合CPU繁忙行的系统,而不适用于I/O繁忙型的系统。
二、 最短作业优先 (Shortest Job First, SJF)
顾名思义 这种算法会选择运行时间最短的进程来运行 这有助于提高系统的吞吐量。
但是同样的,短作业优先就会对长作业不友好,如果就绪队列中有非常多的短进程,那么长作业就会被一直阻塞,不利于长作业
三、高响应比优先 (Highest Response Ratio Next, HRRN)
由于前两种算法都有对应的缺点,高响应比优先应运而生
这种算法在每次程序运行调度时,先计算响应比级别,然后把响应比最高的投入运行
计算公式:优先级别=(等待服务时间 + 服务所需时间)/ 服务所需时间
根据公式可知,
- 在两个进程等待时间相同的情况下,服务所需时间越短,响应比越高,越容易被选中运行
- 在两个进程服务所需时间相同的情况下,等待时间越长,响应比越高,越容易被选中运行
四、时间片轮转 (Round Robin, RR)
最古老、最简单、最公平且使用范围最广的算法就是时间片轮转
简单来说就是每个进程被分配一个时间段,称为时间片,即允许该进程在该时间段中运行
如果时间片时间片跑完,进程为结束,则会把此进程从CPU释放出来,并把CPU分配给另外一个进程;如果在一个时间片内没执行完当前任务,则没执行完的进程会被加到就绪队列的尾部等待再次轮询。
另外,如果将时间片的时间设置的太长则会引起对短作业进程的响应时间变长,如果时间过短,则会引起过多的上下文切换,降低CPU的利用率
五、最高优先级(Highest Priority First,HPF)
在时间片轮转中,对所有进程一视同仁,大家都没有特权。但是在一些系统中,它是希望有优先级的,所以最高优先级调度算法它来了:从就绪队列中选择最高优先级的进程运行,这就成为最高优先级调度。
进程的优先级可以分为,静态优先级或动态优先级:
静态优先级:创建进程时候,就已经确定了优先级了,然后整个运行时间优先级都不会变化;
动态优先级:根据进程的动态变化调整优先级,比如如果进程运行时间增加,则降低其优先级,如果进程等待时间(就绪队列的等待时间)增加,则升高其优先级,也就是随着时间的推移增加等待进程的优先级。
该算法也有两种处理优先级高的方法,非抢占式和抢占式:
非抢占式:当就绪队列中出现优先级高的进程,运行完当前进程,再选择优先级高的进程。
抢占式:当就绪队列中出现优先级高的进程,当前进程挂起,调度优先级高的进程运行。
当然它也是有缺点滴,可能有导致优先级低的进程永远不会运行
六、多级反馈队列(Multilevel Feedback Queue)
时间片轮转和最高优先级的综合
顾名思义:该算法有多级队列来实现进程调度
- 多级:多级队列,每个队列优先级从高到低,分配的时间片从低到高
- 反馈:如果有优先级高的进程加入队列,立刻停止当前正在运行的进程,转而去运行优先级高的队列
这种算法设置了多个队列,赋予每个队列不同的优先级,每个队列优先级从高到低,同时优先级越高时间片越短;
新的进程会被放入到第一级队列的末尾,按先来先服务的原则排队等待被调度,如果在第一级队列规定的时间片没运行完成,则将其转入到第二级队列的末尾,以此类推,直至完成;
当较高优先级的队列为空,才调度较低优先级的队列中的进程运行。如果进程运行时,有新进程进入较高优先级的队列,则停止当前运行的进程并将其移入到原队列末尾,接着让较高优先级的进程运行;
可以发现,对于短作业可能可以在第一级队列很快被处理完。对于长作业,如果在第一级队列处理不完,可以移入下次队列等待被执行,虽然等待的时间变长了,但是运行时间也会更长了,所以该算法很好的兼顾了长短作业,同时有较好的响应时间