
wince系统
-
2023年3月20日发(作者:国税系统).
Wince系统任务调度机制
调度概述
调度是多任务操作系统中的一个根本概念。也是多任务操作系统内核必须提供的一种根
本效劳。调度的根本对象是任务〔有些操作系统中也称为进程或线程〕,调度负责为系统中
的任务分配当前CPU时间,决定当前CPU使用权由哪一个任务占用。调度大大简化了应
用程序的设计,用户可以将一个应用分解成不同的任务,各任务的执行由多任务操作系统内
核提供的调度效劳管理。
Wince是一个基于优先级可抢占及时间片轮转算法调度的多任务操作系统。这是wince
调度的根本机制。Wince调度的根本单位是线程。现对wince调度根本机制中涉及到的几
个概念作一些描述。
一、线程优先级
wince中的每个线程都有一个优先级。Wince优先级范围为0~255,其中0~247是
实时优先级,248~255一般为应用程序的优先级。一个线程创立时默认优先级是251。创
立线程时〔即在CreateThread〔〕函数创立进程是没方法设置进程的优先级〕没有方法直
接设置优先级,但是用户可以在进程范围内动态提升某线程的优先级,有两个API可用
SetThreadPriority和CeSetThreadPriority。前者可在248~255范围内调节,后者可提
升至实时线程。
.
二、可抢占
基于任务优先级的操作系统内核有两种形式:可抢占和不可抢占型〔有些地方也称可剥
夺和不可剥夺型〕
可抢占型内核:
最高优先级任务一旦进入就绪状态,那么立即获得CPU的使用权,当前运行任务的CPU
使用权被立即剥夺,而不管当前任务是否已主动放弃CPU的使用权,比方时间片到、阻塞、
挂起、睡眠等。
在可抢占型内核中,最高优先级任务由就绪态进入运行态的时间是可预知的,这使得
系统中任务的响应时间得以最优化。在任务响应时间对系统很重要的场合,一般都使用可抢
占内核的操作系统。Wince、Uc/os-II、LINUX等操作系统都是可抢占内核。
使用可抢占式内核时,应用程序中不应直接调用不可重入函数。调用不可重入函数时,
必须满足互斥条件。因为在优先级低任务和优先级高任务中可能会调用同一函数,如果该函
数不为可重入函数且在低优先级任务调用该函数时,被高优先级任务抢占CPU的使用权。
那么该函数中的数据可能被破坏。
不可抢占型内核:
每个任务都是主动放弃CPU的使用权,任务的CPU使用权是不可抢占的。当一个低
优先级任务当前占有CPU时,一个高优先级任务进入了就绪状态,那么该高优先级任务必
须等到占有CPU的低优先级任务主动放弃CPU使用权后,才能获得CPU使用权。
.
这种内核一般用于对系统响应时间不高,但任务的作业吞吐量大的操作系统内核。
三、时间片
时间片是操作系统分配给各个任务可占有CPU的时间。如果任务在时间片用完后还没
有结束,该任务被剥夺CPU的使用权并产生一次调度将CPU的占有权交给等待时间片最
久的任务,而被剥夺时间片的任务将被排在就绪队列的末尾,等待下一次时间片分配。
上述是一个根本的时间片轮转算法,该算法通常只适用于相同优先级任务之间。时间
片的长度是个头疼的问题。太短,那么将导致过多的任务切换,浪费CPU时间;太长,那
么导致任务的响应时间变长,使系统变得迟钝。
在wince中时间片的默认长度为100ms。OEM可在内核初始化时改变该值的大小,
分配给线程的时间片大小可用GetThreadQuantum〔〕函数获得,也可以通过
SetThreadQuantum〔〕函数来设置当前线程的时间片大小。
四、wince中线程状态
Wince中线程的状态有6中,分别是:
1)运行〔running〕:线程占有CPU,正在执行。对于单核处理器,处于运行状态的线
程永远只有一个;
2)就绪〔ready〕:线程在该状态下具备了运行条件,但并没有处于运行状态。如果就绪
.
的进程在调度时被选中,那么占有CPU进入就绪状态。处于就绪状态的线程可有多个。
如果在处于就绪状态的线程中,最高优先级的线程的优先级比当前处于运行状态的进程
优先级高,那么立即产生一次抢占调度。该进程立即进入运行状态,调度的对象准确的
说,应该是出于就绪状态的线程。
3)挂起(suspended):如果在调用CreateThread〔〕函数创立线程时指定了参数
CREATE_SUSPENDED或调用SuspendThread()函数可导致进程挂起。挂起的线程〔挂
起计数不为0〕不能进入就绪状态,更不能占有处理器。每个挂起的线程都有一个挂起
计数〔线程的挂起计数由操作系统维护〕,SuspendThread()函数使挂起计数加1,
ResumeThread〔〕函数是挂起计数减1。当进程的挂起计数为0时进入就绪状态。注:
处于运行态的进程在在进程内调用SuspendThread()函数,那么产生一次调度使该进
程进入挂起状态。如果SuspendThread()函数的参数hThread指定挂起的进程正处于
就绪状态那么该进程将进入挂起状态。
4)睡眠〔sleeping〕:在进程中调用Sleep()函数可使线程进入睡眠状态,在该状态的线
程不能进入就绪态,更不能占有处理器。Sleep()函数的参数dwMilliseconds指定线
程的睡眠时间,单位为ms。当进程的睡眠时间结束后,进程进入就绪状态。
Sleep(0):使当前进入放弃剩余的时间片,从运行态转入就绪态,等待下一次调度。
Sleep〔INFINITE〕:使当前进程一直睡眠,直到线程被终止或唤醒;
5)阻塞〔blocked〕:进程等待的共享资源暂时无法获得时,那么该进程进入就绪状态。
阻塞状态的进程不能进入就绪态,更不能占有处理器。当获得等待的共享资源后,线程
进入就绪态。线程中对共享资源的等待是通过WaitForSingleObject〔〕函数及
.
WaitForMultipleObjects〔〕函数来实现的。
6)终止〔terminated〕:进程运行结束。一般进程是一个WHILE(1)结构,这意味着它
本身永远也不会运行结束,要使一个进程终止必须调用ExitThread〔〕函数。注意并
不是关闭进程的句柄就会使进程终止。
各状态之间的转换如下:
五、wince的调度策略〔怎么调度〕
就
运睡挂
终阻
时
间
片
用
完
新
一
轮
调
度
挂起计数为0
SuspendThread()Sleep()
睡眠时间到
线程运行结束
WaitForSingleObject()
获得共享资源
.
总的来说wince的调度策略可以总结为:基于优先级可抢占及时间片轮转算法调度策
略。可以分两方面理解:
1)就绪队列中的最高优先级进程优先级比当前占有CPU的进程优先级高,那么立即产生
一次抢占调度,就绪队列中的最高优先级抢占CPU的使用权,进入运行状态;
2)就绪队列中的最高优先级进程优先级比当前占有CPU的进程优先级相同,那么执行时
间片轮转调度算法。如果一个进程的时间片用完或进程自身进入睡眠、阻塞或挂起状态,
那么立即产生一次调度,就绪队列中等待时间片时间最久的〔也是在就绪队列最前的〕
进程获得CPU使用权,进入运行状态。同时用完时间片的进程排在同优先级就绪队列
的最末位。如果一个进程的时间片被设为0,那么表示该线程的时间片为无穷大。
六、wince的调度时机〔什么时候调度〕
操作系统将在以下时机产生一次调度:
1、tick周期:也就是时钟调度周期,在wince下默认为1ms。不管什么情况,操作
系统总是每隔一个tick周期产生一次调度。
2、抢占:当一个优先级高于处于行态进程的优先级的进程进入就绪状态时,那么立即
产生一次调度。
3、时间片到:系统分配给处于运行态进程的时间片到时,产生一次调度。
4、状态转换:处于运行态的进程使自身进入睡眠、挂起、阻塞状态,那么产生一次调
.
度。
5、中断:发生中断或中断处理返回时,产生一次调度。