线程调度

 

一、暂停计数

在线程内核对象的内部有一个值,用于指明线程的暂停计数。当调用CreateProcessCreateThread函数时,就创建了线程的内核对象,并将暂停计数初始化为1,防止被CPU调度。在线程初始化好之后,如果有CREATE_SUSPENDED标志,就退出创建函数。否则,将暂停计数递减为0.

二、恢复运行

         DWORD ResumeThreadHANDLE hThread);成功:返回前一个暂停计数,否则返回0xFFFFFFFF

         单个线程可以暂停若干次,若果一个线程暂停了3次,它必须恢复3次,才可以被CPU调度。

三、暂停运行

         DWORD SuspendThreadHANDLE hThread);返回的是线程的前一个暂停计数。线程暂停的最多次数可以是MAXIMUM_SUSPEND_COUNT次。

四、睡眠方式

         VOID SleepDWORD dwMilliseconds);

n          调用Sleep,可使线程自愿放弃它剩余的时间片。

n          系统将在大约的指定毫秒数内使线程不可调度。

n          可以传递INFINITE参数,最好不要这样用,应退出线程,并还原它的堆栈和内核对象。

n          可以传递0,这将告诉系统,调用线程将释放剩余的时间片。

五、转换到另一个线程

         BOOL SwitchToThread();

         当调用这个函数的时候,系统要查看是否存在一个迫切需要C P U时间的线程。如果没有线程迫切需要C P U时间,S w i t c h To T h r e a d就会立即返回。如果存在一个迫切需要C P U时间的线程,S w i t c h To T h r e a d就对该线程进行调度(该线程的优先级可能低于调用S w i t c h To T h r e a d的线程)。这个迫切需要C P U时间的线程可以运行一个时间段,然后系统调度程序照常运行。

         该函数允许一个需要资源的线程强制另一个优先级较低、而目前却拥有该资源的线程放弃该资源。如果调用S w i t c h To T h r e a d函数时没有其他线程能够运行,那么该函数返回FA L S E,否则返回一个非0值。

     调用S w i t c h To T h r e a d函数与调用S l e e p是相似的,并且传递给它一个 0 m s的超时。差别是S w i t c h To T h r e a d允许优先级较低的线程运行。即使低优先级线程迫切需要C P U时间S l e e p也能够立即对调用线程重新进行调度

六、线程运行时间

     BOOL GetThreadTimesHANDLE hThread

PFILETIME pftCreationTime

PFILETIME pftExitTime

PFILETIME pftKernelTime

PFILETIME pftUserTime);

七、线程的优先级

     每个线程都会被赋予一个从0(最低)到31(最高)的优先级号码。

     高优先级线程将抢在低优先级线程之前运行,不管低优先级线程正在运行什么。例如,如果一个优先级为5的线程正在运行,系统发现一个高优先级的线程准备要运行,那么系统就会立即暂停低优先级线程的运行(即使它处于它的时间片中),并且将C P U分配给高优先级线程,使它获得一个完整的时间片。还有,当系统引导时,它会创建一个特殊的线程,称为0页线程。该线程被赋予优先级0,它是整个系统中唯一的一个在优先级0上运行的线程。当系统中没有任何线程需要执行操作时,0页线程负责将系统中的所有空闲R A M页面置0

八、Windows支持6个优先级类:空闲、低于正常、正常、高于正常、高和实时(THREAD_PRIORITY_IDLE, THREAD_PRIORITY_LOWEST, THREAD_PRIORITY_BELOW_NORMAL, THREAD_PRIORITY_NORMAL, THREAD_PRIORITY_HIGHESTTHREAD_PRIORITY_TIME_CRITICAL)。

九、设置和获得线程的相对优先级

     当一个线程刚刚创建时,它的相对优先级总是设置为正常优先级。CreateThread没有为调用者提供一个设置新线程的相对优先级的方法。

BOOL SetThreadPriorityHANDLE hThreadint nPriority);

int GetThreadPriorityHANDLE hThread);

    

十、关闭线程句柄

      关闭线程句柄并不是结束或移除线程对象。

十一、亲缘性

      按照默认设置,当系统将线程分配给处理器时, Windows 2000使用软亲缘性来进行操作。这意味着如果所有其他因素相同的话,它将设法在它上次运行的那个处理器上运行线程。让线程留在单个处理器上,有助于重复使用仍然在处理器的内存高速缓存中的数据。

     Windows 2000允许设置进程和线程的亲缘性。换句话说,可以控制哪个C P U能够运行某些线程。这称为硬亲缘性。

     BOOL SetProcessAffinityMask(HANDLE hProcess, DWORD_PTR dwProcessAffinityMask)

     hProcess:指明要影响的是哪个进程

     dwProcessAffinityMask:位屏蔽,指明线程可以在哪些CPU上运行。

     注意,子进程可以继承进程的亲缘性。

     BOOL GetProcessAffinityMaskHANDLE hProcessPDWORD_PTR pdwProcessAffinityMaskPWORD_PTR pdwSystemAffinityMask);

     DWORD_PTR SetThreadAffinityMaskHANDLE hThreadDWORD_PTR dwThreadAffinityMask);

     线程的亲缘性屏蔽必须是进程的亲缘性屏蔽的相应子集。

 

     DWORD SetThreadIdealProcessorHANDLE hTreadDWORD dwIdealProcessor);

     dwIdealProcessor函数不是个位屏蔽函数,而是一个整数,用于指明供线程使用的首选CPU

 

十二、CONTEXT结构包含了特定处理器的寄存器数据。

BOOL GetThreadContextHANDLE hThreadPCONTEXT pContext);在调用前应先调用SuspendThread,否则线程可能被调度。

BOOL SetThreadContextHANDLE hThreadCONST CONTEXT *pContext);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值