要想随心所欲控制CPU,其实就是控制了CPU的空闲和忙的时间比例。
从两方面入手:
让CPU忙:循环函数
让CPU闲:sleep函数
有以下一些方法:
1.计算CPU 参数写循环
以我的计算机为例:CPU 2.4ghz 则设每个CPU时间片中执行两条汇编指令,又循环的汇编指令为:
loop
mov dx i;
add dx 1;
mov i dx;
cmp i n;
jmp 1
则总共需要的2.4*10^9*2/5为 运行这段汇编,每秒执行的次数。
代码:
alg1///计算cpu的频率,每个时间片执行两条汇编指令 则计算得 CPU 2.4ghz 结果:不能实现//
//for (;;)
//{
// for (int i= 0;i < 960000000;i++)
// ;
// Sleep(1000);
//}
2.使用getTickCount()来实现
通过获取当前时间的,设定开始时间,进行忙等和闲置操作。
代码:
/alg2/利用GetTickCount函数来实现//结果:不能实现//
//int busyTime = 10;
//int idleTime = busyTime/16;
//INT64 startTime = 0;
//while (true)
//{
// startTime = GetTickCount();
// while ((GetTickCount() - startTime)<=busyTime)
// ;
// Sleep(idleTime);
//}
3.绘制正弦函数
其思路是:设置两个数组分别存放忙时间和闲时间,由于任务管理器显示是依据的忙时间比例,将忙时间设置为一个正弦函数,闲时间则为其反比例。
通过上述方法可获得正弦函数。
代码:
/alg3///绘制正弦函数/利用windowsNT自带Perform.exe观察 实现//控制busy时间和idle时间 结果:未达要求//
//const double SPLIT = 0.01;
//const int COUNT = 200;
//const double PI = 3.14159265;
//const int INTERVAL = 300;
//INT64 busyTime[COUNT];
//INT64 idleTime[COUNT];
//INT64 startTime;
//int half = INTERVAL/2;
//double ratio = 0;
//for (int i = 0;i < COUNT;i++)
//{
// busyTime[i] = (DWORD)(half + half*sin(PI*ratio));
// idleTime[i] = INTERVAL - busyTime[i];
// ratio += SPLIT;
//}
//int j = 0;
//while (true)
//{
// j = j%COUNT;
// startTime = GetTickCount();
// while((GetTickCount() - startTime) <= busyTime[j])
// ;
// Sleep(idleTime[j]);
// j++;
//}
4.对于多核和多线程
可使用相应的如getCpuTickCount等来操作每个CPU核和相应的线程。
后记
方法总结:
1.GetTickCount() 获取当前CPU的时间
2.Sleep() 休眠
3.Perfmon.exe 监视系统性能 分析CPU性能
4.GetProcessorInfo()获取CPU性能参数(xp)【参考msdn】
5.SetThreadAffinityMask()指定对应的CPU进行计算操作(xp)
6.使用RDTSC指令 获取CPU核心运行周期
x86计算机下:
使用如下函数
inline __int64 GetCPUTickCount()
{
__asm
{
rdtsc;
}
}
x64下
#define GetCPUTickCount() __rdtsc()