舞动的CPU占用率曲线

来源:互联网 发布:淘宝电动平衡车 编辑:程序博客网 时间:2024/05/01 19:59

        如何用程序让Windows任务管理器的CPU占用率曲线舞动起来呢?

        翻开《编程之美》,这是第一个问题。当我第一次看到这个问题时,确是愣住了:竟然还有这样的问题?事实上,这不过是常见的一个问题,只是傻瓜式使用电脑的我从来未曾深究过而已。难道编程还能实现这样的问题吗?稍微转动脑袋便知道当电脑运行软件时CPU占用率便发生变化,而软件的本质不过是一个程序序列罢了,而问题不过要求用程序实现罢了。现在知道了这个问题,便应该分析解决这个问题,很多时候面前的路只有一条,是无法绕弯子的。以下的内容不过是在仔细阅读了《编程之美》该部分内容后的些许总结,绝无将作者辛苦工作的成果窃为己有之意。

        分析并理解问题是解决问题的关键。对于Windows任务管理器(图1)稍懂电脑的人都比较熟悉,至少当运行的软件死掉或电脑运行性能骤然下降时第一反应是去任务管理器看看CPU和内存的使用情况,在此不再赘述。CPU占用率从字面上理解便是一定时间内CPU被使用的比率,实际上确实如此,任务管理器的刷新周期内CPU执行应用程序的时间占刷新周期的比例便是CPU占用率,而CPU占用率曲线便是认为管理器中CPU使用记录下动态更新的实时曲线。至此,问题的意思便一目了然了:利用程序让CPU占用率曲线按预定规律变化。

1 Windows任务管理器

        新的问题又出现了:如何用程序实现呢?记得自己最初面对此问题在胡乱折腾了一阵后便束手无策。再回到问题涉及的基本概念上,CPU占用率是刷新周期内CPU执行应用程序时间所占比率,是一个实时动态更新的统计数据,而CPU占用率曲线不过是将其绘制出来形成曲线。让CPU占用率曲线按预定规律(例如正弦曲线)变化,本质上就是实时更新的CPU占用率这个统计数据按预定规律变化,这点很类似物理学中简谐振动所形成的波。因此,程序实现的其实就是改变刷新周期内CPU执行应用程序所占比率的统计数据。如果有嵌入式开发或信号处理基础知识,都应该知道方波的占空比这个概念,而问题中的CPU占用率和方波的占空比几乎就是孪生姐妹。对比方波占空比变化的概念,便可以轻而易举地理解改变CPU占用率的方式:利用程序让CPU在刷新周期的一部分时间内全力奔跑,而在剩余时间内静静休息,两者的时间分配便对应不用的变化规律。

        至此,问题基本上便迎刃而解了,剩下的仅仅是选定程序设计语言编程实现问题。让CPU全力奔跑的办法很是简单,一般程序设计中最常用的循环便可实现;让CPU静静休息的方法也很简单,若选用C/C++语言,只需要调用Sleep()系统函数即可。但有一点需要强调,CPU的全力奔跑和静静休息都是在一个刷新周期内进行的,因为任务管理器是按照刷新周期动态更新的。

        下面选用C/C++语言在VC 6.0上实现CPU占用率曲线的两种变化:1)CPU占用率固定为50%,占用率曲线为一条直线;2)CPU占用率按正弦规律变化,占用率曲线为正弦曲线。

        下面代码实现按规律一变化CPU占用率曲线,运行结果如图2所示。

#include <windows.h>int main(int argc, char* argv[]){DWORD StartTime = 0;double ratio = 0.5;int BusyTime = 10;int IdleTime = int(BusyTime * 1.0 / ratio - BusyTime + 0.5);while (1){StartTime = GetTickCount();while ((GetTickCount()-StartTime) < (DWORD)BusyTime){}Sleep(IdleTime);}return 0;}

2 CPU占用率固定为50%运行结果

        改变程序中的占用率控制参数ratio,可以使CPU占用率固定为相应值而不仅仅是50%。至于为什么BusyTime选取10,可参见《编程之美》。当然,《编程之美》提及按照CPU主频计算循环次数的方法,只是需要了解循环的汇编代码,虽然简单的汇编代码我可以读懂,但该方法确实有些笨拙,在此不再赘述。

        下面代码实现按规律一变化CPU占用率曲线,运行结果如图3所示。

#include <windows.h>#include <cmath>const double SPLIT = 0.01;const int COUNT = 200;const double PI = 3.1415926;const int INTERVAL = 300;int main(int argc, char* argv[]){DWORD BusySpan[COUNT];DWORD IdleSpan[COUNT];int half = INTERVAL / 2;double radian = 0;for (int i=0; i<COUNT; i++){BusySpan[i] = DWORD(half + half * sin(PI * radian));IdleSpan[i] = INTERVAL - BusySpan[i];radian += SPLIT;}DWORD StartTime = 0;int j = 0;while (TRUE){StartTime = GetTickCount();j %= COUNT;while ((GetTickCount()-StartTime) <= BusySpan[j]){}Sleep(IdleSpan[j]);j ++;}return 0;}

3 CPU占用率按正弦变化运行结果

        然而,上述方法确存在两个致命的缺陷:1)当程序运行的同时,其它应用程序的运行会影响CPU占用率曲线,因为目前Windows的操作系统均是多任务的;2)仅考虑单核CPU的情况,对于多核情况未考虑,而目前主流的电脑均已换代为多核,以上运行结果也是在单核CPU机器上得到的。

        针对第一个缺陷,可以先查询当前系统的各种性能数据,然后对上述程序进行相应修改即可;而第二个缺陷的解决思路很简单,只要指定进程在哪一个处理器上运行即可。对于两种解决方法简单的讨论可参见《编程之美》,详细的讨论需要进一步进行深入的研究。

        以上便是对CPU占用率曲线的些许讨论,准确地说应该是《编程之美》中相关问题的阅读心得,仅供茶前饭后消遣而已。
原创粉丝点击