QNX-9—QNX官网文档翻译—Sporadic scheduling

发布时间 2023-06-23 18:49:52作者: Hello-World3

一、翻译

注:翻译自
QNX Software Development Platform --> OS Components --> System Architecture --> The QNX Neutrino Microkernel --> Thread scheduling --> Scheduling policies
https://www.qnx.com/developers/docs/7.1/index.html#com.qnx.doc.neutrino.sys_arch/topic/kernel_Sporadic_scheduling.html

零星(或偶发)调度策略通常用于对给定时间段内线程的执行时间提供上限。

当在服务周期性和非周期性事件的系统上执行速率单调分析 (RMA) 时,此行为至关重要。 本质上,该算法允许线程为非周期性事件提供服务,而不会危及系统中其他线程或进程的硬期限。

与 FIFO 调度一样,使用零星调度的线程会继续执行,直到它阻塞或被更高优先级的线程抢占。 与自适应调度(adaptive scheduling)一样,使用偶发调度的线程的优先级将下降,但通过偶发调度,您可以更精确地控制线程的行为。

在零星调度下,线程的优先级可以在前台或正常优先级与后台或低优先级之间动态振荡。 使用以下参数,您可以控制这种零星转变的条件:

(1) Initial budget (C)——初始预算(C)

线程在降至低优先级 (L) 之前允许以其正常优先级 (N) 执行的时间量。

(2) Low priority (L)——低优先级 (L)
线程将下降到的优先级。 线程在后台时以较低优先级 (L) 执行,而在前台时以正常优先级 (N) 运行。

(3) Replenishment period (T)——补货期(T)

允许线程消耗其执行预算的时间段。 为了安排补充操作,POSIX 实现还使用该值作为从线程变为 READY 的时间的偏移量。

(4) Max number of pending replenishments——待补货的最大数量

该值限制了可以发生的补给操作的数量,从而限制了零星调度策略消耗的系统开销。

在配置不当的系统中,线程的执行预算可能会因为过多的阻塞而受到侵蚀,也就是说,它不会收到足够的补充。

如下图所示,零星调度策略建立线程的初始执行预算 (C),该预算由线程在运行时消耗,并定期补充(数量 T)。 当线程阻塞时,已消耗的执行预算量 (R) 会安排在线程首次准备好运行后的某个时间(例如,40 毫秒)补充。

图1. 线程的预算会定期补充。

在其正常优先级 N 下,线程将执行由其初始执行预算 C 定义的时间量。一旦该时间耗尽,线程的优先级将下降到其低优先级 L,直到发生补充操作。

例如,假设一个系统中线程永远不会阻塞或永远不会被抢占:

 

图2. 线程的优先级会下降,直到其预算得到补充。

在这里,线程将下降到其低优先级(后台)级别,在该级别中,它可能有机会运行,也可能没有机会运行,具体取决于系统中其他线程的优先级。

一旦发生补充,线程的优先级就会提升到原来的级别。 这保证了在正确配置的系统中,线程在每个周期 T 都有机会运行最大执行时间 C。这确保了以优先级 N 运行的线程将仅消耗系统资源的 C/T,如果有优先级高于L的其他就绪线程。

零星调度程序的 QNX Neutrino 实现与 POSIX 零星调度程序的不同之处在于,出于计算原因,该算法允许每个零星服务器线程最多进行一次待处理补充。 每次补充时,零星服务器线程的可用预算都会增加到其初始预算。

 

Related concepts
Priorities and scheduling (QNX Neutrino Programmer's Guide)
Priorities (Getting Started with QNX Neutrino)
The kernel as arbiter (Getting Started with QNX Neutrino)

Related reference
pthread_setschedparam()
pthread_setschedprio()
sched_setparam()
sched_setscheduler()
SchedSet(), SchedSet_r()