《程式設計之美》讀書筆記(一) CPU利用率控制

2021-06-17 15:03:00 字數 2709 閱讀 4825

第乙個簡單的例子,

思路:=〉cpu忙指什麼(執行指令),cpu什麼時候閒(idle process)

=〉怎樣[程式設計]讓cpu忙,怎樣讓cpu閒? (空迴圈跑:忙; sleep:閒)

=〉怎樣程式設計控制忙的比例,讓比例為想要的值(控制空迴圈的次數,控制閒的時間)

=〉idle時間長度確定,考慮作業系統排程(sleep(10))

=〉控制忙迴圈的確定(1. for迴圈,機器指令->組合語言,結合cpu主頻,估算迭代次數 =〉cpu忙時間長度)

(2. while迴圈,利用系統呼叫gettickcount(),直到while迴圈持續了指定長度時間)

=〉*考慮其他程序的因素(利用額外工具,查詢獲得當前cpu利用率,動態決定是需要sleep,還是執行查詢[忙])

=> 畫正弦曲線,需要確定作圖時乙個週期上全部點的座標,每個點的縱座標有busy和sleep兩部分構成,點間距取多少?書中給出的interval取300ms而不是更新週期1秒,不過,應該問題也不大。

實際程式設計實現畫正弦函式,**跟書上基本一樣,只是在main函式最開始的地方呼叫了setthreadaffinitymask函式來指定cpu,以防止執行緒遷移。

handle h_cur = getcurrentthread();

setthreadaffinitymask(h_cur, 0x01);

測試平台:1.intel(r) core(tm)2 duo cpu t5850 @ 2.16ghz + vc++6

2. amd athlon(tm) ii x2 245 + vs2010

程式在我的華碩本上跑,機器比較老,08年款機器,自帶cpu是intel(r) core(tm)2 duo cpu t5850 @ 2.16ghz,就是雙核cpu,所以需要做cpu指定,即便如此出來結果還是很爛。

大概就是這樣,在低谷的時候增長很緩慢,到了40%的時候一下子蹭蹭地飈上去了,但是又達不到100%。下降的時候起初降的比較慢,到80%的時候又一下子掉下去了,非常的奇怪。

百思不得其解之下又看了看書,書中提到「cpu主頻會隨電壓和負荷而變化」,果然,從任務管理器可以看到,cpu在負荷較低時,主頻為0.98ghz,隨著負載增加,超過閾值後,主頻變高(>25%:~1.3ghz,>40%: ~2.12ghz)。

我猜測應該是gettickcount()或者sleep()函式受到影響。

網上查了一下,gettickcount()函式是由兩個數相乘得到

t = shr(tickcountlow * tickcountmultiplier, 24);

tickcountlow - it is updated each time the clock ticks

tickcountmultiplier - it is calculated at system boot, look function excomputetickcountmultiplier

中文資料也說的差不多。

tickcountlow 表示機器啟動後的滴答數(tick)。tickcountmultiplier表示每個滴答數的時間間隔:1毫秒的2^(-24)。

所以要取毫秒數時兩值相乘後右移24位就可以了。

但是很奇怪,在台式電腦上amd athlon(tm) ii x2 245上,也是雙核,稍微修改了常量引數,但是結果還不錯。

但是同樣**在duo cpu上就是有問題

備註:後續再嘗試在筆記本上裝vs2010重跑。

附1:c++**

#include #include #include #include int main(int argc, char* argv)

{ handle h_cur = getcurrentthread();

setthreadaffinitymask(h_cur, 0x01);

/* const int count = 200;

const int interval = 300;

const float split = 0.01;

const float pi = 3.1415926;*/

const int count = 40;

const int interval = 1000;

const float split = 0.05;

const float pi = 3.1415926;

dword busyspan[count];

dword idlespan[count];

float radian = 0.0;

int half = interval/2;

for(int i=0; i

讀書筆記 程式設計之美(一

不得不說程式設計之美是一本很有意思的書,裡面的各式各樣新奇的問題,總是可以通過課上講的簡單的問題來解決,對於訓練自己的思維的確有很大的好處。一般解決複雜的問題,我們總是可以通過 1 畫圖 鍊錶 二叉樹,2 舉例,3 分解 分治法 動態規劃來解決。for 遍歷a的位置 遍歷b的位置 判斷a b的位置組...

《程式設計之美》讀書筆記(一)

2.1求二進位制數中1的個數 乙個8byte的整數,求其二進位制表示中1的個數。四個演算法 1 迴圈除2判斷餘數是否為1 2 和0x01異與 判斷最後一位是否為1,然後右移一位,迴圈往復。演算法1和2的時間複雜度都是o logn 3 這個演算法比較狠,乙個乙個抹去最後乙個1,這樣時間複雜度就只和1的...

《程式設計之美》讀書筆記

程式設計之美 讀書筆記 一 中國象棋將帥問題 程式設計之美 讀書筆記 二 求二進位制數中1的個數 擴充套件問題 程式設計之美 讀書筆記 三 一摞烙餅的排序問題 程式設計之美 讀書筆記 四 買書折扣問題的貪心解法 程式設計之美 讀書筆記 五 飲料 問題 程式設計之美 讀書筆記 六 連連看遊戲設計 程式...