vxWorks SMP程序调度及亲和性

vxWorks smp环境下,可以同时调度N个最高优先级任务。

1、CPU亲和性

cpu affinity就是分配指定的中断或者任务给指定CPU,分为任务亲和性与中断亲和性。在SMP环境下,任务可以执行在任务一个CPU,这样通常能够很好的平衡各核负荷,但是如果想使用一个核专心处理信号处理任务,就可以把CPU分配为一个核,这样可以保证CACHE不被经常在核间切换时遭到冲刷,提高性能。可以使用如下函数对其进行设置:

vxWorks SMP程序调度及亲和性_第1张图片

中断亲和性是需要通过编程中断控制器实现的,将特定ISR分配为某个核。

2、CPU预留

vxworks还为设置CPU亲和性的任务提供了CPU预留功能,保证预留的CPU不被其它任务抢占,保证任务性能。

vxWorks SMP程序调度及亲和性_第2张图片

3、SMP任务调度算法

vxWorks SMP程序调度及亲和性_第3张图片

调度算法首先判断任务是否有CPU亲和性,如果有则放入指定CPU ready队列,否则放入全局非亲和性队列。对于全局非亲和性ready队列的任务,则要寻找没有为其它任务做预留的CPU,进行任务调度。

下面看几个例子:

没有CPU预留情况1

vxWorks SMP程序调度及亲和性_第4张图片

有ABC三个任务,当A ready后,则从四个核上运行的任务中找到最低优先级的任务为cpu2上的ty,并抢占。当B进入readdy状态后,由于B设置了CPU2的亲和性,但这时A正在cpu2上运行,而B优先级低于A,所以B进入挂起状态。当C变为ready时,C具备CPU3亲和性,而cpu3上的当前运行任务优先级低于C,故C在cpu3上运行。

vxWorks SMP程序调度及亲和性_第5张图片

上面这张图,A变成ready后,因为CPU3上运行的任务优先级最低,做在CPU3上运行。这样,导致具有CPU亲和性的任务C没法抢占CPU3。

下面一张图是CPU预留的情况:

vxWorks SMP程序调度及亲和性_第6张图片

如果CPU2,cpu3被预留后,A变成ready后,A没有亲和性条件只能在CPU0与CPU1上调度,这样A选择了优先级低的CPU1。接下来B与C分别分配到了CPU2与CPU3。

你可能感兴趣的:(vxworks)