教你玩轉(zhuǎn)CPU——控制CPU占用率曲線

教你玩轉(zhuǎn)CPU——控制CPU占用率曲線

ID:39497448

大?。?4.00 KB

頁(yè)數(shù):5頁(yè)

時(shí)間:2019-07-04

教你玩轉(zhuǎn)CPU——控制CPU占用率曲線_第1頁(yè)
教你玩轉(zhuǎn)CPU——控制CPU占用率曲線_第2頁(yè)
教你玩轉(zhuǎn)CPU——控制CPU占用率曲線_第3頁(yè)
教你玩轉(zhuǎn)CPU——控制CPU占用率曲線_第4頁(yè)
教你玩轉(zhuǎn)CPU——控制CPU占用率曲線_第5頁(yè)
資源描述:

《教你玩轉(zhuǎn)CPU——控制CPU占用率曲線》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。

1、教你玩轉(zhuǎn)CPU----隨心所欲控制CPU占用率曲線走向我想大家都知道電腦的任務(wù)管理器里面有個(gè)CPU占用率曲線吧,他根據(jù)系統(tǒng)使用資源的不同實(shí)時(shí)顯示,那能不能使這個(gè)曲線按照自己的思想顯示呢,如使他一直保持一個(gè)固定的值,如50%,或者正弦曲線,聽(tīng)起來(lái)好像很難,但如果是讓你用C、C++或java等語(yǔ)言寫一個(gè)最簡(jiǎn)短的程序,你會(huì)不會(huì)覺(jué)得更難呢,不錯(cuò),這曾經(jīng)是微軟亞洲研究院(MicrosoftResearchAsia,MSRA)的一道面試題,據(jù)說(shuō)這道題就淘汰了當(dāng)批接受面試的85%的人,他的原題如下:1、CPU的占用率固定為50%,為一條直線;2、

2、CPU的占用率為一條直線,但是具體占用率由命令行參數(shù)決定(參數(shù)范圍1~100);3、CPU的占用率狀態(tài)是一個(gè)正弦曲線??磥?lái)這并不是不可能完成的任務(wù)。然我們仔細(xì)回想一下寫程序時(shí)曾經(jīng)碰到的問(wèn)題,如果我們不小心寫了一個(gè)死循環(huán),CPU占用率就會(huì)跳到最高,并且一直保持100%。我們也可以打開(kāi)任務(wù)管理器,實(shí)際觀測(cè)一下它是怎樣變動(dòng)的。憑肉眼觀察,它大約是每一秒鐘更新一次。一般情況下,CPU的占用率很低。但是當(dāng)用戶運(yùn)行一個(gè)程序時(shí),執(zhí)行一些復(fù)雜的操作時(shí),CPU的使用率會(huì)急劇增加。當(dāng)用戶鼠標(biāo)晃動(dòng)時(shí),CPU的使用率也會(huì)有小幅度的變化。那么當(dāng)任務(wù)管理器報(bào)告

3、CPU的使用率為0的時(shí)候,誰(shuí)在使用CPU呢?通過(guò)任務(wù)管理器的“進(jìn)程(Process)”一欄可以看到,SystemIdleProcess占用了CPU空閑的時(shí)間----這時(shí)候大家該回憶起在“操作系統(tǒng)原理”這門課上學(xué)到的一些知識(shí)了吧。系統(tǒng)中有那么多的進(jìn)程,他們什么時(shí)候能“閑下來(lái)”呢?答案很簡(jiǎn)單,這些程序在等待用戶的輸入,或者在等待某些事件的發(fā)生,或者主動(dòng)進(jìn)入休眠狀態(tài)。在任務(wù)管理器的一個(gè)刷新周期內(nèi),CPU忙(執(zhí)行應(yīng)用程序)的時(shí)間和刷新周期總時(shí)間的比率,就是CPU的占用率,也就是說(shuō),任務(wù)管理器顯示的是每個(gè)刷新周期內(nèi)CPU占用率的統(tǒng)計(jì)平均值。因

