VxWorks系统调度

1.  

VxWorks

任务调度

调度点即执行schedule()函数的时机,调度器会检查各进程的运行状态,以便确定是否需要进行进程切换。

1.1. VxWorks调度时机

VxWorks中任务调度的时机可分以下两种情况:

1)同步任务切换,引起的原因是当前运行的任务执行下列操作:①进行阻塞、延迟、挂起的调用;②使更高优先级任务就绪而发生优先级抢占;③降低自身优先级或者退出。

2)异步任务切换,通常由中断服务使高优先级任务就绪引起。

VxWorksWind微内核基于优先级抢占调度。并采取单一实地址空间模式,上述引发任务调度的情况发生时,VxWorks内核立即进行任务的调度切换。

1.2. VxWorks任务切换

《VxWorks系统调度》

1.3. VxWorks任务调度原理

多任务运行时需要一个调度算法,将CPU分配给就绪的任务。Wind内核默认采用基于优先级的抢占式调度(Prioritybased preemptive scheduling)算法,同时也可以选用轮转(Roundrobin)调度算法。

1.3.1.    基于优先级抢占的任务调度

指每个进程被赋予一个优先级,优先级最高的就绪进程率先执行可抢占调度(preemptivescheduling)是指允许将逻辑上可运行的进程暂时挂起的策略。VxWorks采用基于优先级抢占的调度算法,系统中的每个任务都拥有一个优先级,内核将CPU分配给处于就绪状态的优先级最高的任务。如果系统内核一旦发现有一个优先级比当前任务的优先级高的任务转变到就绪状态,内核立即保存当前任务的上下文,当前任务状态切换到就绪状态并按优先级插入到相应任务队列的队尾,然后内核切换到这个高优先级任务的上下文中执行。

Wind内核有256个优先级,编号是0-2550的优先级最高,255最低。任务的优先级可以在创建时设定,系统默认的任务优先级为100VxWorks允许任务动态改变自己的优先级,当任务执行时,它可以调用taskPrioritySet()改变自己的优先级。

1.3.2.    轮转调度

VxWorks中,基于优先级抢占的调度可以与轮转调度相结合。轮转调度算法试图让优先级相同的、处于就绪状态的任务公平地分享使用CPU资源。如果不使用轮转调度,当系统中存在多个相同优先级的任务时,第一个获得CPU的任务将会独占CPU,如果没有阻塞或其它情况出现,其它相同优先级的任务将得不到运行的机会。使用轮转调度时,每个任务被分配一个时间段,称作它的时间片(quantum),即该任务允许运行的时间。在VxWorks系统中,可以调用函数kernelTimeSlice0来选用轮转调度策略,其参数是时间片的长度,该时间片是每一个任务在放弃CPU给另一个相同优先级任务之前,系统允许它运行的时间长度。如果任务在它的时间片中被高优先级的任务抢占,调度器保存它的运行时间计数器,当它再一次符合执行条件的时候,调度器恢复运行时间计数器。

1.3.3.    抢占上锁与中断上锁

由于所有VxWorks任务共存于单一的线性地址空间,当多个任务共享全局的数据结构时,需要提供对临界区的互斥访问机制。使用信号量对资源上锁是一种比较通用的互斥手段,如POSIX有名信号灯或无名信号灯和System V的信号量集。

VxWorks提供了三种类型的信号量:二进制信号量、互斥信号量和计数器信号量。此外,VxWorks在任务调度层次上提供了互斥访问保护的机制:在临界区内禁止任务的抢占调度,这在VxWorks中称为抢占上锁,具体互斥的实现是将临界区代码包括在两个函数taskLock()taskUnlock()之间。

VxWorks中,不仅任务与任务之间需要考虑互斥,同时任务与中断之间也要考虑互斥。因为中断的优先级高于任何任务,所以抢占上锁虽然保证了任务与任务间的互斥,但并没有保证任务与中断服务程序对临界区的互斥访问。VxWorks的中断上锁则提供了最强有力的互斥,将临界区代码保护在intLock()intUnlock()两个函数之间。中断上锁实现的是中断级互斥,在互斥期间,即使外部事件产生而引发相应的中断,系统也不会切换到相应的中断服务程序(ISR)

因此,VxWorks的抢占上锁和中断上锁是通过禁止任务抢占或禁止切换到中断服务程序来保护临界区的。同时,这种灵活的互斥手段在临界区中也会影响VxWorks任务的原始调度原则,比如低优先级任务抢占上锁时,就绪任务队列上具有较高优先级的任务却不能即时占有处理机。

1.4. 实时性

VxWorks作为一种实时操作系统,除了中断和taskLock()会延迟任务的调度外,其它任何时候都可以迅速切换到高优先级的任务。另外,VxWorks对中断的处理采用“底半部”策略,即将中断处理中不是很紧急的部分挂在到内核任务tExcTask上处理,降低了用户高优先级任务的延迟。

点赞