【微软面试题1】任意改变CPU占有率的几种方法【限winxp系统】

要想随心所欲控制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()

posted @ 2012-04-26 16:13  晒米的猫  阅读(599)  评论(0编辑  收藏  举报