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
沒有就運行空閒線程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章