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