看《程式設計之美》的第一題就很有意思:
寫乙個程式,讓使用者來決定windows任務管理器的cpu佔用率。可以實現下面三種情況:
1. cpu的佔用率固定在50%,為一條直線;
2. cpu的佔用率為條直線,但是具體佔用率由命令列引數覺得(1~100);
3.cpu的佔用率狀態是乙個正弦曲線
我開始是按照書上的做法來的,讓cpu在一半的時間工作(乙個空迴圈),另一半的時間sleep。
#include
#include
using
namespace
std;
//工作和空閒各10ms
int busytime = 10;
int idletime = 10;
void cpu();
int main()
void cpu()
sleep(idletime);}}
不過這個解法在我的電腦上並不可行,書上討論的情況是只有單個cpu的環境,而我的cpu是雙核四執行緒的,執行這個程式cpu使用率達不到50%,甚至當我把sleep(idletime);
這句注釋掉之後,cpu使用率也只不過30%左右。
解決這個問題我想到了兩種辦法:
因為之前還沒有接觸過windows多執行緒程式設計,所以在這兒我先偷懶選用了第二種方法,只用單個cpu核心(不過這樣電腦卡頓了不少)。再次執行程式,從下面的截圖可以看到,cpu使用率基本上就維持在了50%附近,基本上可以算是一條直線了。這些波動大概就是由於其他程式工作引起的。
對上面的解法設定level引數就可以使之呈現不同的使用率。
#include
#include
#include
using
namespace
std;
int eachtime = 100;
void cpu(int busy,int idle);
int main()
void cpu(int busy, int idle)
sleep(idle);}}
下圖為輸入70時程式執行時效能監視器的曲線,基本上符合70%的佔用率。
為了讓cpu使用率曲線呈現為一條正弦曲線,只要先算出乙個正弦值的陣列,依次根據陣列中的值設定程式工作和空閒的時間。
先設定乙個時間間隔eachtime,取其一半halftime。每個工作時間busy=halftime+sin(delta)*halftime
,空閒時間則為eachtime-busy
。
#include
#include
#include
using
namespace
std;
int eachtime = 100;
int halftime = eachtime / 2;
int busy[200];
int idle[200];
const
int count = 200;
const
double split = 0.01;
const
double pi = 3.14159265;
void cpu();
int main()
cpu();
return0;}
void cpu()
sleep(idle[i]);
i++;}}
實驗結果如下圖所示,不過結果還不是很好,一些細微的地方調整一下也許曲線會更完美一些。
我對這個的研究還不夠詳細,如果有錯誤的地方歡迎指正!
在單核處理器的環境下**這麼寫差不多了,我一會就去把多核開啟,電腦這樣太卡頓了,過兩天再把多核處理器下調整cpu使用率的方法研究一下。
CPU使用率呈現正弦曲線
void cpusin int j 0 while true 讓cpu呈現正弦曲線就需要理解離散訊號。在乙個週期內每隔乙個小間隔就取樣乙個值就構成乙個離散序列 本題就是讓cpu使用率取樣成正弦分布。cpu的使用率在乙個取樣間隔裡面是可以控制的。具體控制的方法就是用while迴圈控制cpu執行的時間片...
讓CPU使用率按正弦變化
隨便找個編譯器就可以執行,比如devcpp等 include include include const int count 200 把乙個正弦週期平分成 count 份 const double split 2.0 count 用於後面計算sin值 const double pi 3.141592...
如何讓cpu的使用率成正弦函式
讓cpu畫正弦函式 把一條正弦曲線的弧度劃分為200等分進行抽樣,計算每個抽樣點的振幅 然後每隔300ms的時間取下乙個抽樣點,讓cpu工作對應振幅的時間 include windows.h include stdlib.h include math.h const int sampling cou...