RTOS(3)Wind 任务调度

来源:互联网 发布:网络自制剧牺牲图解 编辑:程序博客网 时间:2024/06/04 20:05
     多任务系统需要使用一个调度算法把CPU分配给就绪的任务,在Wind内核中,默认算法是基于优先的抢占式调度算法,当然也可使用轮转调度算法,两种短发都依赖于任务的优先级,Wind内核里有256种优先级,优先级从0到255,优先级0为最高,优先级2  55为最低。在创建任务时,需要分配给任务一个优先级,调用taskPrioritySet()可以改变任务的优先级,这种动态地改变任务优先级的功能可以使任务跟踪实现世界的优先关系变化
 
     调用描述kernelTimeSlice()控制轮转taskPrioritySet()改变任务优先级taskLock()禁止任务调度taskUnlock允许任务调度
 
 
    1、基于优先级的抢占式任务调度
    当一个新任务优先级高于系统当前执行任务的优先级时,他将抢占CPU执行,因此,系统内核将确保CPU分配给处于就绪状态的具有最高优先级的任务执行,这意味着如果某个任务比当前任务的优先级高,并处于就绪状态,那么系统内核将立刻保存当前执行任务的上下文,并切换高优先级任务的上下文中去
 
    这种调度算法的缺点是:当多个相同又优先级的任务需要共享一台处理器时,如果某个执行任务永远不阻塞,那么他将一直独占处理器,其他相同优先级的任务就没有机会执行。但是使用轮转调度算法可以解决这一点。
    
 
    2、轮转式调度
 
      当所有相同优先级的任务处于就绪状态时,轮转算法倾向于平均使用CPU,轮转调度算法对于所有相同优先级的任务,通过时间片获得相同的CPU处理时间,在一组相同优先级的任务里,每个任务将在一个规定的时间间隔或时间片内执行
       调用kernelTimeSlice()将启动轮转调度算法,其参数为时间片的长度或者一段时间间隔,即某个任务放弃CPU给另一个相同优先级的优先执行之前,系统允许该任务执行的时间长度。因此任务的执行状态不断轮转,每个任务鸽子执行一段相等的时间,在相同的优先级对流饿中,在所有任务都执行一遍之前,没有任务会得到第二块时间片。
       如果在使用轮转调度算法的基础上,对当前执行的任务使用抢占算法,系统时间片计数器将增加该任务的可执行时间长度。当规定时间段结束时,时间片计数器将清零,并根据优先级把该任务放到相同优先级任务队列的尾部,新加入到优先级的任务放在队列尾部,该任务的时间片计数器初始化为零。
      使用轮转调度算法既不影响任务上下文的切换性能,也不影响其他内存的分配。
      在任务的执行时间片内,如果该任务被阻塞或者被更高优先级的任务抢占,那么将保存其时间片计数值,并且在其重新执行时恢复计数,对于抢占情况,当抢占的高优先级任务完成执行后,只要没有其他更高优先级任务抢占执行,那么原任务将继续执行,而对于任务阻塞情况,根据任务优先级将其放在队列尾部,在轮转调度时,禁止使用抢占,那么执行任务的时间片计数值维持不变。
        当出现一个系统时钟标记(tick)时,无论该任务在整个时间片内时是否执行,时间片计数值将自动增加,由于可能被高优先级的任务抢占,或者被中断服务程序占用了CPU处理时间,任务执行的全部CPU处理时间,可能与预先时间片有偏差。
 
 
       3、抢占上锁
        调用通过taskLock()和taskUnlock函数,可以禁止使用Win内核调度程序或启用内核调度程。当任务taskLock()函数时,将禁止使用调度程序,若该任务正在执行时,不会发生基于优先级的抢占
        但是,如果任务在执行中被阻塞或者挂起,调度程序将选择有资格执行且优先级较高的任务执行。当抢占上锁的任务被解除阻塞并且重新开始时,抢占再一次被禁止。
        注意,抢占上做只能阻止任务的上下文切换,并不禁止中断
        抢占上锁只能可以实现互斥操作,但需要保证抢占上锁时间尽可能短
 
        4、taskLock()和intLock()比较
        使用taskLock()函数时不产生互斥操作,一般说来,若由于硬件引起的中断,系统将最终返回到任务中,到那时一旦遇到阻塞,任务将会闭锁,因此从程序返回之前,需要调用taskUnlock()函数。
        当任务访问一个变量或者数据结构时,由于该变量或数据结构可能也会被中断程序访问,可以使用intLock()实现互斥。在但处理器的处理环境中,intLock()函数可以实现操作过程的最小化。操作过程保持最小化是最好的情况,这意味着只有一些代码没有函数调用过程,如果调用过程太长,将直接影响中断响应的时间,增加系统的不确定性。
        
        5、驱动程序支持的任务优先级
        所有应用任务的优先级应该在100--250之间,但是驱动程序支持的任务(与中断服务程序关联的任务)优先级能够位于51--99之间,这些任务是很重要的:例如:某个任务从芯片内复制数据失败,那么设备将不能获得数据,系统函数netTask的优先级是50,所以用户使用任务的优先级应分配在50以上,如果用户的任务出错,网络连接就会出现死机,并阻止Tornado工具进行调试.