这个问题的描述如下:写一个程序,让用户来觉得Windows的任务管理器(Task Messager)上的CPU占有率,编程语言不限。程序越精简越好,可以实现下面的功能:
第一、CPU的占有率固定在50%,为一条直线。
第二、CPU占有率为一条直线,占有率由命令行参数决定(范围是1-100)。
第三,CPU的占有率是一条正弦曲线。
在解这个题目之前,要先了解一下什么是CPU的占有率,从“占有”这两个字来看,CPU的占有率应该是CPU忙碌的时间占总时间的比率。题目中让我们控制CPU的占有率,就是让我们控制CPU什么时候忙碌,什么时候空闲,让它听从我们的指挥。
很容易,我们就想到了通过循环和判断来实现这个功能,在一半的时间内,我们让CPU运行自己的程序,另外一半,使用sleep,让CPU空闲,可以运转其他的程序,这个时间控制使用一个变量来控制,让变量自增或者自减。
解法一:在《编程之美》这本书里面讲的很清楚,循环确实可以做到,但是我们如何知道一个空循环所需要的时间呢,这个就需要自己估算了,在计算机中,任何程序到底层之后都会转换成机器指令,在接近机器指令的最近的语言就是汇编语言,我们可以通过分析汇编语言来分析一个空循环所需的时间。
LOOP:
mov dx i ;将i放入寄存器dx中
inc dx ;将dx自加1
mov i dx ;将寄存器中的值赋值给i
cmp i n ;判断i的值是否为n
jl loop ;循环
for(;;){for(int i = 0; i < 10400000;i++);Sleep(10);}
不断调整循环次数,可以保证CPU的占有率曲线是一天直线,但是不是很稳定。该方法有一个很大的缺点就是,一旦换了一个CPU,我们必须重新计算循环次数。现在就需要一个动态的循环次数来适应CPU。
解法二:使用GetTickCount()函数得到系统从启动到现在所经历的毫秒数,也就是时间。代码如下:
void fun1()
{int busyTime = 10;int idleTime = busyTime * 1.0; //调整这个1.0的值,以达到50%的标准,不同的计算机上是不同的。int ret = SetThreadAffinityMask(GetCurrentThread(),0x00000001);//使这个程序跑在第一个CPU核心INT64 startTime = 0;while (1){startTime = GetTickCount(); while((GetTickCount() - startTime) <= busyTime);Sleep(idleTime);}
}
本文发布于:2024-02-03 23:55:13,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170697995751882.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |