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

雁過無痕

  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::



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

 

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

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

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

 

控制CPU占用率,不僅僅是出于好玩而已。以前的某些程序,特別是某些老游戲,在新的機器上運行速度太快,必須先給CPU降速,才能順利運行那些程序,有個共享軟件CPUKiller,就是專門弄這個的。

 

控制CPU占用率,因為要調(diào)用WindowsAPI,要考慮到多核、超線程的情況,要考慮到不同版本的Windows的計時相關(guān)的API的精度不同,使問題變得相當復(fù)雜,若再考慮其它程序的CPU占用率,則該問題則變得很煩人。(taskmgr調(diào)用了一個未公開的API)。

 

CPU核數(shù)的判斷,書上是調(diào)用GetProcessorInfo,其實可以直接調(diào)用GetSystemInfo,SYSTEM_INFO結(jié)構(gòu)的dwNumberOfProcessors成員就是核數(shù)。不知道超線程對這兩種方法有什么影響。

 

如果不考慮其它程序的CPU占用情況,可以在每個核上開一個線程,運行指定的函數(shù),實現(xiàn)每個核的CPU占用率相同。

 

要讓CPU的占用率,呈函數(shù) y = calc(t) (0 <= y <= 1, t為時間,單位為ms )分布,只要取間隔很短的一系列點,認為在某個間隔內(nèi),y值近似不變。

設(shè)間隔值為GAP,顯然在指定t值附近的GAP這段時間內(nèi),

CPU占用時間為:busy = GAP * calc(t),

CPU空閑時間為:idle = GAP – busy

因此,很容易寫出下面這個通用函數(shù):

 

 

void solve(Func *calc)
{
  
double tb = 0;
  
while(1{
    unsigned ta 
= get_time();
    
double r = calc(tb);
    
if (r < 0 || r > 1) r = 1;
    DWORD busy 
= r * GAP;
    
while(get_time() - ta < busy) {}
    Sleep(GAP 
- busy);
    tb 
+= GAP;
  }

}


如果CPU占用率曲線不是周期性變化,就要對每個t值都要計算一次,否則,可以只計算第一個周期內(nèi)的各個t值,其它周期的直接取緩存計算結(jié)果。

 

CPU占用率為正弦曲線為例,顯然:y = 0.5 * (1 + sin(a * t + b))

其周期T = 2 * PI / a  (PI = 3.1415927),可以指定T值為60s60000ms,則

 可以確定a值為 2 * PI / T, 若在這60000ms內(nèi)我們計算200次(c = 200),則GAP值為 T / c = 300ms.也就是說,只要確定了周期和計算次數(shù),其它幾個參數(shù)也都確定下來。

 

 

完整代碼如下:

 

#include<windows.h>
#include
<cstdio>
#include
<cmath>

const int PERIOD = 60 * 1000//60,000 ms
const int COUNT = 200;

const double PI = 3.1415926535898;
const double GAP = (double)PERIOD / COUNT;
const double FACTOR = 2 * PI / PERIOD;  

typedef 
double Func(double); 
inline DWORD get_time() 
return GetTickCount(); }

double calc2(double x) {  return (1 + sin(FACTOR * x)) / 2;}

double calc3(double)
{
  
static double cache[COUNT];
  
static int count = 0;
  
static bool first = true;
  
if (first) {
    
double x = 0.0;
    
for (int i = 0; i < COUNT; ++i, x += GAP) 
      cache[i] 
= (1.0 + sin(FACTOR * x)) / 2.0
    first 
= false;
  }

  
if (count >= COUNT) count = 0;
  
return cache[count++];  
}


double calc4(doublereturn 0.8;}

void solve(Func *calc)
{
  
double tb = 0;
  
while(1{
    unsigned ta 
= get_time();
    
double r = calc(tb);
    
if (r < 0 || r > 1) r = 1;
    DWORD busy 
= r * GAP;
    
while(get_time() - ta < busy) {}
    Sleep(GAP 
- busy);
    tb 
+= GAP;
  }

}



void run()
{
  Func 
*func[] = { calc2, calc3, calc4 };
  Func 
*calc = func[1];
  
const int MAX_CPUS = 32;
  HANDLE handle[MAX_CPUS];
  DWORD thread_id[MAX_CPUS];
  SYSTEM_INFO info;
  GetSystemInfo(
&info);
  
const int num = info.dwNumberOfProcessors;
  
for (int i = 0; i < num; ++i) {
    
if ( (handle[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)solve,
         (VOID
*)calc, 0&thread_id[i])) != NULL) 
      SetThreadAffinityMask(handle[i], i 
+ 1);
  }

  WaitForSingleObject(handle[
0],INFINITE);   
}



int main()
{
  run();
}



稍微優(yōu)化下:

#include<cstdio>
#include
<cmath>
#include
<windows.h>

const int PERIOD = 60 * 1000//60,000 ms
const int COUNT = 300;

const double GAP_LINEAR = 100

const double PI = 3.1415926535898;
const double GAP = (double)PERIOD / COUNT;
const double FACTOR = 2 * PI / PERIOD;  


