關(guān) 閉

新聞中心

EEPW首頁(yè) > 工控自動(dòng)化 > 設(shè)計(jì)應(yīng)用 > Windows操作系統(tǒng)多核CPU內(nèi)核線程管理方法

Windows操作系統(tǒng)多核CPU內(nèi)核線程管理方法

作者: 時(shí)間:2011-01-20 來(lái)源:網(wǎng)絡(luò) 收藏

進(jìn)程線程的兩種數(shù)據(jù)結(jié)構(gòu)


SYSTEM_PROCESS_INFORMATION 結(jié)構(gòu)

進(jìn)程線程的兩種數(shù)據(jù)結(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)用程序是要通過(guò)調(diào)用Win 32子系統(tǒng)的API 函數(shù)DeviceIoControl 來(lái)向線程管理服務(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)信息句柄來(lái)對(duì)線程 親緣性屬性進(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è) 維護(hù)一個(gè)結(jié)構(gòu)體,內(nèi)容包括該 是否運(yùn)行實(shí)時(shí)線程,該CPU 上運(yùn)行的線程數(shù)(如果是實(shí)時(shí)線程CPU線程數(shù)為1),以及在此CPU上運(yùn)行的線程結(jié)構(gòu)數(shù)組的首地址。系統(tǒng)通過(guò)對(duì)此CPU 結(jié)構(gòu)數(shù)組的解析來(lái)對(duì)線程進(jìn)行管理。并通過(guò)DeviceIoControl函數(shù)把設(shè)置后的CPU 結(jié)構(gòu)交給驅(qū)動(dòng)程序內(nèi)核。

3.4 修改 內(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)程空間的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),通過(guò)它可以遍歷所有的ETHREAD 結(jié)構(gòu),那么那到KTHREAD 下的Affinity 域就不難了,可以使用兩個(gè)循環(huán)嵌套來(lái)得到所有線程的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)行之外,還有 系統(tǒng)進(jìn)程下的線程。

4 軟件使用及性能測(cè)試

4.1 驅(qū)動(dòng)的加載及軟件的使用

首先需要把本系統(tǒng)的驅(qū)動(dòng)sys 文件加載到的服務(wù)管理器中,加載成功后打開應(yīng)用程序,用戶可以通過(guò)應(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
表2
從表2 分析, 設(shè)定任務(wù)線程的CPU 親緣性與其它線程所占用的CPU 分開,真正意義上的實(shí)現(xiàn)了任務(wù)的異步執(zhí)行,非常有效的提高了實(shí)時(shí)線程對(duì)CPU 資源的使用率。

5 結(jié)束語(yǔ)

本文分析了Windows 系統(tǒng)的內(nèi)核進(jìn)程線程調(diào)度表2CPU 親緣性設(shè)定三種情況下任務(wù)線程運(yùn)行時(shí)間表機(jī)制,并在此基礎(chǔ)上設(shè)計(jì)了一種基于Windows 內(nèi)核驅(qū)動(dòng)的CPU 線程管理方法, 實(shí)現(xiàn)了這樣一個(gè)軟件系統(tǒng)。首先在Windows 內(nèi)核層獲取系統(tǒng)進(jìn)程線程信息,然后再把信息傳入應(yīng)用層,由應(yīng)用層上的應(yīng)用程序根據(jù)獲取的信息句柄,對(duì)進(jìn)程進(jìn)行操作,用戶在圖形界面下按照仿真任務(wù)對(duì)CPU 資源的不同需求,進(jìn)行相應(yīng)的設(shè)置,可以為指定線程設(shè)置CPU 親緣性的功能。在一定程度上為Windows 系統(tǒng)下的任務(wù)合理地分配了CPU 資源,為對(duì)實(shí)時(shí)性要求較高的任務(wù)提供了一個(gè)可靠的運(yùn)行環(huán)境。

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

上一頁(yè) 1 2 3 下一頁(yè)

關(guān)鍵詞: Windows CPU 操作系統(tǒng) 多核

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