博主电脑CPU
然后,打开任务管理器—>进程—>System Idle Process 占用了CPU的空闲时间,表示我们系统剩余的CPU资源,like this
博主电脑的System Idle Process占用为97%,说明我现在没干啥高负荷的工作,电脑负担很轻。了解系统“闲下来”的时间,那么,要能控制CPU占用率曲线,就是调整“空闲”和“busy”的比率了。
一 使CPU使用达到50%
使用GetTickCount()和Sleep()
#include<stdio.h>
#include<windows.h>
int main()
{
const DWORD busyTime = 10;//10ms,因为10ms比较接近windows的调度时间片
const DWORD idleTime = busyTime;
INT64 startTime = 0;
while(true){
DWORD startTime = GetTickCount();//该函数可以得到“系统启动到现在”所经历时间的毫秒数
//busy loop
while((GetTickCount()-startTime)<=busyTime){;
}
//idle loop
Sleep(idleTime);
}
}
运行后,得到如下:
可以看到CPU每一核使用基本趋于平稳,但是还是达不到使用为50%,因为在同一时刻,从上图可以看到CPU占用测试只是占用了24%,Idle占用了62%,还有别的进程占用了14%。
所以要寻找动态的解决办法
使用Perform
上图资源监视器进程中第四个也就是perform进程。
Perform可获取有关操作系统,应用程序和硬件的各种效能技术器(perf counter)。Perform的用法很直接,只要选择你所要检测的对象(such as 处理器、RAM或者硬盘)。
win7—>计算机—>管理—>性能—>性能监视器
选好自己要监视的对象之后,Like this
.Net Framework提供了PerformanceCounter这一对象,可以方便地得到当前各种性能数据,包括CPU的使用率。
namespace cpu占用测试
{
class Program
{
static void MakeUsage(double level)
{
PerformanceCounter p = new PerformanceCounter("Processor", "% Processor Time", "_Total");
if (p == null)
return;
while (true)
{
if(p.NextValue()>level)
{
System.Threading.Thread.Sleep(10);
}
}
}
static void Main(string[] args)
{
MakeUsage(0.5);
}
}
}
由于博主电脑四核,所以完全看不到50%的说,而且这个50%分配到每一核大概是多少也是不确定的。
二 CPU占用率达到正弦曲线
const int SAMPLING_COUNT = 200;
const double PI = 3.1415926535;
const int TOTAL_AMPLITUDE = 300;
int main()
{
DWORD busySpan[SAMPLING_COUNT];
int amplitude = TOTAL_AMPLITUDE/2;
double radian = 0.0;
double radianIncrement = 2.0/(double)SAMPLING_COUNT;//抽样弧度的增量
for(int i = 0;i<SAMPLING_COUNT;++i)
{
busySpan[i] = (DWORD)(amplitude+(sin(PI*radian)*amplitude));
radian +=radianIncrement;
printf("%d\t%d\n",busySpan[i],TOTAL_AMPLITUDE-busySpan[i]);
}
DWORD startTime = 0;
for(int j = 0;;j = (j+1)%SAMPLING_COUNT)
{
startTime = GetTickCount();
while((GetTickCount()-startTime)<=busySpan[j])
;
Sleep(TOTAL_AMPLITUDE - busySpan[j]);
}
return 0;
}
总的还是能看到正弦曲线的雏形。
接下来指定某一CPU看看,主要用到两个函数指定运行哪个CPU用SetThreadAffinityMask()
定义:
DWORD_PTR SetThreadAffinityMask(HANDLE hThread, DWORD_PTR dwThreadAffinityMask);
该函数中的hThread参数用于指明要限制哪个线程, dwThreadAffinityMask用于指明该线程能够在哪个CPU上运行。dwThreadAffinityMask必须是进程的亲缘性屏蔽的相应子集。返回值是线程的前一个亲缘性屏蔽。 关于进程的亲缘性,请看线程的相关性
修改后
int main()
{
SetProcessAffinityMask(GetCurrentProcess(),0x00000001);//指定CPU
DWORD busySpan[SAMPLING_COUNT];
int amplitude = TOTAL_AMPLITUDE/2;
double radian = 0.0;
double radianIncrement = 2.0/(double)SAMPLING_COUNT;//抽样弧度的增量
for(int i = 0;i<SAMPLING_COUNT;++i)
{
busySpan[i] = (DWORD)(amplitude+(sin(PI*radian)*amplitude));
radian +=radianIncrement;
printf("%d\t%d\n",busySpan[i],TOTAL_AMPLITUDE-busySpan[i]);
}
DWORD startTime = 0;
for(int j = 0;;j = (j+1)%SAMPLING_COUNT)
{
startTime = GetTickCount();
while((GetTickCount()-startTime)<=busySpan[j])
;
Sleep(TOTAL_AMPLITUDE - busySpan[j]);
}
return 0;
}
运行结果
可以看到指定程序只在cpu0上运行。
《编程之美》第一篇还是很有意思的,日后把可任务管理器玩成示波器的说。