版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
精品文檔-下載后可編輯Windows操作系統(tǒng)多核CPU內(nèi)核線程管理方法-基礎(chǔ)電子摘要:Windows是采用CPU時(shí)間片輪轉(zhuǎn)多任務(wù)分配機(jī)制的非實(shí)時(shí)操作系統(tǒng),無法滿足實(shí)時(shí)性要求比較高的任務(wù)需要。而隨著CPU技術(shù)的快速發(fā)展,當(dāng)前市場(chǎng)上雙核甚至多核CPU已成為主流,這使得在Windows平臺(tái)上用多核CPU的某些核獨(dú)立執(zhí)行任務(wù),從而有效地提高軟件的實(shí)時(shí)性成為可能。本文介紹一種在Windows內(nèi)核模式下編寫Windows驅(qū)動(dòng)程序,有效分配多核CPU資源從而提高軟件實(shí)時(shí)性的方法。
1引言
本文分析了Windows系統(tǒng)的進(jìn)程調(diào)度機(jī)制,并設(shè)計(jì)了一種基于Windows操作系統(tǒng)內(nèi)核驅(qū)動(dòng)的多核CPU線程管理方法,實(shí)現(xiàn)了一個(gè)基于Windows內(nèi)核驅(qū)動(dòng)的線程管理服務(wù)系統(tǒng),它能讓用戶根據(jù)每一個(gè)任務(wù)線程對(duì)CPU資源的需要程度和對(duì)實(shí)時(shí)性的要求,在多核CPU上合理為線程分配CPU核。
圖1Windows內(nèi)核調(diào)度結(jié)構(gòu)體關(guān)系圖
2Windows系統(tǒng)的進(jìn)程調(diào)度方法分析
WindowsNT中的每一個(gè)進(jìn)程都是EPROCESS結(jié)構(gòu)體。此結(jié)構(gòu)體中除了進(jìn)程的屬性之外還引用了其它一些與實(shí)現(xiàn)進(jìn)程緊密相關(guān)的結(jié)構(gòu)體。例如,每個(gè)進(jìn)程都有一個(gè)或幾個(gè)線程,線程在系統(tǒng)中就是ETHREAD結(jié)構(gòu)體。簡要描述一下存在于這個(gè)結(jié)構(gòu)體中的主要的信息,這些信息都是由對(duì)內(nèi)核函數(shù)的研究而得知的。首先,結(jié)構(gòu)體中有KPROCESS結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體中又有指向這些進(jìn)程的內(nèi)核線程(KTHREAD)鏈表的指針(分配地址空間),基優(yōu)先級(jí),在內(nèi)核模式或是用戶模式執(zhí)行進(jìn)程的線程的時(shí)間,處理器affinity(掩碼,定義了哪個(gè)處理器能執(zhí)行進(jìn)程的線程),時(shí)間片值。在ETHREAD結(jié)構(gòu)體中還存在著這樣的信息:進(jìn)程ID、父進(jìn)程ID、進(jìn)程映象名。
在EPROCESS結(jié)構(gòu)體中還有指向PEB的指針。
ETHREAD結(jié)構(gòu)體還包含有創(chuàng)建時(shí)間和退出時(shí)間、進(jìn)程ID和指向EPROCESS的指針,啟動(dòng)地址,I/O請(qǐng)求鏈表和KTHREAD結(jié)構(gòu)體。在KTHREAD中包含有以下信息:內(nèi)核模式和用戶模式線程的創(chuàng)建時(shí)間,指向內(nèi)核堆?;泛晚旤c(diǎn)的指針、指向服務(wù)表的指針、基優(yōu)先級(jí)與當(dāng)前優(yōu)先級(jí)、指向APC的指針和指向TEB的指針。
KTHREAD中包含有許多其它的數(shù)據(jù),通過觀察這些數(shù)據(jù)可以分析出KTHREAD的結(jié)構(gòu)。圖1描述了這些結(jié)構(gòu)體之間的關(guān)系。
通過遍歷KPROCESS結(jié)構(gòu)體中的ETHREAD,找到系統(tǒng)中當(dāng)前所有的KTHREAD結(jié)構(gòu),這個(gè)結(jié)構(gòu)中的偏移量為0x124處的Affinity域(WindowsXPsp3)即為設(shè)置CPU親緣性掩碼的內(nèi)存地址。在此重點(diǎn)解釋CPU親緣性的概念,CPU親緣性就是指在系統(tǒng)中能夠?qū)⒁粋€(gè)或多個(gè)進(jìn)程或線程綁定到一個(gè)或多個(gè)處理器上運(yùn)行,這是期待已久的特性。也就是說:“在1號(hào)處理器上一直運(yùn)行該程序”或者是“在所有的處理器上運(yùn)行這些程序,而不是在0號(hào)處理器上運(yùn)行”。然后,調(diào)度器將遵循該規(guī)則,程序僅僅運(yùn)行在允許的處理器上。在Windows操作系統(tǒng)上,給程序員設(shè)定CPU親緣性的接口是用一個(gè)32位的雙字型數(shù)表示的,它被稱為親緣性掩碼(AffinitybitMask)。親緣性掩碼是一系列的二進(jìn)制位,每一位代表一個(gè)CPU單元是否可執(zhí)行當(dāng)前任務(wù)。例如一個(gè)在具有四個(gè)CPU的PC機(jī)上(或四核CPU),親緣性掩碼的形式的二進(jìn)制數(shù)如下式所示:
0000000000000000000000000000XXXXB
其中自右向左,每一位代表0到31號(hào)CPU是否可用,由于本機(jī)只有四個(gè)CPU,所以只有前四個(gè)位可用,X為1則代表當(dāng)前任務(wù)可執(zhí)行在此位代表的CPU上,X為0則代表當(dāng)前任務(wù)不可執(zhí)行在此位代表的CPU上,例如:
00000000000000000000000000000010B
代表當(dāng)前任務(wù)只能執(zhí)行在1號(hào)CPU上(CPU下標(biāo)記數(shù)從0開始),又如0x00000004代表當(dāng)前任務(wù)只能執(zhí)行在2號(hào)CPU上,0x00000003代表當(dāng)前任務(wù)可以運(yùn)行在0號(hào)和1號(hào)CPU上。
Windows的進(jìn)程調(diào)度代碼是在它的System進(jìn)程下的,所以它不屬于任何用戶進(jìn)程上下文。調(diào)度代碼在適當(dāng)?shù)臅r(shí)機(jī)會(huì)切換進(jìn)程上下文,這里的切換進(jìn)程上下文是指進(jìn)程環(huán)境的切換,包括內(nèi)存中的可執(zhí)行程序,提供程序運(yùn)行的各種資源.進(jìn)程擁有虛擬的地址空間,可執(zhí)行代碼,數(shù)據(jù),對(duì)象句柄集,環(huán)境變量,基礎(chǔ)優(yōu)先級(jí),以及工作集等的切換。而Windows的調(diào)度單位是線程,只有線程才是真正的執(zhí)行體,進(jìn)程只是線程的容器。Windows的調(diào)度程序在時(shí)間片到期,或有切換線程指令執(zhí)行(如Sleep,KeWaitForSingleObject等函數(shù))時(shí),將會(huì)從進(jìn)程線程隊(duì)列中找到下一個(gè)要調(diào)度的線程執(zhí)行體,并裝入到KPCR(Kernel'sProcessorControlRegion,內(nèi)核進(jìn)程控制區(qū)域)結(jié)構(gòu)中,CPU根據(jù)KPCR結(jié)構(gòu)中的KPRCB結(jié)構(gòu)執(zhí)行線程執(zhí)行體代碼。而在多核CPU下,當(dāng)Windows調(diào)度代碼執(zhí)行時(shí),從當(dāng)前要調(diào)度執(zhí)行的KTHREAD結(jié)構(gòu)中取出Affinity,并與當(dāng)前PC機(jī)上的硬件配置數(shù)據(jù)中的CPU掩碼作與操作,結(jié)果寫入到指定的CPU,例如雙核CPU的設(shè)備掩碼為0x03,如果當(dāng)前KTHREAD里的Affinity為0x01,那么0x010x03=0x01,這樣執(zhí)行體線程會(huì)被裝入CPU1的KPRCB結(jié)構(gòu)中得以執(zhí)行,調(diào)度程序不會(huì)把這個(gè)線程交給CPU2去執(zhí)行。此過程如圖2所示。這就是為線程選擇指定CPU核的原理。
圖2Windows內(nèi)核親緣性調(diào)度原理圖。
那么控制線程在指定CPU上運(yùn)行的突破口就是修改Windows內(nèi)核結(jié)構(gòu)體KTHREAD下的Affinity域。然而Windows內(nèi)核結(jié)構(gòu)被放在虛擬內(nèi)存線性地址的高2G(不同版本W(wǎng)indows下也可能是1G)地址空間,用戶模式下的應(yīng)用程序是無法訪問這段內(nèi)存空間的,所以必須編寫Windows驅(qū)動(dòng)程序,來訪問Windows內(nèi)核內(nèi)存空間,這也是本文將要描述的重點(diǎn)。
3線程管理服務(wù)系統(tǒng)
整個(gè)系統(tǒng)的結(jié)構(gòu)如圖3所示。該系統(tǒng)由兩大部分組成,分別是內(nèi)核模式下的管理服務(wù)系統(tǒng)設(shè)備驅(qū)動(dòng)程序,和用戶模式下的管理服務(wù)系統(tǒng)應(yīng)用程序。管理服務(wù)系統(tǒng)應(yīng)用程序通過調(diào)用Win32子系統(tǒng)API,向內(nèi)核下的管理服務(wù)系統(tǒng)驅(qū)動(dòng)程序傳遞IRP,內(nèi)核收到IRP后,跟據(jù)收到的IRP的內(nèi)部信息,執(zhí)行相應(yīng)的派遣函數(shù),對(duì)相應(yīng)內(nèi)存進(jìn)行讀寫,從而給管理服務(wù)系統(tǒng)應(yīng)用程序提供可用的系統(tǒng)信息。
圖3管理系統(tǒng)總體結(jié)構(gòu)圖。
3.1內(nèi)核模式下讀取系統(tǒng)信息
線程管理服務(wù)系統(tǒng)驅(qū)動(dòng)程序中,讀取系統(tǒng)信息的方法用到了微軟沒有公開文檔的內(nèi)核服務(wù)函數(shù),ZwQuerySystemInformATIon,這個(gè)函數(shù)被封裝在ntdll.dll模塊中,通過鏈接ntdll.lib可得到此函數(shù)地址。通過一個(gè)枚舉量SystemProcessInformation來得到進(jìn)程線程相關(guān)信息,填入到第二個(gè)輸入?yún)?shù)SYSTEM_PROCESS_INFORMATION結(jié)構(gòu)中,這樣就獲得了當(dāng)前系統(tǒng)關(guān)于進(jìn)程線程的信息。
3.2內(nèi)核模式下枚舉系統(tǒng)進(jìn)程線程
SYSTEM_PROCESS_INFORMATION結(jié)構(gòu)中存儲(chǔ)了進(jìn)程及其線程的所有相關(guān)信息,表1列出了它的具體內(nèi)容,包括結(jié)構(gòu)內(nèi)域的地址偏移,數(shù)據(jù)類型和描述。
SYSTEM_PROCESS_INFORMATION的個(gè)DWORD型是下一個(gè)進(jìn)程SYSTEM_PROCESS_INFORMATION相對(duì)于當(dāng)前結(jié)構(gòu)地址的偏移量,可以通過地址偏移來遍歷所有的進(jìn)程結(jié)構(gòu),當(dāng)遇到某一個(gè)進(jìn)程結(jié)構(gòu)的0x0000處的DWORD型值為0時(shí),說明這個(gè)結(jié)構(gòu)體是系統(tǒng)內(nèi)一個(gè)結(jié)構(gòu)體。線程管理服務(wù)在它的派遣函數(shù)中通過這種方式遍歷所有進(jìn)程,從中提取有用的信息,填入兩個(gè)自定義結(jié)構(gòu)體中。如圖4所示,描述了一個(gè)具有兩個(gè)線程的進(jìn)程的數(shù)據(jù)結(jié)構(gòu),首先在MY_PROCESS_INFO結(jié)構(gòu)中填入進(jìn)程的相關(guān)信息,然后根據(jù)此進(jìn)程所有的線程數(shù),向系統(tǒng)申請(qǐng)足夠大的分頁內(nèi)存空間,PVOID型指針指向的是個(gè)線程結(jié)構(gòu)所在的地址空間,然后向線程結(jié)構(gòu)體中_MY_THREAD_INFO中填入線程信息,再由線程結(jié)構(gòu)體中的PVOID型指針指向第二個(gè)線程結(jié)構(gòu)體所在的地址空間,以此類推,一個(gè)線程結(jié)構(gòu)體的PVOID型指針指向NULL。這樣一個(gè)過程描述了一個(gè)進(jìn)程及其所屬的所有線程的枚舉過程,通過對(duì)所有進(jìn)程的遍歷,可以得到系統(tǒng)中的一個(gè)完整的進(jìn)程線程表,存在一段分頁內(nèi)存中,這樣在應(yīng)用程序中便可以得到這些信息。
表1SYSTEM_PROCESS_INFORMATION結(jié)構(gòu)
圖4進(jìn)程線程的兩種數(shù)據(jù)結(jié)構(gòu)。
3.3線程管理服務(wù)系統(tǒng)應(yīng)用程序設(shè)計(jì)
進(jìn)程管理服務(wù)系統(tǒng)應(yīng)用程序是要通過調(diào)用Win32子系統(tǒng)的API函數(shù)DeviceIoControl來向線程管理服務(wù)系統(tǒng)驅(qū)動(dòng)程序發(fā)送IRP的,然后在IRP結(jié)束之后把驅(qū)動(dòng)程序中讀出的所有有用進(jìn)程線程信息填入到指定的內(nèi)存中。這樣線程管理服務(wù)系統(tǒng)應(yīng)用程序就可以根據(jù)所獲得的系統(tǒng)信息句柄來對(duì)線程CPU親緣性屬性進(jìn)行設(shè)置。首先為DeviceIoControl中的InputBuffer申請(qǐng)一段內(nèi)存空間傳入給驅(qū)動(dòng)程序,驅(qū)動(dòng)程序讀取內(nèi)核空間進(jìn)程線程信息寫入到這段內(nèi)存中,應(yīng)用程序讀到信息并顯示給用戶。
在系統(tǒng)中應(yīng)用程序?yàn)槊恳粋€(gè)CPU維護(hù)一個(gè)結(jié)構(gòu)體,內(nèi)容包括該CPU是否運(yùn)行實(shí)時(shí)線程,該CPU上運(yùn)行的線程數(shù)(如果是實(shí)時(shí)線程CPU線程數(shù)為1),以及在此CPU上運(yùn)行的線程結(jié)構(gòu)數(shù)組的首地址。系統(tǒng)通過對(duì)此CPU結(jié)構(gòu)數(shù)組的解析來對(duì)線程進(jìn)行管理。并通過DeviceIoControl函數(shù)把設(shè)置后的CPU結(jié)構(gòu)交給驅(qū)動(dòng)程序內(nèi)核。
3.4修改Windows內(nèi)核結(jié)構(gòu)體
在驅(qū)動(dòng)程序讀回應(yīng)用程序下用戶的設(shè)置結(jié)果后,就需要按照用戶的設(shè)定修改KTHREAD下的Affinity域的掩碼值了。首先要找到KTHREAD的線性內(nèi)存空間,PsGetCurrentProcess()內(nèi)核函數(shù)可以返回內(nèi)核下當(dāng)前進(jìn)程空間的EPROCESS結(jié)構(gòu)。EPROCESS結(jié)構(gòu)下的ActiveProcessLinks域是LIST_ENTRY結(jié)構(gòu),通過它可以遍歷所有的ETHREAD結(jié)構(gòu),那么那到KTHREAD下的Affinity域就不難了,可以使用兩個(gè)循環(huán)嵌套來得到所有線程的Affinity域并將其值設(shè)為應(yīng)用程序中用戶的設(shè)定值。線程CPU掩碼就被成功的修改了。當(dāng)CPU被設(shè)定為運(yùn)行實(shí)時(shí)線程的CPU時(shí),在它上面運(yùn)行的線程只能是一個(gè)實(shí)時(shí)線程,這時(shí)的運(yùn)行線程數(shù)被設(shè)定為1;當(dāng)CPU被設(shè)定為非實(shí)時(shí)線程的時(shí)候,上面有可能除了任務(wù)線程運(yùn)行之外,還有Windows系統(tǒng)進(jìn)程下的線程。
4軟件使用及性能測(cè)試
4.1驅(qū)動(dòng)的加載及軟件的使用
首先需要把本系統(tǒng)的驅(qū)動(dòng)sys文件加載到Windows的服務(wù)管理器中,加載成功后打開應(yīng)用程序,用戶可以通過應(yīng)用程序中顯示出的當(dāng)前系統(tǒng)內(nèi)的進(jìn)程和線程進(jìn)行選擇,并在GUI圖形界面中對(duì)其CPU占用率及CPU親緣性進(jìn)行設(shè)置。
4.2設(shè)置CPU親緣性測(cè)試
測(cè)試運(yùn)行在雙核CPU的PC機(jī)上,系統(tǒng)運(yùn)行一個(gè)要測(cè)試的任務(wù)線程(任務(wù)線程為一個(gè)108次加法運(yùn)算),四個(gè)其它線程(為測(cè)試方便,設(shè)為while循環(huán)線程),限定了循環(huán)線程的CPU親緣性掩碼為0x0001,任務(wù)線程的CPU親緣性為0x0002,這樣任務(wù)線程與其它線程分別在兩個(gè)核上運(yùn)行,分別測(cè)試了任務(wù)線程單獨(dú)運(yùn)行,任務(wù)線程與其它線程不設(shè)定CPU親緣性,任務(wù)線程與其它線程設(shè)定CPU親緣性三種情況下下任務(wù)線程的運(yùn)行總時(shí)間如表2所示。
從表2分析,設(shè)定任務(wù)線程的CPU親緣性與其它線程所占用的CPU分開,真正意義上的實(shí)現(xiàn)了任務(wù)的異步執(zhí)行,非常有效的提高了實(shí)時(shí)線程對(duì)CPU資源的使用率。
5結(jié)束語
本文分析了Window
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年人教版九年級(jí)物理下冊(cè)月考試卷
- 隱式成員函數(shù)調(diào)用策略-洞察分析
- 2025年北師大新版七年級(jí)生物上冊(cè)階段測(cè)試試卷含答案
- 2025年度品牌服裝線上線下銷售合同范本4篇
- 2025年外研版九年級(jí)科學(xué)下冊(cè)月考試卷
- 2025年北師大版七年級(jí)化學(xué)下冊(cè)階段測(cè)試試卷
- 2025年華東師大版八年級(jí)數(shù)學(xué)上冊(cè)階段測(cè)試試卷
- 2025年浙教版八年級(jí)化學(xué)上冊(cè)月考試卷
- 2025年滬科新版八年級(jí)科學(xué)上冊(cè)月考試卷
- 二零二五年度網(wǎng)絡(luò)劇編劇助理及劇本創(chuàng)作與改編合同3篇
- 2024年采購員年終總結(jié)
- 2024年新疆區(qū)公務(wù)員錄用考試《行測(cè)》試題及答案解析
- 肺動(dòng)脈高壓的護(hù)理查房課件
- 2025屆北京巿通州區(qū)英語高三上期末綜合測(cè)試試題含解析
- 公婆贈(zèng)予兒媳婦的房產(chǎn)協(xié)議書(2篇)
- 煤炭行業(yè)智能化煤炭篩分與洗選方案
- 2024年機(jī)修鉗工(初級(jí))考試題庫附答案
- Unit 5 同步練習(xí)人教版2024七年級(jí)英語上冊(cè)
- 矽塵對(duì)神經(jīng)系統(tǒng)的影響研究
- 分潤模式合同模板
- 海南省汽車租賃合同
評(píng)論
0/150
提交評(píng)論