4、此,我們寫了一個(gè)程序,讓他在任務(wù)管理器的刷新期內(nèi)一會(huì)兒忙,一會(huì)兒閑,然后通過(guò)調(diào)節(jié)忙閑比例,就可以控制任務(wù)管理器中顯示的CPU占用率。要操縱CPU的使用率曲線,就需要使CPU在一段時(shí)間內(nèi)(更具TaskManager的采樣率)跑busy和idle兩個(gè)不同的循環(huán)(loop),從而通過(guò)不同的時(shí)間比例,來(lái)調(diào)節(jié)CPU使用率。busyloop可以通過(guò)執(zhí)行空循環(huán)來(lái)實(shí)現(xiàn),idle可以通過(guò)Sleep()實(shí)現(xiàn)。問(wèn)題的關(guān)鍵在于如何控制兩個(gè)loop時(shí)間,我們先實(shí)驗(yàn)一下Sleep一段時(shí)間,然后循環(huán)n次,估算n的值。那么對(duì)于一個(gè)空循環(huán)for(i=0;i

5、++);又該如何來(lái)估算這個(gè)最合適的n值呢?我們都知道CPU執(zhí)行的是機(jī)器指令,而最接近機(jī)器指令的語(yǔ)言是匯編語(yǔ)言,所以我們可以先把這個(gè)空循環(huán)簡(jiǎn)單的寫成如下匯編代碼后再進(jìn)行分析:loop:movdxi;將i置入dx寄存器incdx;將dx寄存器加1movidx;將dx中的值賦回icmpin;比較i和nj1loop;1小于n時(shí)則重復(fù)循環(huán)假設(shè)這段代碼要運(yùn)行的CPU是P42.4GHz(2.4*10的9次方個(gè)時(shí)鐘周期每秒)?,F(xiàn)代CPU每個(gè)時(shí)鐘周期可以執(zhí)行兩條以上的代碼,呢么我們就取平均值兩條,于是讓(2400000000*2)/5=9600000

6、00(循環(huán)/秒),也就是說(shuō)CPU1秒鐘可以運(yùn)行這個(gè)空循環(huán)960000000次。不過(guò)我們還是不能簡(jiǎn)單的將n=960000000,然后Sleep(1000)了事。如果我們讓CPU工作1秒鐘,然后休息1秒鐘,波形很可能就是鋸齒狀的----先達(dá)到一個(gè)峰值(>50%),然后跌倒一個(gè)很低的占用率。我們嘗試降低兩個(gè)數(shù)量級(jí),令n=9600000而睡眠時(shí)間相應(yīng)改為10毫秒(Sleep(10))。用10毫秒是因?yàn)樗淮笠膊恍?,比較接近Windows的調(diào)度時(shí)間片。如果選得太?。ū热?毫秒),則會(huì)造成線程頻繁的被喚醒和掛起,無(wú)形中友增加了內(nèi)核時(shí)間的不確定性

7、影響。最后我們得到如下代碼:intmain(){for(;;){for(inti=0;i<9600000;i++);Sleep(10);}return0;}在VC中用Sleep前面要加上#include"windows.h",在不斷調(diào)整9600000的參數(shù)后,我們就可以在一臺(tái)指定的機(jī)器上獲得一條大致穩(wěn)定50%CPU占用率曲線使用這種方法要注意兩點(diǎn)影響:1、盡量減少sleep/awake的頻率,減少操作系統(tǒng)內(nèi)核調(diào)度程序的干擾。2、盡量不要調(diào)用systemcall(比如I/O這些privilegeinstruction),因?yàn)樗矔?huì)導(dǎo)致

8、很多不可控的內(nèi)核運(yùn)行時(shí)間。3、上面的程序是針對(duì)單核CPU的,如果是多核CPU,那么CPU占用率曲線有好幾個(gè),如果自定義指定哪個(gè)或哪幾個(gè)顯示呢,可以在for(;;)前面加上SetProcessAffinityMask()函數(shù),BOOLS

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。