青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Creative Commons License
本Blog采用 知識共享署名-非商業(yè)性使用-禁止演繹 3.0 Unported許可協(xié)議 進(jìn)行許可。 —— Fox <游戲人生>

游戲人生

游戲人生 != ( 人生 == 游戲 )
站點遷移至:http://www.yulefox.com。請訂閱本博的朋友將RSS修改為http://feeds.feedburner.com/yulefox
posts - 62, comments - 508, trackbacks - 0, articles - 7

編程之美:讓CPU占用率曲線聽你指揮

Posted on 2008-04-17 00:20 Fox 閱讀(11202) 評論(10)  編輯 收藏 引用 所屬分類: T技術(shù)碎語

Author: Fox

前兩天在買《計算機(jī)程序設(shè)計藝術(shù)》中文版的時候,偶然發(fā)現(xiàn)《編程之美》這本書,當(dāng)時翻了一下,看到“讓CPU占用率曲線聽你指揮”這樣的題目確實讓人為之一動。寫一段代碼,可以讓CPU占有率曲線畫出平滑的正弦曲線,有點意思:-)。

當(dāng)然,最后沒有買這本書,雖然我可以肯定這是本好書。

我從CSDN讀書上找到幾節(jié),閑來讀一讀。今天來討論一下《讓CPU占用率曲線聽你指揮》。

題目:寫一個程序,讓用戶來決定Windows任務(wù)管理器(Task Manager)的CPU占用率。程序越精簡越好,計算機(jī)語言不限。例如,可以實現(xiàn)下面三種情況:

1.    CPU的占用率固定在50%,為一條直線;

2.    CPU的占用率為一條直線,但是具體占用率由命令行參數(shù)決定(參數(shù)范圍1~ 100);

3.    CPU的占用率狀態(tài)是一個正弦曲線。

在討論具體實現(xiàn)之前,一個非常重要的問題是:什么是CPU占用率

編程之美》寫道:“在任務(wù)管理器的一個刷新周期內(nèi),CPU忙(執(zhí)行應(yīng)用程序)的時間和刷新周期總時間的比率,就是CPU的占用率,也就是說,任務(wù)管理器中顯示的是每個刷新周期內(nèi)CPU占用率的統(tǒng)計平均值。

打開“Windows 任務(wù)管理器”,“性能”中有“CPU使用記錄”一項,給出的就是CPU占有率曲線。

至于一個刷新周期到底是多長,書中似乎沒有明確給出,只是說“大約是1秒鐘更新一次”,我打開Windows自帶的時鐘,也感覺大約是1秒鐘。

另外的常識是:

單核環(huán)境下,空死循環(huán)會導(dǎo)致100%的CPU占有率。雙核環(huán)境下,CPU總占有率大約為50%,四核會不會是25%左右呢?(我沒有四核,只能猜測了,估計各核間切換也會耗掉點時間,因為我的雙核環(huán)境并沒有出現(xiàn)一核100%,另一核空閑的情況)。

當(dāng)CPU整個刷新周期(絕大多數(shù)時間)空閑時,CPU占有率趨于0。

書中給出的正弦實現(xiàn)如下:

1 #include "Windows.h"
2 #include "stdlib.h"
3 #include "math.h" 
4 
5 const double SPLIT = 0.01;
6 const int COUNT = 200;
7 const double PI = 3.14159265;
8 const int INTERVAL = 300;
9 
10 int _tmain(int argc, _TCHAR* argv[])
11 {
12     DWORD busySpan[COUNT];  //array of busy times
13     DWORD idleSpan[COUNT];  //array of idle times
14     int half = INTERVAL / 2;
15     double radian = 0.0;
16     for(int i = 0; i < COUNT; i++)
17     {
18         busySpan[i] = (DWORD)(half + (sin(PI * radian) * half));
19         idleSpan[i] = INTERVAL - busySpan[i];
20         radian += SPLIT;
21     }
22     DWORD startTime = 0;
23     int j = 0;
24     while (true)
25     {
26         j = j % COUNT;
27         startTime = GetTickCount();
28         while ((GetTickCount() - startTime) <= busySpan[j]) ;
29         Sleep(idleSpan[j]);
30         j++;
31     }
32     return 0;
33 }


在單核環(huán)境(P4 2.40)下,其表現(xiàn)還是不錯的:

點擊查看大圖

在雙核環(huán)境(Core2 E4500)下,就有點差強(qiáng)人意不盡人意了:

點擊查看大圖

