- UID
- 852722
|
2.2 多任务调度
两种方式: 优先抢占和轮转调度(Preemptive Priority,Round-Robin Scheduling).
优先抢占(Preemptive Priority): 每一个任务都有一个优先级,系统核心保证优先级最高的任务运行于CPU.如果有任务优先级高于当前的任务优先级,系统立刻保存当前任务的上下文,切换到优先级高的上下文.
Priority Preemption
抢占(Preemptive): 抢占是指当系统处于核心态运行时, 允许任务的重新调度。换句话说就是指正在执行的任务可以被打断,让另一个任务运行。抢占提高了应用对异步事件的响应性能力。操作系统内核可抢占,并不是说任务调度在任何时候都可以发生。例如当一个任务正在通过一个系统调用访问共享数据时,重新调度和中断都被禁止.
任务上下文(Task Context): 任务上下文是指任务运行的环境。例如,针对X86的CPU,任务上下文可包括程序计数器、堆栈指针、通用寄存器的内容.
上下文切换(Context Switching): 多任务系统中,上下文切换是指CPU的控制权由运行任务转移到另外一个就绪任务时所发生的事件,当前运行任务转为就绪(或者挂起、删除)状态,另一个被选定的就绪任务成为当前任务。上下文切换包括保存当前任务的运行环境,恢复将要运行任务的运行环境。上下文的内容依赖于具体的CPU.
轮转调度(Round-Robin Scheduling):使所有相同优先级,状态为Ready的任务公平分享CPU(分配一定的时间间隔,使个任务轮流享有CPU).
Round-Robin Scheduling
系统由256个优先级,从0到255,0为最高,255为最低. 任务在被创建时设定了优先级.也可用TaskPrioritySet ( ) 来改变任务优先级.
任务的主要状态: READY,PEND,DELAY,SUSPEND...
Ready-------->Pended -----------SemTake( )/MsgQReceive( )-其他任务
Ready-------->Delayed-----------TaskDelay( )
Ready-------->Suspended---------TaskSuspend( )
Pended------->Ready-------------SemaGive( )/MsgQSend( )-其他任务
Pended------->Suspended---------TaskSuspend( )
Delayed------>Ready-------------Expired Delay
Delayed------>Suspended---------TaskSuspend( )
Suspended---->Ready-------------TaskResume( )/TaskActivate( )
Suspended---->Pended------------TaskResume( )
Suspended---->Delayed-----------TaskResume( )
轮转调度 (Round-Robin): 轮转调度可以扩充到优先抢占方式中,当多个任务优先级相同的情况下,轮转调度算法使任务按平等的时间片运行于CPU,共享CPU.避免一个任务长时间占用CPU,而导致其他任务不能运行.可以用 KernelTimeSlice( ) 来定义时间长度.
TaskLock ( )和 TaskUnlock ( ) 用来取消优先抢占方式 和恢复优先抢占方式.
注意: 一个任务可以调用TaskDelete ( ) 删除另一个任务,但是如果一个当前正在运行的任务被删除后,该任务的内存没有释放,而其他任务不知道,依然在等待,结果导致系统Stop.用 TaskSafe ( ) 和 TaskUnsafe ( ) 来保证正在运行的任务不被删除.
用法如下:
TaskSafe ();
SemTake (SemId, WAIT_FOREVER);
/* Block Until Semaphore Available */
. . . . Critical Region .
SemGive (SemId); SemGive (SemId);
/* Release Semaphore */
TaskUnsafe (); |
|