10 线程优先级

1、线程的调度链表(32个)
kd> dd KiDispatcherReadyListHead
8055bba0 8055bba0 8055bba0 8055bba8 8055bba8
8055bbb0 8055bbb0 8055bbb0 8055bbb8 8055bbb8
8055bbc0 8055bbc0 8055bbc0 8055bbc8 8055bbc8
8055bbd0 8055bbd0 8055bbd0 8055bbd8 8055bbd8
8055bbe0 866f6080 866f6080 8055bbe8 8055bbe8
8055bbf0 8055bbf0 8055bbf0 8055bbf8 8055bbf8
8055bc00 8055bc00 8055bc00 8055bc08 8055bc08
8055bc10 8055bc10 8055bc10 8055bc18 8055bc18

KiFindReadyThread查找方式:
按优先级进行查找:31…30 …29…28…27…
也就是说在本次查找中级别31的链表中有线程就不会查找30的线程的链表

2、如何高效查找
调度链表有32个,每次都从头开始查找效率很低,所以windows通过定义一个DWORD变量来记录:
当调度链表(32个)中挂入或者摘除某个线程时,会判断当前级别的链表是否为空,为空将DWORD变量对应的位置0,否则置1
如下图:
在这里插入图片描述
这个变量:kiReadySummary
kd> dd kiReadySummary
805530ec 00000100
多个CPU会随机寻找KiDispatcherReadyListHead指向的数组中的线程。线程可以绑定某个CPU(使用API:setThreadAffinityMask)

3、如果没有就绪线程
kd> dt _KPRCB
ntdll!_KPRCB
+0x000 MinorVersion : Uint2B
+0x002 MajorVersion : Uint2B
+0x004 CurrentThread : Ptr32 _KTHREAD
+0x008 NextThread : Ptr32 _KTHREAD
+0x00c IdleThread : Ptr32 _KTHREAD
没有就运行空闲线程

猜你喜欢

转载自blog.csdn.net/lifeshave/article/details/87445116