不過,總還能看出是正弦曲線。

上面兩圖的問題:

1) 單核時曲線不夠平滑,是由于QQ等程序占用CPU所致;

2) 雙核時曲線更加抖動,我的理解是除其他程序影響外,由于線程沒有固定運行在一個CPU上導(dǎo)致的,后面看到書上提到線程遷移,個人感覺這個叫法欠妥啊,總覺得線程遷移令人費解。

可以立即想到的是:讓進(jìn)程在指定處理器上運行(處理器親緣關(guān)系),由Windows提供了兩個API可以做到這一點:GetCurrentProcessSetProcessAffinityMask的。

修改之后的代碼如下:

1 #include "Windows.h"
2 #include "stdlib.h"
3 #include "math.h" 
4 
5 const double SPLIT = 0.01;
6 const int COUNT = 200;
7 const double PI = 3.14159265;
8 const int INTERVAL = 300;
9 
10 int _tmain(int argc, _TCHAR* argv[])
11 {
12    SetProcessAffinityMask(
13         GetCurrentProcess(),
14         0x00000001          //cpu mask
15         );
16 
17     DWORD busySpan[COUNT];  //array of busy times
18     DWORD idleSpan[COUNT];  //array of idle times
19     int half = INTERVAL / 2;
20     double radian = 0.0;
21     for(int i = 0; i < COUNT; i++)
22     {
23         busySpan[i] = (DWORD)(half + (sin(PI * radian) * half));
24         idleSpan[i] = INTERVAL - busySpan[i];
25         radian += SPLIT;
26     }
27     DWORD startTime = 0;
28     int j = 0;
29     while (true)
30     {
31         j = j % COUNT;
32         startTime = GetTickCount();
33         while ((GetTickCount() - startTime) <= busySpan[j]) ;
34         Sleep(idleSpan[j]);
35         j++;
36     }
37     return 0;
38 }


雙核環(huán)境(Core2 E4500)修改之后的輸出如下:

點擊查看大圖

我理想中的表現(xiàn)是:

1) 曲線是平滑的,最好不因其他應(yīng)用程序或操作的執(zhí)行而改變;

2) 不管是單核還是雙核,峰值皆為100%,谷值為0。

對于第一點,其實就是保證任一刷新周期中的CPU占有率都可以被精確控制在0-100之間,如果你可以使CPU一直保持50%(而不是近似的上下波動),產(chǎn)生一條平滑的曲線就很easy了。

問題的關(guān)鍵在于,除了當(dāng)前你寫的程序可以控制,其他程序或操作如何控制?或者說:如何控制CPU的運行情況才是關(guān)鍵之處

PS: 一晚上老是斷網(wǎng),搞得思路頻頻被打斷,興致也損了大半。總之,《編程之美》還是值得玩味一把吧:D。

Feedback

# re: 編程之美:讓CPU占用率曲線聽你指揮  回復(fù)  更多評論   

2008-04-17 12:17 by brent
俺也看到這章了,

看到題目的第一反應(yīng)是設(shè)計一個反饋系統(tǒng)。

看到解答挺失望的,感覺有點雕蟲小技的味道

# re: 編程之美:讓CPU占用率曲線聽你指揮  回復(fù)  更多評論   

2008-04-17 21:02 by Fox
恩,MS的面試題多如此類,翻一翻還是開闊思路

# re: 編程之美:讓CPU占用率曲線聽你指揮  回復(fù)  更多評論   

2008-04-18 17:15 by Wang Feng
unix上怎么辦?

# re: 編程之美:讓CPU占用率曲線聽你指揮  回復(fù)  更多評論   

2008-04-18 18:29 by Fox
@Wang Feng
呵呵,MS的面試題啊:D

# re: 編程之美:讓CPU占用率曲線聽你指揮  回復(fù)  更多評論   

2008-04-20 23:58 by greatws
呵呵,不錯。
不過我想到的是直接Hook任務(wù)管理器或者Hook查CPU利用率的API,可能會更精確

# re: 編程之美:讓CPU占用率曲線聽你指揮  回復(fù)  更多評論   

2008-04-22 00:38 by www
> 除了當(dāng)前你寫的程序可以控制,其他程序或操作如何控制?

書上也談到了一些。不過不是控制,而是“適應(yīng)”。

# re: 編程之美:讓CPU占用率曲線聽你指揮  回復(fù)  更多評論   

2008-06-28 00:40 by 不死阿三
試過了,用c#改寫了一下,總是感覺不是很平滑。

