author: fox
前兩天在買《計算機程式設計藝術 》中文版的時候,偶然發現《程式設計之美 》這本書,當時翻了一下,看到「讓cpu佔用率曲線聽你指揮 」這樣的題目確實讓人為之一動。寫一段**,可以讓cpu占有率曲線畫出平滑的正弦曲線,有點意思:-)。
當然,最後沒有買這本書,雖然我可以肯定這是本好書。
我從csdn讀書 上找到幾節,閒來讀一讀。今天來討論一下《讓cpu佔用率曲線聽你指揮 》。
題目:寫乙個程式,讓使用者來決定windows任務管理器(task manager)的cpu佔用率。程式越精簡越好,計算機語言不限。例如,可以實現下面三種情況:
1. cpu的佔用率固定在50%,為一條直線;
2. cpu的佔用率為一條直線,但是具體佔用率由命令列引數決定(引數範圍1~ 100);
3. cpu的佔用率狀態是乙個正弦曲線。
在討論具體實現之前,乙個非常重要的問題是:什麼是cpu佔用率 ?
《程式設計之美 》寫道:「在任務管理器的乙個重新整理周期內,cpu忙(執行應用程式)的時間和重新整理周期總時間的比率,就是cpu的佔用率,也就是說,任務管理器中顯示的是每個重新整理周期內cpu佔用率的統計平均值。 」
開啟「windows 任務管理器」,「效能」中有「cpu使用記錄」一項,給出的就是cpu占有率曲線。
至於乙個重新整理周期到底是多長,書中 似乎沒有明確給出,只是說「大約是1秒鐘更新一次」,我開啟windows自帶的時鐘,也感覺大約是1秒鐘。
另外的常識是:
單核環境下,空死迴圈會導致100%的cpu占有率。雙核環境下,cpu總占有率大約為50%,四核會不會是25%左右呢?(我沒有四核,只能猜測了,估計各核間切換也會耗掉點時間,因為我的雙核環境並沒有出現一核100%,另一核空閒的情況)。
當cpu整個重新整理周期(絕大多數時間)空閒時,cpu占有率趨於0。
書中 給出的正弦實現如下:
1#include
"windows.h"2
#include
"stdlib.h"3
#include
"math.h"4
5const
double
split
=0.01;6
const
intcount
=200;7
const
double
pi =
3.14159265;8
const
intinterval
=300; 9
10int
_tmain(
intargc, _tchar
*argv)
1122
dword starttime =0
;23intj =0
;24while
(true)25
32return0;
33}
在單核環境(p4 2.40)下,其表現還是不錯的:
在雙核環境(core2 e4500)下,就有點差強人意 不盡人意了:
不過,總還能看出是正弦曲線。
上面兩圖的問題:
1) 單核時曲線不夠平滑,是由於qq等程式占用cpu所致;
2) 雙核時曲線更加抖動,我的理解是除其他程式影響外,由於執行緒沒有固定執行在乙個cpu上導致的,後面看到書上 提到執行緒遷移 ,個人感覺這個叫法欠妥啊,總覺得執行緒遷移 令人費解。
可以立即想到的是:讓程序在指定處理器上執行(處理器親緣關係) ,由windows提供了兩個api可以做到這一點:getcurrentprocess和setprocessaffinitymask的。
修改之後的**如下:
1#include
"windows.h"2
#include
"stdlib.h"3
#include
"math.h"4
5const
double
split
=0.01;6
const
intcount
=200;7
const
double
pi =
3.14159265;8
const
intinterval
=300; 9
10int
_tmain(
intargc, _tchar
*argv)
1127
dword starttime =0
;28intj =0
;29while
(true)30
37return0;
38}
雙核環境(core2 e4500)修改之後的輸出如下:
我理想中的表現是:
1) 曲線是平滑的,最好不因其他應用程式或操作的執行而改變;
2) 不管是單核還是雙核,峰值皆為100%,谷值為0。
對於第一點,其實就是保證任一重新整理周期中的cpu占有率都可以被精確控制在0-100之間,如果你可以使cpu一直保持50%(而不是近似的上下波動),產生一條平滑的曲線就很easy了。
問題的關鍵在於,除了當前你寫的程式可以控制,其他程式或操作如何控制?或者說:如何控制cpu的運**況才是關鍵之處 。
ps: 一晚上老是斷網,搞得思路頻頻被打斷,興致也損了大半。總之,《程式設計之美 》還是值得玩味一把吧:d。
《程式設計之美》:
程式設計之美 1 1讓cpu佔用率曲線聽你指揮
嘗試了書中的幾種方式,發現都不明顯,只有下面這種方法,而且要把時間片調到7ms的時候,才大致是在百分之50 讓cpu佔用率曲線聽你指揮 寫乙個程式,讓使用者來決定windows任務管理器的cpu佔用率,程式越精簡越好,計算機語言不限。實現下面三種情況 1 cpu的佔用率固定在50 為一條直線 2 c...
程式設計之美 1 1 讓CPU佔用率曲線聽你指揮
聽到有人說讓要寫乙個程式,讓使用者來決定windows任務管理器的cpu佔用率。覺得很好奇。但第乙個想法就是寫個死迴圈。哈哈。不知道具體的佔用率是多少,但至少能保證在程式執行時,cpu的佔用率終會穩定在乙個值上 可能是100呢 在 程式設計之美 上看到了這個,就順手記下來吧。原題是這樣的 寫乙個程式...
程式設計之美學習筆記(一) 讓CPU佔用率曲線聽你指揮
終於放假了,開始在家裡看一本向同學借來被程式猿尊稱的必看經典書之一 程式設計之美 這本書給我的第一感覺是,他不單單是一本介紹演算法的書,更不是一本純演算法的書,更多的是跟生活的很多實際問題息息相關,讓你能更多地思考當我們面對現實實際問題的時候如何用自己從之前書本學習到的理論的知識去解決他們,如何以理...