调度程序是操作系统内核的一部分,负责选择要运行的下一个进程。因此,调度策略确定操作系统是非实时操作系统还是实时操作系统。目前有许多类型的操作系统,但是过程调度算法可以总结如下。
先到先服务调度算法(FCFS)
先到先得的调度策略非常简单。保持就绪队列。每个计划从首先进入队列的就绪队列中选择一个进程,为其分配处理器并将其投入运行。该过程一直运行直到完成或事件发生并阻塞处理器。
短流程优先级调度算法(SPF)
短进程优先级(SPF)调度算法从就绪队列中选择具有最短估计运行时间的进程,将处理器分配给它,使其立即执行并继续直到完成,或者阻止并丢弃事件。机器运行时重新安排。
高优先级优先级调度算法
为了处理紧急过程,可以优先考虑这些过程,因此引入优先级优先级算法。该调度算法可用于实时操作系统。当进程调度发生时,算法将处理器分配给就绪队列中的最高优先级进程。
有两种类型的算法:
非抢占优先级算法:在此模式下,一旦处理器将处理器分配给就绪队列中具有最高优先级的进程,该过程将继续,直到该过程结束;或者处理器被主动放弃。系统会将处理器分配给具有最高优先级的另一个进程。该算法可用于某些不需要实时性能的操作系统。
抢先优先级调度算法:在此模式下,系统还将处理器分配给优先级最高的进程,然后运行。但是,如果在运行期间在就绪队列中发生了更高优先级的进程,则系统立即停止当前正在运行的进程并将处理器重新分配给新添加的更高优先级进程。因此,在这种模式下,可以更好地满足实时要求,因此它通常用于具有高实时要求的系统中。
想象一下,由于缺乏资源,高优先级进程被阻止,直到低优先级进程释放资源。低优先级获得较少的CPU时间。如果此时两者之间存在优先级的任务,并且不需要共享资源,则中优先级处理将超过这两个进程并获得CPU时间。如果高优先级等待资源而不是阻塞等待,但是繁忙的循环,则可能永远不会获得资源,因为低优先级进程不能与高优先级进程竞争CPU时间,因此无法执行,并且资源不能被发布。结果是,高优先级流程在无法访问资源的情况下继续发展。我们称之为这种现象:优先翻转。如何解决上述问题?
有三种方式:
设置优先级的上限并为临界区赋予高优先级。进入关键部分的过程将获得此高优先级。如果尝试进入临界区的其他进程的优先级低于此高优先级,则优先级相反。它不会发生。
优先继承。当高优先级进程等待低优先级进程持有的资源时,低优先级进程暂时获得高优先级进程的优先级。释放共享资源后,低优先级进程将返回到原始资源。优先级。嵌入式系统VxWorks采用这种策略。
第三种方法是禁用临界区中的中断,并通过禁用中断来保护临界区。采用该策略的系统只有两个优先级:抢占优先级和中断禁止优先级。前者是一般进程运行时的优先级,后者是在关键部分中运行的优先级。火星探路者是由在关键部分运行的气象任务中断的通信任务的冲突引起的。如果存在禁止中断保护的关键区域,则不会发生此问题。
高响应率优先级算法
在CPU密集型系统中,短进程优先级算法是一种更好的算法。但是,无法保证长进程的运行。如何解决这个问题呢?我们能否引入动态优先权,用白话,等待时间越长,优先级越高。因此,等待一段时间后,它肯定会运行。但是动态计算优先级的算法是它需要消耗CPU资源。
时间片旋转
在早期时间片旋转方法中,系统以先来先服务的方式对所有准备好的进程进行排队。每次,CPU都被分配到团队领导进程并执行一个时间片。时间片的大小范围从几毫秒到几百毫秒。当执行的时间片用完时,定时器发出定时器中断请求,调度器根据该信号停止执行该过程并将其发送到就绪队列的末尾;然后,处理器被分配到就绪队列中的新团队领导者进程也允许它执行时间片。这可确保就绪队列中的所有进程都将获得给定时间内的处理器执行时间。换句话说,系统可以在给定时间内响应来自所有用户的请求。
多级反馈队列调度算法
我们之前谈到的调度算法有一些局限性。例如,短流程优先级调度算法仅处理短流程并忽略长流程。多级反馈队列调度算法是平衡的,可以满足各种过程的需要。因此,它是一种更好的进程调度算法。
设置多个就绪队列,每个队列具有不同的优先级。第一个队列具有最高优先级,第二个队列具有较低优先级,依此类推。优先级越高,时间片越短。当新进程进入内存时,它首先放在第一个队列的末尾,并根据FCFS原则排队等待调度。当轮到要执行的过程时,如果它可以在时间片内完成,它就可以撤离系统;如果在时间片结束时未完成,则调度程序将该进程转移到第二个队列的末尾,然后类似地,根据FCFS原则等待调度执行;如果在第二个队列中运行时间片后仍未完成,则依次将其放入第三个队列,.等等,当第一个队列中的长作业(进程)连续降低后在第n个队列中,第n个队列以时间片旋转方式操作。
仅当第一个队列空闲时,调度程序才会调度第二个队列中的进程运行;只有当第一个到第(i-1)个队列为空时,才会安排第i个队列中的进程运行。如果处理器正在为第i个队列中的进程提供服务,并且新进程进入具有更高优先级的队列(第一个到(i-1)中的任何一个),则新进程将抢占运行。进程的处理器,即调度程序将正在运行的进程放回到第i个队列的末尾,并将处理器分配给新接收的高优先级进程。