# re: 編程之美:讓CPU占用率曲線聽你指揮  回復(fù)  更多評論   

2009-03-29 01:00 by kg
樓主,能不能解釋下,為什么要這樣設(shè)定:
busySpan[i] = (DWORD)(half + (sin(PI * radian) * half));
idleSpan[i] = INTERVAL - busySpan[i];

為什么不可以這樣:
busySpan[i] = (DWORD)(1 /2 + (sin(PI * radian) * 1 / 2));
idleSpan[i] = 1- busySpan[i];
這樣是不是CPU使用率=1/2*(1+sin(PI * radian))?

liwenge21@sina.com,謝謝回復(fù)。

# re: 編程之美:讓CPU占用率曲線聽你指揮  回復(fù)  更多評論   

2010-12-26 16:55 by lateCpp
28 while ((GetTickCount() - startTime) <= busySpan[j]) ;
29 Sleep(idleSpan[j]);

========================
這個可以控制到sleep是正弦曲線嗎?
我對WINDOWS API不太熟,大致理解是這樣:

如果j=0時,busySpan[0]=150,相應(yīng)的,IdleSpan[0]=150;
如果j等某值時,busySpan[j]=180,相應(yīng)的,IdleSpan[j]=120。(由計算公式,busySpan=150*(1+sin(j*pi)),可知,可以取到這個值,起碼近似。)

這時候來看while循環(huán)(上面所引的行28):
第一次循環(huán):滿足<=180條件,執(zhí)行一次Sleep(120);
第二次循環(huán):依然滿足<=180的條件 ,再執(zhí)行一次Sleep(120);
第三次循環(huán):不滿足,跳出;
這樣一共Sleep了240秒,顯然,這跟原來Sleep(IdleSpan[j])的初衷是不一致的。這個對產(chǎn)生的曲線應(yīng)該也有影響吧?

不知道理解的對不。希望交流討論。xueyayang AT gmail DOT com

# re: 編程之美:讓CPU占用率曲線聽你指揮  回復(fù)  更多評論   

