关于编程控制CPU使用率的笔记

本文介绍了一个使用C++编写的程序,该程序通过设置进程的CPU亲和性来实现进程固定在一个特定的CPU核心上运行,以减少双核环境下线程迁移带来的抖动现象。文章还提供了一个具体的代码实例,展示了如何利用Windows API GetCurrentProcess 和 SetProcessAffinityMask 来进行CPU亲和性的设定。

代码

 

ContractedBlock.gif ExpandedBlockStart.gif Code
#include "Windows.h"
#include 
"stdlib.h"
#include 
"math.h" 
#include 
<tchar.h>

const double SPLIT = 0.01;
const int COUNT = 200;
const double PI = 3.14159265;
const int INTERVAL = 300;

int _tmain(int argc, _TCHAR* argv[])
ExpandedBlockStart.gifContractedBlock.gif
{
    DWORD busySpan[COUNT];  
//array of busy times
    DWORD idleSpan[COUNT];  //array of idle times
    int half = INTERVAL / 2;
    
double radian = 0.0;
    
for(int i = 0; i < COUNT; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        busySpan[i] 
= (DWORD)(half + (sin(PI * radian) * half));
        idleSpan[i] 
= INTERVAL - busySpan[i];
        radian 
+= SPLIT;
    }

    DWORD startTime 
= 0;
    
int j = 0;
    
while (true)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        j 
= j % COUNT;
        startTime 
= GetTickCount();
        
while ((GetTickCount() - startTime) <= busySpan[j]) ;
        Sleep(idleSpan[j]);
        j
++;
    }

    
return 0;
}

 

但是,双核时曲线更加抖动,我的理解是除其他程序影响外,由于线程没有固定运行在一个CPU上导致的,后面看到书上提到线程迁移,个人感觉这个叫法欠妥啊,总觉得线程迁移令人费解。

可以立即想到的是:让进程在指定处理器上运行(处理器亲缘关系),由Windows提供了两个API可以做到这一点:GetCurrentProcessSetProcessAffinityMask的。

修改之后的代码如下:

ContractedBlock.gif ExpandedBlockStart.gif Code
#include "stdafx.h"
#include 
"Windows.h"
#include 
"stdlib.h"
#include 
"math.h" 
#include 
<tchar.h>

const double SPLIT = 0.01;
const int COUNT = 200;
const double PI = 3.14159265;
const int INTERVAL = 300

int _tmain(int argc, _TCHAR* argv[])
ExpandedBlockStart.gifContractedBlock.gif
{
    SetProcessAffinityMask(
        GetCurrentProcess(),
        
0x00000001          //cpu mask
        ); 

    DWORD busySpan[COUNT];  
//array of busy times
    DWORD idleSpan[COUNT];  //array of idle times
    int half = INTERVAL / 2;
    
double radian = 0.0;
    
for(int i = 0; i < COUNT; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        busySpan[i] 
= (DWORD)(half + (sin(PI * radian) * half));
        idleSpan[i] 
= INTERVAL - busySpan[i];
        radian 
+= SPLIT;
    }

    DWORD startTime 
= 0;
    
int j = 0;
    
while (true)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        j 
= j % COUNT;
        startTime 
= GetTickCount();
        
while ((GetTickCount() - startTime) <= busySpan[j]) ;
        Sleep(idleSpan[j]);
        j
++;
    }

    
return 0;
}

转载于:https://www.cnblogs.com/wangpei/archive/2008/09/20/1294780.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值