概述
- 在调度程序给另一个可调度线程分配CPU之前,CPU可以运行一个线程大约20ms。
- 这是在所有线程的优先级都相同的情况下。实际上,线程间的优先级是不同的。
- 每个线程都会被赋予0(最低)到31(最高)的优先级数。
当系统确定给哪个线程分配CPU时,它会首先查看优先级为31的线程,并以循环的方式调度。
如果有优先级为31的线程可供调度,那么系统就会将CPU分配给该线程。
在该线段的时间片结束以后,系统还会查看是否有另一个优先级为31的线程可调度,如果存在的话,该线程将获得CPU时间。 - 也就是说,只要有优先级为31的线程可供系统调度,系统就不会给0到30的优先级的线程分配CPU时间,这种情况叫做饥饿。
多处理机器上发生饥饿的可能性比较低。 - 从上面的描述中,表面上看起来低优先级的线程好像永远没有机会运行。但实际上,任何时刻系统中的大多数线程都是不可调度的。
- 较高优先级的线程总是会抢占较低优先级的线程,无论较低优先级的线程是否正在执行。
- 系统启动时,将创建一个页面清零线程的特殊线程,这个线程的优先级定位0,而且是整个系统中唯一一个优先级为0的线程。
它的作用是在没有其他进程需要执行的时候,将系统内存中的所有闲置页面清零。
抽象角度看优先级
优先级类
优先级 | 描述 |
real-time | 此进程中的线程必须立即响应事件,执行实时任务。此进程中的线程还会抢占操作系统中的组件的CPU时间。 |
high | 此进程中的线程必须立即响应事件,执行实时任务。(比如任务管理器的优先级) |
above normal | 此进程中的线程运行在normal和high之间。 |
normal | 此进程中线程无需特殊的调度。 |
below normal | 此进程中的线程运行在normal和high之间。 |
idle | 此进程中的线程在系统空闲时运行。 |
idle
- 非常适合只要系统什么都不做的时候运行。
normal
- 大多数进程都是normal优先级类的。
high
- 绝对有必要的时候才使用。
real-time
- 尽可能避免使用。
相对线程优先级
优先级 | 描述 |
time-critical | 对于real-time优先级类,线程是运行在最高的31级,其他的优先级类是15级 |
highest | 线程运行在高于normal之上两个级别 |
above normal | 线程运行在高于normal之上一个级别 |
normal | 线程运行在进程normal级别上 |
below normal | 线程运行在低于normal之下一个级别 |
lowest | 线程运行在低于normal之下两个级别 |
idle | 对于real-time优先级类,线程运行在16,所有其他优先级运行在1 |
进程优先级和相对线程优先级的映射:
相对线程|进程(优先级) | idle | below normal | normal | above normal | high | real-time |
time-critical | 15 | 15 | 15 | 15 | 15 | 31 |
highest | 6 | 8 | 10 | 12 | 15 | 26 |
above normal | 5 | 7 | 9 | 11 | 14 | 25 |
normal | 4 | 6 | 8 | 10 | 13 | 24 |
below normal | 3 | 5 | 7 | 9 | 12 | 23 |
lowest | 2 | 4 | 6 | 8 | 11 | 22 |
idle | 1 | 1 | 1 | 1 | 1 | 16 |
- 总结就是,进程都属于某个优先级类,另外可以指定进程中线程的相对优先级。
- 一个normal进程中的normal线程的优先级是8。
大多数进程都是normal优先级的,而大多数线程都是normal优先级的,所以系统中大多数线程的优先级都是8。
优先级编程
函数
- 可以在CreateProcess时,在fdwCreate参数处指定需要的优先级。
- 可以通过给SetPriorityClass传进程句柄改变进程优先级
1 2 |
BOOL SetPriorityClass(HANDLE hProcess, DWORD fdwPriority); |
- 获取进程优先级
1 |
DWORD GetPriorityClass(HANDLE hProcess); |
- 设置线程优先级
1 2 |
BOOL SetThreadPriority(HANDLE hThread, int nPriority); |
- 获取线程优先级
1 |
int GetThreadPriority(HANDLE hThread); |
动态提升线程优先级
- 系统通过线程的相对优先级加上线程所属的进程的优先级来确定线程的优先级别。(线程的基本优先级别)
- 线程的当前优先级不会低于线程的基本优先级别。
- 系统只提升优先级值在1到15之间的线程。
这个范围被称为动态优先级范围。 - 禁止系统对我们的线程优先级进行动态提升
1 2 3 4 5 |
BOOL SetProcessPriorityBoost(HANDLE hProcess, BOOL bDisablePriorityBoost); BOOL SetThreadPriorityBoost(HANDLE hThread, BOOL hDisablePriorityBoost); |
关联性
软关联
- Windows Vista在给线程分配处理器时,如果其他因素都一样,系统将使线程在上一次运行的处理器上运行。
让线程始终在同一个处理器上运行有助于重用仍在处理器高速缓存中的数据。
硬关联
- 控制CPU让哪些CPU运行特定的线程。
称为硬关联。 - GetSystemInfo查询CPU的数量
- 限制某些线程只在可用的CPU的一个子集上运行:
- hProcess代表要设置的进程
1 2 3 4 5 6 |
BOOL SetProcessAffinityMask(HADNLE hProcess, DWORD_PTR dwProcessAffinityMask); BOOL GetProcessAffinityMask(HANDLE hProcess, PDWORD_PTR pdwProcessAffinityMask, PDWORD_PTR pdwSystemAffinityMask); |
- 分别设置各线程的关联性掩码
1 2 3 4 5 6 7 8 9 |
DWORD_PTR SetThreadAffinityMask(HANDLE hThread, DWORD_PTR dwThreadAffinityMask); // eg. SetThreadAffinityMask(hThread0, 0x00000001); SetThreadAffinityMask(hThread1, 0x0000000E); SetThreadAffinityMask(hThread2, 0x0000000E); SetThreadAffinityMask(hThread3, 0x0000000E); |
- 给线程设置一个理想的CPU
1 2 |
DWORD SetThreadIdealProcessor(HANDLE hThread, DWORD dwIdealProcessor); |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ X86_64汇编学习记述四08/09
- ♥ Soui七06/02
- ♥ Bkwin一12/01
- ♥ X86_64汇编学习记述三08/08
- ♥ Windows 核心编程 _ 线程调度07/07
- ♥ 51CTO:Linux C++网络编程五08/20