2011-01-27 14:08 by BopGroup
《編程之美》這在計劃修訂改版,歡迎大家提建議,這里(http://bop1.wikispaces.com/)有包含所有題目的wiki,大家可以注冊后提問,也可以直接給我發(fā)郵件 lispython@gmail.com。
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产乱理伦片在线观看夜一区| 亚洲国产国产亚洲一二三| 欧美日韩人人澡狠狠躁视频| 久久久久免费观看| 欧美亚洲一区二区在线观看| 亚洲一区二区三区高清| 一区二区久久久久久| 夜夜嗨av一区二区三区中文字幕| 最近中文字幕mv在线一区二区三区四区| 欧美二区在线播放| 亚洲国产精品视频一区| 夜夜狂射影院欧美极品| 亚洲欧美日韩一区二区三区在线观看 | 久久精品电影| 久久天天躁夜夜躁狠狠躁2022| 老司机午夜精品视频| 欧美风情在线观看| 国产精品v欧美精品v日本精品动漫| 国产精品欧美一区二区三区奶水| 黄色成人免费观看| 99re8这里有精品热视频免费 | 久久视频免费观看| 亚洲丰满少妇videoshd| 亚洲性图久久| 久久综合免费视频影院| 欧美体内谢she精2性欧美| 国产午夜精品全部视频播放| 亚洲精品一区二区在线观看| 性欧美暴力猛交69hd| 欧美不卡视频一区发布| 亚洲一二三区在线| 欧美风情在线观看| 国产一区二区三区网站| 亚洲午夜精品一区二区三区他趣| 久久国产主播| 亚洲免费电影在线| 久久中文字幕导航| 国产精品久久99| 亚洲国产一区视频| 久久精品中文字幕一区| 99精品视频网| 欧美成人情趣视频| 激情视频一区| 久久国产精品久久w女人spa| 亚洲国产你懂的| 久久久中精品2020中文| 国产日韩成人精品| 午夜精品美女自拍福到在线 | 国内精品久久久久伊人av| 一区二区三区免费看| 欧美va天堂在线| 久久精品女人天堂| 国产欧美日韩不卡免费| 亚洲男女自偷自拍图片另类| 亚洲精品网站在线播放gif| 久久综合色播五月| 亚洲电影观看| 欧美成人免费一级人片100| 欧美资源在线观看| 国内一区二区三区| 久久免费视频这里只有精品| 欧美一区永久视频免费观看| 国产日韩精品一区观看| 欧美一区2区视频在线观看 | 性欧美1819sex性高清| 国产精品久久久久国产a级| 亚洲午夜精品一区二区三区他趣| 亚洲精品久久久久| 欧美日韩精品三区| 亚洲精选视频在线| 亚洲精品无人区| 国产精品精品视频| 久久精品91久久久久久再现| 欧美主播一区二区三区美女 久久精品人| 国产精品爽爽爽| 久久久久久国产精品mv| 久久黄色级2电影| 亚洲激精日韩激精欧美精品| 亚洲欧洲在线观看| 国产精品成人一区二区网站软件| 欧美一区二区免费| 久久久亚洲一区| 亚洲色图制服丝袜| 午夜伦欧美伦电影理论片| 激情自拍一区| 亚洲人成网站色ww在线| 国产精品国内视频| 久久亚洲不卡| 欧美激情视频在线免费观看 欧美视频免费一 | 日韩视频在线观看免费| 国产精品成人观看视频免费 | 久久久久欧美精品| 亚洲日本中文字幕| 亚洲一区二区日本| 亚洲承认在线| 亚洲视频一起| 在线精品国产成人综合| 亚洲视频综合在线| 亚洲国产导航| 亚洲欧美日韩在线不卡| 亚洲精品国产视频| 欧美亚洲一区二区在线| 一本到12不卡视频在线dvd | 国产精品亚洲综合色区韩国| 麻豆精品精华液| 国产精品久久国产三级国电话系列 | 欧美亚韩一区| 亚洲第一毛片| 国产日韩在线看片| 亚洲免费播放| 亚洲老板91色精品久久| 欧美专区第一页| 亚洲男人的天堂在线aⅴ视频| 久久久久一区| 性高湖久久久久久久久| 免费在线播放第一区高清av| 久久精品国产免费观看| 国产精品激情| 9久re热视频在线精品| 亚洲国产精品成人一区二区| 午夜精品在线| 午夜日韩电影| 欧美日韩免费一区二区三区视频 | 亚洲精品一区二区网址| 在线欧美电影| 久久爱www.| 欧美一区二区观看视频| 欧美视频一区二区三区| 亚洲欧洲在线看| 亚洲免费黄色| 欧美91精品| 欧美激情精品久久久久久大尺度| 国产日韩欧美| 久久久www免费人成黑人精品 | 欧美大片在线看| 欧美不卡高清| 在线播放亚洲一区| 久久人人爽国产| 蜜臀91精品一区二区三区| 韩国精品在线观看| 久久久精品视频成人| 美女主播视频一区| 在线日本成人| 另类图片综合电影| 亚洲国产美国国产综合一区二区| 亚洲免费高清视频| 欧美色图首页| 亚洲制服丝袜在线| 久久久久国产精品一区三寸| 一区精品在线| 欧美激情久久久| 一区二区久久久久| 久久精品论坛| 91久久线看在观草草青青| 欧美国产极速在线| 一区二区三区精品国产| 久久er99精品| 亚洲人精品午夜| 欧美日韩一级片在线观看| 亚洲香蕉网站| 蜜桃伊人久久| 亚洲影院免费观看| 国产亚洲一区二区精品| 久久综合久久综合九色| 最新亚洲电影| 性亚洲最疯狂xxxx高清| 在线看日韩av| 国产精品久久久久9999| 久久免费99精品久久久久久| 最新日韩欧美| 久久久国产午夜精品| 亚洲毛片av在线| 国产午夜精品麻豆| 欧美日本韩国一区| 欧美伊人久久久久久午夜久久久久 | 国产日产欧美精品| 欧美成人综合| 亚洲欧美一区二区在线观看| 欧美高清你懂得| 亚欧美中日韩视频| 亚洲精品一区二区三区99| 国产视频精品va久久久久久| 欧美国产欧美亚洲国产日韩mv天天看完整| 一区二区三区日韩欧美精品| 欧美11—12娇小xxxx| 亚洲男人天堂2024| 亚洲人永久免费| 国语自产在线不卡| 国产精品美女久久久久av超清| 欧美成年视频| 久久精品一区中文字幕| 亚洲一区二区免费在线| 亚洲九九爱视频| 亚洲国产片色| 免费在线欧美视频| 久久久亚洲欧洲日产国码αv| 亚洲综合色自拍一区| 一本久久a久久精品亚洲| 亚洲第一精品夜夜躁人人躁| 国产女精品视频网站免费|