如何用程序让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占用率曲线的些许讨论,准确地说应该是《编程之美》中相关问题的阅读心得,仅供茶前饭后消遣而已。

舞动的CPU占用率曲线相关推荐

  1. 让多核CPU占用率曲线听你指挥(Windows实现)——《编程之美》1.1学习笔记

    让多核CPU占用率曲线听你指挥--<编程之美>1.1学习笔记 Problem: 写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率.有以下几种情况: ...

  2. 编程之美:让CPU占用率曲线听你指挥

    题目:写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率.程序越精简越好,计算机语言不限.例如,可以实现下面三种情况: 1.    CPU的占用率固定在50%, ...

  3. 《编程之美》读书笔记23: 1.1 让CPU占用率曲线听你指挥

    题目:写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率.程序越精简越好,计算机语言不限.例如,可以实现下面三种情况:   1.    CPU的占用率固定在50 ...

  4. 让CPU占用率曲线听你指挥

    由于网上已经有很多有关此问题的博客,本文参考了http://blog.csdn.net/wesweeky/article/details/6402564 题目:写一个程序,让用户来决定Windows任 ...

  5. (1.5.1.1)编程之美:让CPU占用率曲线听你指挥

    题目:写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率.程序越精简越好,计算机语言不限.例如,可以实现下面三种情况: 1.    CPU的占用率固定在50%, ...

  6. 编程之美读书笔记_1.1_让CPU占用率曲线听你指挥

    题目:写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率.程序越精简越好,计算机语言不限.例如,可以实现下面三种情况:   1.    CPU的占用率固定在50 ...

  7. 编程之美-控制CPU占用率曲线方法整理

    [试题描述] 方法一:简单的解法 方法二:使用GetTickCount()和Sleep() 方法三:你能动态适应的解法 方法四:正弦曲线 方法五: 附:一些与线程/进程/系统效能相关的API

  8. 让用户来决定Windows任务管理器的CPU占用率

    让CPU占用率曲线听你指挥  问题 写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率.程序越精简越好,计算机语言不限.例如,可以实现下面三种情况: 1. CP ...

  9. 用户决定Windows的CPU占用率

    题目:写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率.程序越精简越好,计算机语言不限.例如,可以实现下面三种情况:  1.    CPU的占用率固定在50% ...

最新文章

  1. UVA 1646 Edge Case
  2. table 隔列换色
  3. Android --- 知识点记录
  4. 快速将InnoDB表复制到另一个实例
  5. 角色权限模块设计-数据pdm
  6. C语言实例:3个数从小到大排序
  7. [html] html元素哪些标签是不可替换元素?哪些是可替换元素?
  8. 个人或结对项目 - 动态显示程序运算的过程
  9. 音频服务器未运行怎么办,音频服务未运行怎么办 音频服务未运行解决方法【详细介绍】...
  10. 在Jenkins远程链接Linux系统,然后执行shell命令-亲测可用【转】
  11. Kendo UI grid 表格数据更新
  12. HDU 4966 GGS-DDU(最小树形图)
  13. Light Field 光场以及Matlab光场工具包(LightField ToolBox)的使用说明
  14. 559. N叉树的最大深度
  15. 小米手机运行linux,在小米4手机安装Linux deploy,然后安装kali linux,但过程中出现如图所示問題...
  16. Python基础01
  17. anchor机制讲解
  18. [复选框] 获取checkbox选中的值
  19. KFC宅急送点餐系统开发 MFC动态树形控件使用
  20. 【数据库MySQL】2021最新官网下载及查看MySQL版本步骤教程

热门文章

  1. 不同电脑分辨率下满屏显示页面
  2. 【开源项目介绍】STC32基于u8g2库DMA驱动IIC or SPI OLED屏幕显示
  3. win10关闭windows defender 和 cortana
  4. 【LAB3-Cisco】策略路由PBR应用
  5. spring security配置详解
  6. 出现failed to load steamui.dll如何解决?好的修复方法推荐
  7. 鸿蒙os手机哪款最好,鸿蒙OS传来好消息!华为这几款手机抢先升级,系统体验无差...
  8. 必要回报率(Required Rate Of Return)
  9. (完美)华为麦芒7 SNE-AL00的usb调试模式在哪里开启的流程
  10. 如何查看电脑是否已安装Python环境以及Python版本