C 讓CPU使用率曲線呈現為正弦曲線(一)

2021-06-29 16:02:16 字數 2338 閱讀 6051

看《程式設計之美》的第一題就很有意思:

寫乙個程式,讓使用者來決定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...