线程调度
- 上下文切换(Context Switch):Windows在可调度的线程内核对象中选择一个,并将上次保存在线程上下文中的值载入CPU寄存器
-
ResumeThreadSuspendThread可用于挂起与恢复线程。挂起线程是很危险的,比如这个线程正在访问堆,此时将这个线程挂起,那么会导致堆一直被锁定 - 创建线程的时候,传入
CREATE_SUSPENDED也可以挂起线程。线程一共能被挂起MAXIMUM_SUSPEND_COUNT(127,定义于WinNT.h中)次 -
Sleep:将自身挂起指定的时间,参考:https://docs.microsoft.com/en-us/windows/desktop/api/synchapi/nf-synchapi-sleep -
SwitchToThread:Causes the calling thread to yield execution to another thread that is ready to run on the current processor. 参考:https://docs.microsoft.com/en-us/windows/desktop/api/processthreadsapi/nf-processthreadsapi-switchtothread -
GetThreadTimes:用于查询线程创建时间、退出时间、内核时间、用户时间。类似的有GetProcessTimes - 高精度计时函数:
QueryPerformanceCounterQueryPerformanceFrequency
线程优先级
- 饥饿:较高优先级的线程占用了CPU时间,致使较低优先级的线程无法运行
- 较高优先级的线程总是会抢占较低优先级的线程,无论较低优先级的线程是否正在执行
-
SetPriorityClassGetPriorityClass设置、获取进程的优先级 -
SetThreadPriorityGetThreadPriority设置、获取线程的相对优先级 - 基本优先级:由线程的相对优先级加上线程所属进程的优先级确定
- 当系统检测到有线程处于饥饿状态3到4秒时,系统会提升饥饿线程的优先级,并允许其运行两个时间片,然后将其优先级恢复到原始状态
-
SetProcessPriorityBoost SetThreadPriorityBoost设置系统对线程优先级的动态提升,均有对应的Get*函数
关联性
- 软关联:系统将使线程在上一次运行的处理器上运行
- 让线程始终在同一处理器上运行有助于重用仍在处理器高速缓冲区中的数据
-
SetProcessAffinityMask用于设置进程的CPU集合,具有对应的Get*函数 -
SetThreadAffinityMask用于设置线程的CPU集合,具有对应的Get*函数