typedef 
double Func(double); 
inline DWORD get_time() 
return GetTickCount(); }

double calc_sin(double x) {  return (1 + sin(FACTOR * x)) / 2;}

static double Ratio = 0.7;

void set_ratio()
{
  
double ret = 0.0;
  printf(
"Ratio:([0,1]) ");
  scanf(
"%lf"&ret);
  
if (ret < 0.0 || ret > 1.0) ret = 0.5;
  Ratio 
= ret;
}


void solve_nonperiod(Func *calc)
{
  
double tb = 0;
  
while(1{
    unsigned ta 
= get_time();
    
double r = calc(tb);
    
if (r < 0 || r > 1) r = 1;
    DWORD busy 
= r * GAP;
    
while(get_time() - ta < busy) {}
    Sleep(GAP 
- busy);
    
//tb += GAP;
    tb += get_time() - ta;
  }

}


void solve_period(Func *calc)
{
  
double x = 0.0;
  
double cache[COUNT];
  
for (int i = 0; i < COUNT; ++i, x += GAP) 
    cache[i] 
= calc(x); 
  
int count = 0;
  
while(1{
    unsigned ta 
= get_time();
    
if (count >= COUNT) count = 0;
    
double r = cache[count++];
    DWORD busy 
= r * GAP;
    
while(get_time() - ta < busy) {}
    Sleep(GAP 
- busy);
  }

}


void solve_linear(Func*)
{
  
const unsigned BUSY =  Ratio * GAP_LINEAR;
  
const unsigned IDLE = (1 - Ratio) * GAP_LINEAR;
  
while(1{
    unsigned ta 
= get_time();
    
while(get_time() - ta < BUSY) {}
    Sleep(IDLE);
  }

}



void run(unsigned index = 0double ratio = -1.0)
{
  typedef 
void Solve(Func *calc);
  Func 
*func[] = { calc_sin};
  Func 
*calc = func[0];
  Solve 
*solve_func[] = { solve_linear, solve_period, solve_nonperiod };
  
if (index >= sizeof(solve_func) / sizeof(solve_func[0])) index = 0;
  Solve 
*solve = solve_func[index];
  
if (solve == solve_linear) {
    
if (ratio >= 0 && ratio <= 1) Ratio = ratio;
    
else set_ratio();
  }
    
  
const int MAX_CPUS = 32;
  HANDLE handle[MAX_CPUS];
  DWORD thread_id[MAX_CPUS];
  SYSTEM_INFO info;
  GetSystemInfo(
&info);
  
const int num = info.dwNumberOfProcessors;
  
for (int i = 0; i < num; ++i) {
    
if ((handle[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)solve, 
                                    (VOID
*)calc, 0&thread_id[i])) != NULL) 
      SetThreadAffinityMask(handle[i], i 
+ 1);
  }

  WaitForSingleObject(handle[
0],INFINITE);   
}



int main()
{
  run(
00.5);
  
//run(0);
  
//run(1);
  
//run(1);
}


posted on 2010-12-02 23:19 flyinghearts 閱讀(4696) 評論(2)  編輯 收藏 引用 所屬分類: 編程之美

評論

# re: 《編程之美》讀書筆記23: 1.1 讓CPU占用率曲線聽你指揮 2012-07-15 19:56 霧非霧
如何才能讓CPU的曲線 為 I LOVE YOU這樣的字符???  回復(fù)  更多評論
  

# re: 《編程之美》讀書筆記23: 1.1 讓CPU占用率曲線聽你指揮 2014-10-16 14:48 3d
const int MAX_CPUS = 32;
HANDLE handle[MAX_CPUS];
DWORD thread_id[MAX_CPUS];
SYSTEM_INFO info;
GetSystemInfo(&inf  回復(fù)  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            先锋影音久久| 欧美国产日韩一二三区| 在线观看视频一区| 国产有码在线一区二区视频| 国产精品久久久久aaaa樱花| 欧美日韩一区二区在线播放| 国产精品免费看片| 国产一区二区三区精品欧美日韩一区二区三区| 国产一区二区高清视频| 亚洲电影免费观看高清完整版在线 | 99国产麻豆精品| 野花国产精品入口| 欧美亚洲一区三区| 久久久噜噜噜久久狠狠50岁| 久久另类ts人妖一区二区| 欧美a级一区二区| 国产精品久久久久久久7电影| 国产三级欧美三级日产三级99| 永久免费毛片在线播放不卡| 一区二区三区欧美成人| 欧美一区二区三区四区视频| 欧美aⅴ99久久黑人专区| 亚洲六月丁香色婷婷综合久久| 午夜欧美视频| 欧美日韩麻豆| 激情成人亚洲| 亚洲视频在线观看网站| 免费欧美电影| 亚洲欧美网站| 欧美久久影院| 国产资源精品在线观看| 99国内精品久久| 快播亚洲色图| 亚洲欧美日本另类| 欧美人体xx| 在线观看久久av| 亚洲宅男天堂在线观看无病毒| 美女网站久久| 午夜精品成人在线视频| 欧美激情中文不卡| 激情成人av在线| 性做久久久久久免费观看欧美 | 欧美一区二区三区免费视频| 亚洲国产精品久久| 欧美亚洲网站| 国产精品久久久久久久app| 亚洲福利视频在线| 久久久免费观看视频| 亚洲视频免费观看| 欧美日韩视频专区在线播放 | 欧美色图首页| 亚洲人成亚洲人成在线观看图片| 久久大逼视频| 亚洲一级黄色片| 欧美日韩直播| 99视频超级精品| 亚洲激情国产| 欧美精品乱人伦久久久久久| 亚洲激情电影在线| 欧美xx视频| 久久婷婷久久| 亚洲丰满在线| 亚洲黄色在线视频| 亚洲第一毛片| 久久综合色88| 91久久久久久久久久久久久| 欧美大胆a视频| 久久亚洲综合色| 亚洲国产精品久久人人爱蜜臀 | 欧美国产视频在线| 女人色偷偷aa久久天堂| 亚洲国产日韩欧美一区二区三区| 免费av成人在线| 麻豆精品国产91久久久久久| 亚洲国产美女精品久久久久∴| 欧美激情精品久久久| 欧美a级大片| 亚洲私人影院在线观看| 亚洲一区二区三区影院| 国产三级欧美三级| 美女免费视频一区| 欧美大片在线观看一区| 一本久久综合亚洲鲁鲁| 一区二区欧美亚洲| 国产偷国产偷亚洲高清97cao| 久久婷婷久久一区二区三区| 久久综合给合久久狠狠色| 亚洲美女尤物影院| 99视频在线观看一区三区| 国产精品黄色| 欧美成人69| 欧美午夜大胆人体| 久久久久久久97| 欧美激情导航| 久久成人免费日本黄色| 美日韩精品视频免费看| 亚洲男人影院| 欧美jizzhd精品欧美巨大免费| 一区二区三区免费网站| 欧美在线三区| 亚洲尤物在线| 久久综合影视| 欧美一级理论性理论a| 免费亚洲一区二区| 欧美一激情一区二区三区| 女生裸体视频一区二区三区| 午夜精品久久久久久久99樱桃 | 欧美一区在线看| 9人人澡人人爽人人精品| 久久丁香综合五月国产三级网站| 日韩天堂av| 久久久国产精品一区二区三区| 亚洲图片欧美一区| 蘑菇福利视频一区播放| 欧美一区二区三区另类| 欧美日韩另类字幕中文| 欧美韩日一区| 激情久久中文字幕| 亚洲欧美日韩国产另类专区| 亚洲精品欧洲| 亚洲第一网站| 国产亚洲欧美一区二区| 夜夜嗨网站十八久久 | 一片黄亚洲嫩模| 久久精品一区蜜桃臀影院 | 久久国产精品毛片| 午夜日韩在线观看| 欧美日韩一区二区三区免费| 亚洲第一福利社区| 在线观看福利一区| 久久精品日产第一区二区| 欧美在线首页| 国产精品红桃| 亚洲一区二区高清视频| 亚洲一区在线观看视频| 欧美日韩综合另类| 日韩一级网站| 亚洲伊人网站| 国产精品久久久久毛片软件 | 亚洲免费高清| 欧美精品一区三区| 91久久精品国产91久久| 狠狠色狠狠色综合日日小说| 亚洲欧美在线播放| 久久久久国产精品www| 国产乱码精品一区二区三| 亚洲一级免费视频| 欧美在线你懂的| 国内精品视频久久| 久久久久久成人| 欧美激情女人20p| 99国内精品久久| 国产精品久久激情| 亚洲女同精品视频| 久久人人爽国产| 91久久久在线| 欧美三级午夜理伦三级中文幕| 在线视频免费在线观看一区二区| 午夜精品在线| 一区视频在线| 欧美激情一区二区在线| 一本色道久久88综合亚洲精品ⅰ| 午夜精品偷拍| 在线看日韩av| 欧美日韩国产不卡在线看| 亚洲无线一线二线三线区别av| 久久99在线观看| 亚洲激情视频网| 欧美无砖砖区免费| 久久久综合网站| 99国产精品视频免费观看| 久久国产视频网站| 亚洲精品免费一二三区| 国产精品久久久| 噜噜爱69成人精品| 亚洲一级高清| 亚洲国产成人精品女人久久久| 亚洲一区二区在线视频| 国产一区视频在线看| 欧美激情视频在线播放| 亚洲欧美日韩国产中文在线| 亚洲第一精品影视| 欧美日韩三级在线| 亚洲激情视频在线播放| 亚洲欧美国产制服动漫| 免费成人在线观看视频| 一本色道久久精品| 激情国产一区二区| 国产精品swag| 欧美高清一区| 久久精品国产第一区二区三区最新章节| 欧美黄色小视频| 久久久亚洲欧洲日产国码αv| 99精品久久免费看蜜臀剧情介绍| 国产日韩欧美在线一区| 欧美图区在线视频| 欧美不卡视频一区发布| 久久久国产一区二区| 西西人体一区二区| 亚洲午夜一区二区|