调度基本上分为两类:第一是时钟驱动调度 一种是事件驱动的调度。时钟驱动调度算法是其中时钟接收的中断有助于确定调度点的那些算法,这些中断包括FCFS,循环调度等。在事件驱动算法中,事件有助于确定调度点。 “事件驱动”又分为3种类型,第一类是基于简单优先级的方法,第二种是速率单调分析(RMA),第三种是最早的截止日期优先(EDF)。
前景-背景调度属于事件驱动算法的第一种类型,即基于简单优先级的算法。在该算法中,保留了2个等待列表,一个是“前景”,另一个是“背景”。首先,每个进程都在其执行的前景列表中进入并执行一小段时间,直到达到阈值时间限制为止;此后,如果该进程不完整,则该进程将进入后台等待列表中仅当前景列表为空且在后台等待列表中时,才使用循环调度算法来执行该过程。
因此,根据上述过程,“前景”列表的优先级高于“背景”列表,“前景”的阈值时间短于“背景”列表。通常,在前台列表中,进程将被使用2个量子,然后将其发送到后台,而在后台,该进程将获得4个量子以完成其所有工作,如果该进程仍未完成,则返回到末尾。在“背景”列表中,等待其轮流再次获得4个量子点,然后重复此过程,直到该过程完成其工作为止。该算法在需要在创建流程后立即执行流程的情况下提供帮助。
前台后台调度程序的工作:
Foreground-Background Scheduler遵循以下步骤来调度实时任务:
- 步骤1:
所有实时任务都分为前台任务和后台任务。前景任务包括周期性任务,而后台任务包括零星和非周期性任务。 - 第2步:
前台任务的优先级最高,而后台任务的优先级最低。 - 步骤3:
在调度前台任务时,在所有调度点都考虑了最高优先级。 - 第四步:
当前台任务尚未准备好进行调度时,将调度后台任务。 - 步骤5:
在后台任务中,遵循与前台任务相同的调度规则。
前景任务的完成时间:
如前所述,前台任务包括周期性任务,因此它们的完成时间与它们的绝对期限相同。
后台任务的完成时间:
当所有前台任务都计划好之后,才安排该后台任务。当执行任何前台任务时,将等待后台任务。
令Task T i为前台任务,E i为每个P i周期所需的处理时间。
因此,
Avg. CPU utilization for Ti is Ei/Pi
如果有n个周期性任务(前景任务),即
T1, T2, T3, ..., Tn
然后合计平均。前台任务的CPU利用率,
= (E1/P1) + (E2/P2) + ... + (En/Pn)
因此,平均每个时间段内可用于执行后台任务的时间是
1 - (E1/P1) + (E2/P2) + ... + (En/Pn)
设T b为后台任务,E b为所需的处理时间,则
后台任务的完成时间(CT b ),
= Eb / ( 1 - (E1/P1) + (E2/P2) + ... + (En/Pn) )
例子:
在实时系统中,使用前台-后台调度算法对任务进行调度,T f只是E f = 100 ms和P f = 200 ms的前台任务,有一个后台任务T b其E b = 500 ms。
后台任务的完成时间
CTb = Eb / (1 - Ef/Pf)
= 500 / (1 - 100/200)
= 1000 ms
因此,后台任务将需要1000毫秒才能完成。
前台-后台调度的优势:
- 定期任务被赋予最高优先级。
- 对于进入的较高优先级任务,它会抢先执行正在进行的任务。
前台-后台调度的缺点:
- 后台任务可能会饿死。
- 有时抢占可能会造成破坏。
例子:
1.考虑我们在前台有3个任务T1,T2,T3,在后台有T4任务。
Task Number | ei (in ms) | pi (in ms) |
t1 | 5 | 20 |
t2 | 10 | 25 |
t3 | 15 | 50 |
当T4的处理时间要求为200毫秒以完成时,计算T4的完成时间。
解决方案:第一项任务是在额头上找到所有任务的总和。因此,我们获得了前额任务的总CPU利用率
(e1 / p1)+(e2 / p2)+(e3 / p3)
(5/20)+(10/25)+(15/50)
(25 + 40 + 30)/ 100
95/100
第二项任务是将总和减去1。因此,我们知道在每个时间单位内有多少平均时间可用于后台任务
1 –(95/100)
5/100
最后,我们必须将eB除以上述值
200 /(5/100)
200 * 100/5
20000/5
4000
因此,后台任务的总完成时间为4000毫秒。
2.考虑2个任务,一个任务在前景T1中,另一个任务在背景TB中。后台任务TB的完成时间为3000毫秒,而TB所需的处理时间为1500毫秒。当p1为100 ms时,计算T1所需的处理时间。
解决方案:给定:ctB = 3000毫秒,eB = 1500毫秒,p1 = 100毫秒
ctB = eB /(1 – e1 / p1)
3000 = 1500 /(1 – x / 100)
2 = 1 /((100-x)/ 100)
2 = 100 /(100 – x)
200 – 2x = 100
2x = 100
x = 50
T1所需的处理时间为50毫秒
在前景和后台等待列表之间进行上下文切换期间的开销:
首先,前台任务运行,它从映像中清除时会产生2 ms的开销。开销时间用灰色区域表示,一次运行的列表用绿色表示,被抢占并等待其轮换或空闲的列表用白色表示。从上图可以清楚地看到,从2到52的前景列表正在运行,背景列表正在等待。一次只允许一个列表运行其任务,例如在第一次前台运行任务时,然后在后台时段完成后在特定时间段后抢占后台任务,然后抢占前台,依此类推。在初始状态下,存在2 ms的开销,并且该前台开始工作后(如图所示)。很明显,每个前台任务的执行时间都增加了两个上下文切换时间(一个是由于自身的原因,即0到2毫秒,另一个是由于后台任务在每次完成后运行(例如52到54毫秒)而运行。因此,上下文切换时间增加了4 ms,因为在1个上下文切换中需要2 ms,因此在2个上下文切换中需要4 ms。因此,前景列表的运行时间增加了,变为54毫秒而不是50毫秒。考虑到前台任务的周期(pi)为100 ms,这意味着每隔100 ms,后台任务将被抢占,而前台任务开始运行。让我们举个例子:
例子。考虑前台的任务T1,其e1为50 ms,p1为100 ms,而后台的任务T2,其e2为2000。当每个上下文切换的开销为2 ms时,计算后台任务的完成时间。
解决方案:通过以上讨论,可以看出e1变为54 ms。
2000 /(1 – 54/100)
2000 /((100-54)/ 100)
200000/46
4347.82
因此,后台任务的完成时间为4347.82 ms