日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

11.Windows线程切换_线程优先级

發布時間:2025/3/20 windows 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 11.Windows线程切换_线程优先级 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(1)、當前線程主動調用API:
API函數->KiSwapThread->KiSwapContext->SwapContexti

(2)、當前線程時間片到期:
KiDispatchInterrupt->KiQuantumEnd->SwapContext

(3)、有備用線程(KPCR.PrcbData.NextThread)
KiDispatchInterrupt->SwapContext

在KiSwapThread與KiQuantumEnd函數中都是通過KiFindReadyThread來找下一個要切換的線程, KiFindReadyThread是根據什么條件來選擇下一個要執行的線程呢?

調度鏈表(32個)

kd> dd KiDispatcherReadyListHead 80554820 80554820 80554820 80554828 80554828 80554830 80554830 80554830 80554838 80554838 80554840 80554840 80554840 80554848 80554848 80554850 80554850 80554850 80554858 80554858 80554860 80554860 80554860 80554868 80554868 80554870 80554870 80554870 80554878 80554878 80554880 80554880 80554880 80554888 80554888 80554890 80554890 80554890 80554898 80554898

KiFindReadyThread查找方式:
按照優先級別進行查找: 31…30…29…28…

也就是說,在本次查找中,如果級別31的鏈表里面有線程,那么就不會查找級別為30的鏈表!

如何高效查找

調度鏈表有32個,每次都從頭開始查找效率太低,所以Windows都過一個 DWORD類型變量的變量來記錄:

當向調度鏈表(32個)中掛入或者摘除某個線程時,會判斷當前級別的鏈表是否為空,為空將DWORD變量對應位置0,否則置1。

.如下圖:

第30位與28位是有等待調度的線程的,這個變量:_kiReadySummary

向等待鏈表掛入或者刪除,它是根據判斷鏈表中兩個的成員是否一樣且是否與當前的地址相同來判斷它是否為空,如果兩成員一樣并且不等于當前地址說明這兩個中有一個等待調度的線程

多cpu會隨機尋找KiDispatcherReadyListHead指向的數組中的線程。線程可以綁定某個cpu (使用api: setThreadAffinityMask)

如果沒有就緒線程怎么辦
PrcbData:
+0x004 CurrentThread : Ptr32 KTHREAD //當前線程
+0x008 NextThread : Ptr32 KTHREAD //備用線程
+0x00C IdleThread :Ptr32 KTHREAD //空閑線程

如果cpu里沒有等待調度的線程它就會跑IdleThread這條線程,每一個KPCR里都會指定一個空閑線程。

CPU一但開始就不能停,就算沒有等待調度的線程,也要執行空閑線程。

總結

以上是生活随笔為你收集整理的11.Windows线程切换_线程优先级的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。