当前位置: 首页 > 科技观察

操作系统中的进程调度算法有哪些?_0

时间:2023-03-16 21:12:02 科技观察

调度器是操作系统内核的一部分,负责选择下一个要运行的进程。所以调度策略决定了操作系统是非实时操作系统还是实时操作系统。现在的操作系统种类繁多,但进程调度算法可以归纳如下。先来先服务调度算法(FCFS)先来先服务的调度策略非常简单。维护一个就绪队列,每次调度就是从就绪队列中选择一个最先入队的进程,为其分配一个处理器,投入运行。该进程一直运行,直到它完成或在放弃处理器之前阻塞事件。ShortProcessPrioritySchedulingAlgorithm(SPF)ShortProcessPriority(SPF)调度算法是从就绪队列中选择一个估计运行时间最短的进程,为其分配一个处理器,并使其立即执行并继续执行,直到完成,或者当事件发生并且处理器被阻塞和放弃时重新安排。高优先级优先级调度算法为了照顾紧急进程,让这些进程优先运行,引入了优先级-优先级调度算法。这种调度算法可以用在实时操作系统中。当进程调度发生时,算法将处理器分配给就绪队列中优先级最高的进程。这种算法有两种类型:非抢占式优先级算法:在这种模式下,一旦系统将处理器分配给就绪队列中优先级最高的进程,该进程将继续运行,直到进程结束;或者主动放弃处理器,系统会将处理器分配给另一个优先级最高的进程。该算法可用于一些对实时性要求不高的操作系统。抢占式优先级调度算法:在这种模式下,系统也将处理器分配给优先级最高的进程,然后运行它。但是,如果在运行过??程中,就绪队列中出现了优先级更高的进程,系统会立即停止当前正在运行的进程,并将处理器重新分配给新加入的优先级更高的进程。因此,在这种模式下,更能满足实时性要求,所以常用于实时性要求高的系统中。想象一下,一个高优先级的进程由于缺少资源而被阻塞,等待一个低优先级的进程释放资源。低优先级获得较少的CPU时间。如果此时有优先级介于两者之间的任务,且不需要共享资源,则优先级居中的进程将获得比这两个进程更多的CPU时间。如果等待资源的高优先级不是阻塞等待,而是忙循环,它可能永远无法获得资源,因为此时低优先级进程无法与高优先级进程竞争CPU时间,所以它无法执行,从而无法释放资源,导致的后果是高优先级进程无法获取资源,继续前进。我们称这种现象为:PriorityInversion。如何解决上述问题?有3种方法:设置优先级上限,给临界区一个高优先级,所有进入临界区的进程都会得到这个高优先级。如果其他试图进入临界区的进程的优先级低于Thishighpriority,则不会发生优先级倒置。优先继承。当高优先级进程等待低优先级进程占有的资源时,低优先级进程会临时获得高优先级进程的优先级。释放共享资源后,低优先级进程恢复到原来的优先级。嵌入式系统VxWorks就采用了这种策略。第三种方法是在临界区禁止中断,通过禁止中断来保护临界区。采用这种策略的系统只有两个优先级:抢占优先级和中断禁止优先级。前者在一般进程运行时优先,后者在临界区运行时优先。火星探路者号的失败是因为运行在临界区的气象任务被中断的通信任务抢占。如果在临界区有防止中断的保护,就不会出现这个问题。高响应比优先级调度算法在CPU密集型系统中,短进程优先级算法是一种较好的算法。但是长进程的运行时间并不能绝对保证。如何解决这个问题呢?能不能引入一个动态的优先级,说白了就是等的时间越长,优先级就越高。所以,等了一段时间,肯定就轮到跑了。但是,动态计算它们之间优先级的算法需要消耗CPU资源。时间片轮换在早期的时间片轮换法中,系统按照先到先得的原则将所有就绪的进程安排到一个队列中,每次被调度时将CPU分配给队首进程,并使得它执行一个时间片。时间片的大小从几毫秒到几百毫秒不等。当执行时间片用完时,定时器发出时钟中断请求,调度器根据这个信号停止进程的执行,并将其送至就绪队列的尾部;然后,将处理器分配给就绪队列中的新领导进程,并让它执行一个时间片。这样可以保证就绪队列中的所有进程在给定的时间内,都能获得一个时间片的处理器执行时间。换句话说,系统可以在给定时间内响应所有用户请求。多级反馈队列调度算法我们之前讲到的调度算法有一定的局限性。例如,短进程优先级调度算法只关心短进程而忽略长进程。多级反馈队列调度算法均衡,能满足各种进程的需要。所以是目前比较好的进程调度算法。设置多个就绪队列,每个队列有不同的优先级。第一个队列具有最高优先级,第二个队列具有第二优先级,依此类推。优先级高的队列时间片最短。当一个新进程进入内存时,首先被放到第一个队列的尾部,按照FCFS原则等待调度。轮到进程执行时,如果能在时间片内完成,就可以准备退出系统;如果在一个时间片的末尾还没有完成,调度器会将进程转移到第二个队列的末尾,然后同理,按照FCFS原则等待调度执行;如果在第二个队列运行一个时间片后还没有完成,则依次放入第三个队列,...,以此类推,当一个长作业(进程)从第一个队列下降到第三个队列后依次进入第n个队列,第n个队列按照时间片循环运行。只有当第一个队列空闲时,调度器才会调度第二个队列中的进程运行;只有当第i-1个队列都为空时,调度器才会调度第i个队列中的进程运行。如果处理器正在为第i个队列中的一个进程服务,有一个新的进程进入一个优先级更高的队列(1~(i-1)中的任意一个队列),那么这个时候新进程就会抢占正在运行的进程。进程的处理器,即调度器将正在运行的进程放回第i个队列的尾部,并将处理器分配给新来的高优先级进程。如下图所示:参考https://blog.csdn.net/qq_35642036/article/details/82809812,袁立老师参考了这篇文章。总结本文讲了几种进程调度算法,希望对进程调度算法感兴趣的朋友有所帮助。当然还有本文没有提到的调度算法,比如:抽签调度、单比调度等等。