`

让CPU占用率曲线听你指挥—微软技术面试心得

阅读更多

学习自《程序员》2008年03月刊

 

问题:

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

1. CPU的占用率固定在50%,为一条直线;

2. CPU的占用率为一条直线,但是具体占用率由命令行参数决定(参数范围1-100);

3. CPU的占用率状态是一个正弦曲线。

 

分析与解法:

    凭肉眼观察,任务管理器大约1S钟更新一次。当CPU使用率为0的时候,通过“进程”选项卡可以看到,System Idle Process占用了CPU空闲的时间。回忆一下,系统中有那么多进程,它们什么时候能闲下来?要么等待用户输入,要么等待某事件发生(WaitForSingleObject()),或进入休眠状态(通过sleep()实现)。

    在任务管理器的一个刷新周期内,CPU忙的时间/刷新周期总时间=CPU占用率。也就是说,任务管理器中显示的是每个刷新周期内CPU占用率的统计平均值。因此,我们写程序让它在任务管理器的刷新周期内一会儿忙,一会儿闲,通过调节忙/闲比例,控制CPU占用率。

 

解法一:简单的解法

代码清单1-1

 

int main()

{

     for( ; ;)

     {

          for(int i=0; i<9600000; i++)

          sleep(10);

     }

     return 0;

}

 

 

 

 

 

 

 

 

 

 

 

为什么会选取9600000和10两个参数呢?请听细解:

CPU执行的都是机器指令,而最接近于机器指令的是汇编语言,所以我们可以先把for(int i=0;i<n;i++)写成如下汇编代码再进行分析

loop:

mov dx i  ;将i置入dx寄存器

inc dx      ;将dx寄存器加1

mov i dx  ;将dx中的值赋回i

cmp i n    ;比较i和n

jl loop     ;i小于n时则重复循环

 

 

 

 

 

 

 

 

假设这段代码要执行的CPU是P4 2.4Ghz(即2.4*10^9个时钟周期每秒)。现代CPU每个时钟周期可以执行两条以上的代码(这里按两条算),那么(2.4*10^9)*2/5=960 000 000(循环/秒)。而如果我们直接令n=960 000 000,然后再sleep(1000),即忙1S闲1S,那么波形很可能就是锯齿状的—先达到一个峰值,然后跌到一个很低。于是我们尝试降低两个数量级,即n=n/100;sleep(10).用10ms是因为它比较接近Windows的调度时间片,如果选得太小,则会造成线程频繁地被唤醒和挂起,无形中增加了内核时间的不确定性影响。

 

     使用这种方法要注意两点:1. 尽量减少sleep/awake的频率,如果频繁发生,影响则会很大,因为此时更高的操作系统内核调度程序会占用很多CPU运算时间;2. 尽量不要调用system call(比如IO这些privilege instruction),因为它也会导致很多不可控的内核运行时间。

     这种方法缺点也很明显:1. 不能适应机器差异性,换了CPU就要重新计算N值;2. 没办法动态了解CPU运算能力,然后自动调节忙/闲比。

 

解法二:使用GetTickCount()和Sleep()

代码清单1-2

int busyTime=10;         //10ms

int idleTime=busyTime;

 

int64 startTime=0;

while(true)

{

      startTime=GetTickCount();

 

      while( GetTickCount()-starTime <=busyTime ) ;

 

      sleep(idleTime);

}

 

 

 

 

 

 

 

 

 

 

 

 

 

我们知道,GetTickCount()可以得到“系统启动到现在”的毫秒值,最多能够统计到49.7天。另外,利用sleep()最多也只能精确到1ms.因此,可以在“ms”这个数量级上操作和比较。

 

 

    以上两种解法都是假设目前系统 上只有当前程序在运行,但实际上,操作系统中有很多程序都会在不同时间执行各种任务。那怎么做呢?我们得知道“当前CPU占用率是多少”,这就要用到另一个工具来帮忙—Perfmon.exe。

    我们可以写程序来查询Perfmon的值,Microsoft .NET Framework提供了PerformanceCounter()这一类型,从而可方便地拿到当前各种计算机性能数据,包括CPU使用率。

 

解法三:正弦曲线

//C++ code to make task manager

//generate sine graph

#include "Windows.h"

#include "stdlib.h"

#include "math.h"

 

const double SPLIT=0.01;

const int COUNT=200;

const double PI=3.14159265;

coust int INTERVAL=300;

 

int _tmain(int argc, _TCHAR* argv[])

{

     //array of busy times

     DWORD busySpan[COUNT];

     //array of idle times

     DWORD idleSpan[COUNT];

 

     int half=INTERVAL/2;

     double radian=0.0;

     for(int i=0;i<COUNT;i++)

     {

          busySpan[i]=(DWORD)(half+sin(PI*radian)*half);

          idleSpan[i]=INTERVAL-busySpan[i];

          radian+=SPLIT:

      }

 

      DWORD startTime=0;

      int j=0;

      while(true)

      {

            j=j%COUNT;

            startTime=GetTickCount();

            while(GetTickCount()-startTime<=busySpan[j]);

            Sleep(idleSpan[j]);

            j++;

      }

      return 0;

}

 

分享到:
评论

相关推荐

    让CPU占用率曲线听你指挥

    编程之美:让CPU占用率曲线听你指挥,C++代码实现

    让CPU占用率曲线听你指挥 《编程之美——微软技术面试心得》节选.pdf

    "让CPU占用率曲线听你指挥" 本文主要讲述了如何控制Windows任务管理器中的CPU占用率曲线,让用户可以自定义CPU占用率的变化方式。通过分析和解释相关代码,我们可以了解到如何通过编程来控制CPU占用率,并了解CPU...

    让CPU曲线听你指挥

    标题“让CPU曲线听你指挥”暗示了我们讨论的主题是关于如何通过编程或者特定的工具来管理和控制计算机的中央处理器(CPU)资源,使得CPU的使用率按照预设的模式运行,比如设置CPU的占用曲线。这样的技术在系统优化、...

    编程之美微软技术面试心得.doc

    例如,对于“CPU占用率曲线听你指挥”这个问题,面试官可以评估面试者的算法设计能力、编程能力和问题解决能力。 5. 技术面试的重要性:技术面试是企业招聘的重要环节,对面试者的技术能力和综合素质进行评估。 6....

    Delphi CPU占用率

    "Delphi CPU占用率"这个话题正是关注这样一个关键指标:一个由Delphi编写的程序在运行时如何影响系统的中央处理器(CPU)资源。Delphi是一种强大的对象 Pascal 编程语言和集成开发环境(IDE),用于构建高性能的...

    易语言画板动态显示CPU占用率

    在这个“易语言画板动态显示CPU占用率”项目中,我们主要探讨如何利用易语言来实时获取系统资源信息,并在画板上动态地展示CPU的使用情况。 首先,我们需要理解CPU占用率的概念。CPU占用率是指CPU正在处理的任务所...

    CPU占用率检测模块(易语言)

    在IT领域,CPU占用率是衡量计算机性能的重要指标之一,它反映了处理器在一段时间内执行任务的繁忙程度。易语言是一款中国本土开发的编程语言,旨在让编程变得更加简单、直观。本模块“CPU占用率检测模块”是专为...

    易语言取进程CPU占用率源码

    在IT领域,了解一个程序或进程的CPU占用率是非常重要的,这可以帮助我们分析系统的性能瓶颈,优化资源分配,以及诊断可能存在的问题。易语言是一种中国本土的编程语言,旨在简化编程过程,使得初学者也能快速上手。...

    CPU占用率测试工具

    2. 分析:通过观察哪个进程占用CPU最多,可以定位导致系统性能下降的原因。 3. 调优:针对高CPU占用的进程,可以尝试优化代码,减少不必要的计算,或者调整系统设置以降低其对CPU的依赖。 4. 报告:记录一段时间内的...

    易语言取指定进程CPU占用率源码.zip

    在本压缩包“易语言取指定进程CPU占用率源码.zip”中,包含了一个用易语言编写的程序,该程序能够获取指定进程的CPU占用率,这对于系统监控、性能分析以及优化程序性能等方面非常有用。 首先,我们需要理解CPU占用...

    用java获取CPU占用率

    在IT领域,特别是系统监控与性能分析中,获取CPU占用率是评估系统健康状况和优化资源分配的关键步骤。本文将详细解析如何使用Java语言来获取CPU占用率,这不仅涉及了基本的Java编程技巧,还深入到了操作系统级别的...

    程序控制cpu占用率

    在计算机编程领域,控制CPU占用率是一项常见的需求,特别是在资源管理、性能测试或者优化程序运行效率时。本文将深入探讨如何通过程序来控制CPU的占用率,并以标题中提到的"test_line_50%"为例,说明如何编写一个...

    Linux下如何查看某一进程的CPU占用率_linux进程cpu使用率.zip

    执行`top`命令后,按`P`键可以按CPU使用率排序进程,这样就可以快速找到占用CPU最多的进程。 2. **使用`ps`命令** `ps`命令用于报告当前系统的进程状态。你可以通过`ps -u 用户名`来查看指定用户的所有进程的CPU...

    CpuUsage(显示cpu利用动态曲线图)

    2. GUI编程:使用MFC(Microsoft Foundation Classes)或其他图形库创建用户界面,展示CPU利用率曲线。 3. 动态链接库(DLL):CpuDll.dll可能封装了操作系统调用,提供了跨进程共享代码的能力。 总结,CpuUsage是...

    CPU占用率高的九种可能

    例如,某些应用程序会在用户不知情的情况下启动多个进程,这些进程可能会持续占用CPU资源。清理不必要的后台进程可以帮助提高系统性能。 #### 九、多媒体播放器资源占用 使用多媒体播放器播放视频或音频文件时,...

    freertos下的cpu占用率统计.zip

    总的来说,"freertos下的cpu占用率统计"是一个实用的技术,对于理解和优化基于FreeRTOS的系统性能至关重要。通过合理的设计和实现,我们可以获得准确且实时的CPU使用情况,这对于系统调试和性能优化具有重要的参考...

    ideacpu占用率过高[造成cpu占用率过高的原因].pdf

    病毒和恶意软件会在系统中快速繁殖,大量占用CPU资源。应使用可靠的杀毒软件进行全盘扫描和清理,定期更新杀毒软件和防火墙,增强安全意识。 4. **系统服务RISINGREALTIMEMONITORSERVICE**: 如果该服务设置为...

    visual c++让多核CPU占用率达到100%

    本文将详细探讨如何使用Visual C++使多核CPU占用率达到100%,以及与之相关的OpenMP技术。 首先,`#pragma omp parallel` 是OpenMP中的一种指令,用于指示编译器创建一个并行区域。当执行到这个指令时,编译器会根据...

    asp.net监测CPU占用率-点线图展示

    在ASP.NET环境中,开发一个能够实时监测并展示CPU占用率的点线图是一个实用的功能,尤其对于系统管理员和开发者来说,能快速了解服务器性能状态。本文将深入探讨如何实现这个小Demo,主要涉及的知识点包括ASP.NET...

Global site tag (gtag.js) - Google Analytics