Windows操作系統(tǒng)多核CPU內核線程管理方法
SYSTEM_PROCESS_INFORMATION 結構
進程線程的兩種數(shù)據(jù)結構
圖4 進程線程的兩種數(shù)據(jù)結構。
3.3 線程管理服務系統(tǒng)應用程序設計
進程管理服務系統(tǒng)應用程序是要通過調用Win 32子系統(tǒng)的API 函數(shù)DeviceIoControl 來向線程管理服務系統(tǒng)驅動程序發(fā)送IRP 的,然后在IRP 結束之后把驅動程序中讀出的所有有用進程線程信息填入到指定的內存中。這樣線程管理服務系統(tǒng)應用程序就可以根據(jù)所獲得的系統(tǒng)信息句柄來對線程CPU 親緣性屬性進行設置。首先為DeviceIoControl 中的InputBuffer 申請一段內存空間傳入給驅動程序,驅動程序讀取內核空間進程線程信息寫入到這段內存中,應用程序讀到信息并顯示給用戶。
在系統(tǒng)中應用程序為每一個CPU 維護一個結構體,內容包括該CPU 是否運行實時線程,該CPU 上運行的線程數(shù)(如果是實時線程CPU線程數(shù)為1),以及在此CPU上運行的線程結構數(shù)組的首地址。系統(tǒng)通過對此CPU 結構數(shù)組的解析來對線程進行管理。并通過DeviceIoControl函數(shù)把設置后的CPU 結構交給驅動程序內核。
3.4 修改Windows 內核結構體
在驅動程序讀回應用程序下用戶的設置結果后,就需要按照用戶的設定修改KTHREAD 下的Affinity 域的掩碼值了。首先要找到KTHREAD 的線性內存空間,PsGetCurrentProcess()內核函數(shù)可以返回內核下當前進程空間的E P R O C E S S 結構。E P R O C E S S 結構下的ActiveProcessLinks 域是LIST_ENTRY 結構,通過它可以遍歷所有的ETHREAD 結構,那么那到KTHREAD 下的Affinity 域就不難了,可以使用兩個循環(huán)嵌套來得到所有線程的Affinity 域并將其值設為應用程序中用戶的設定值。線程CPU 掩碼就被成功的修改了。當CPU 被設定為運行實時線程的CPU 時,在它上面運行的線程只能是一個實時線程,這時的運行線程數(shù)被設定為1; 當CPU被設定為非實時線程的時候,上面有可能除了任務線程運行之外,還有Windows 系統(tǒng)進程下的線程。
4 軟件使用及性能測試
4.1 驅動的加載及軟件的使用
首先需要把本系統(tǒng)的驅動sys 文件加載到Windows的服務管理器中,加載成功后打開應用程序,用戶可以通過應用程序中顯示出的當前系統(tǒng)內的進程和線程進行選擇,并在GUI 圖形界面中對其CPU 占用率及CPU親緣性進行設置。
4.2 設置 CPU 親緣性測試
測試運行在雙核CPU 的PC 機上,系統(tǒng)運行一個要測試的任務線程(任務線程為一個108 次加法運算),四個其它線程(為測試方便,設為while 循環(huán)線程),限定了循環(huán)線程的CPU 親緣性掩碼為0x0001,任務線程的CPU親緣性為0x0002,這樣任務線程與其它線程分別在兩個核上運行,分別測試了任務線程單獨運行,任務線程與其它線程不設定CPU 親緣性,任務線程與其它線程設定CPU 親緣性三種情況下下任務線程的運行總時間如表2 所示。
表2
從表2 分析, 設定任務線程的CPU 親緣性與其它線程所占用的CPU 分開,真正意義上的實現(xiàn)了任務的異步執(zhí)行,非常有效的提高了實時線程對CPU 資源的使用率。
5 結束語
本文分析了Windows 系統(tǒng)的內核進程線程調度表2CPU 親緣性設定三種情況下任務線程運行時間表機制,并在此基礎上設計了一種基于Windows 操作系統(tǒng)內核驅動的多核CPU 線程管理方法, 實現(xiàn)了這樣一個軟件系統(tǒng)。首先在Windows 內核層獲取系統(tǒng)進程線程信息,然后再把信息傳入應用層,由應用層上的應用程序根據(jù)獲取的信息句柄,對進程進行操作,用戶在圖形界面下按照仿真任務對CPU 資源的不同需求,進行相應的設置,可以為指定線程設置CPU 親緣性的功能。在一定程度上為Windows 系統(tǒng)下的任務合理地分配了CPU 資源,為對實時性要求較高的任務提供了一個可靠的運行環(huán)境。
評論