玩转CPU运行曲线

Leaf

是不是从来没有想过看看cpu运行曲线啊骚年?顶多也就仅仅是看看cpu利用率,吓自己一跳后感觉关闭几个不该打开的程序~

然而问题来了,微软公司要让你绘制cpu运行曲线啊!!不仅是固定的直线,还要绝对值函数,还有正弦!!我的天这游戏还能玩?

Require

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

  1. CPU的占用率固定在50%,为一条直线
  2. CPI的占用率为一条直线,但是具体占用率由命令行参数决定(参数范围1~100)
  3. CPU的占用率状态是一个正弦曲线

Analysis

若不小心写了一个死循环,CPU的占用率就会跳到最高,并且一直保持在100%。我们也可以打开任务管理器,实际观察一下它是怎样变动的。凭肉眼观察,它大约是1秒钟更新一次。一般情况下,CPU使用率会很低。但是当一个用户运行一个程序,执行一些复杂操作的时候,CPU的使用率会急剧升高。当用户晃动鼠标时,CPU的使用率也会有小幅度的变化。 

当任务管理器报告的CPU使用率为0的时候,谁在使用CPU呢?通过任务管理器的进程(Process)一栏可以看到,System Idle Process占用了CPU的空闲的时间。系统中有那么多进程,它们什么时候能“闲下来”呢?答案很简单,这些程序或在等待用户的输入,或在等待某些事件的发生,或者主动进入休眠状态。

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

Solution

此处提供4种解法

【解法一】简单的解法

通过Busy loop() ,Sleep()来操作CPU的使用率曲线

需要了解的知识

http://blog.csdn.net/zhandoushi1982/article/details/6101515
http://blog.csdn.net/phunxm/article/details/9013535
 
#include <windows.h>
int main()
{
    for ( ; ; )
    {
        for ( int i= 0; i < 4000000000; i++) // 循环次数由具体cpu决定
            ;
        Sleep(10); // 看上面网址里的内容哟~
    }
    return 0;
}

【解法二】使用GetTickCount(()和Sleep()

通俗易懂,没什么好解释的,不懂的话就绝望吧,绝望一会就OK了

#include <windows.h>
int main()
{
    int busyTime = 10;  // 10 ms
    int idleTime = busyTime; // same ratio willlead to 50% cpu usage

    _int64 startTime = 0,middleTime = 0;
    while(true)
    {
        startTime = GetTickCount ();
        // busy loop
        while (((middleTime=GetTickCount ()) - startTime) <= busyTime)
            ;

        // idle loop
        Sleep(idleTime);
    }return 0;
}

【解法三】能动态适应的算法

因为注释着C#,所以我就并不想去理它了。额,对了,它用了Microsoft.Net Framework 提供的PerformanceCounter对象,不懂就去百度吧~

static void MakeUsage(float level)
{
    PerformanceCounter p = new PerformanceConter("Processor", "% ProcessorTime", "_Total");

    while(true)
    {
        if(p.NextValue() > level)
            Sysem.Threading.Thread.Sleep(10);
    }
}

【解法四】正弦曲线

好了,认真学完前三个的乖同学现在已经能编CPU的正弦曲线啦(不能的话我也帮不了你了。。原谅我括号里面打省略号。。)

现在直接上代码吧!!

#include "Windows.h"
#include "stdlib.h"
#include "math.h"

const double SPLIT = 0.01;
const int COUNT = 200;
const double PI = 3.14159265;
const int INTERVAL = 300;

int main()
{
    DWORD busySpan[COUNT];      // array of busy times
    DWORD idleSpan[COUNT];      // array of idle times
    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;
}

复制代码好玩吗?啊?哈哈哈,是不是觉得为什么我没有正弦曲线啊?这些方法并没有什么卵用,是不是这样觉得?其实是有用的,我不会告诉你的。有问题欢迎讨论

附上江湖代码一份

原址

http://www.cnblogs.com/Ripper-Y/archive/2012/05/19/2508511.html
 
#include <iostream>
#include <cmath>
#include <ctime>
#include <windows.h>

using namespace std;

//得到循环0xFFFFFFFF次用的秒数
unsigned int test()
{
    unsigned int c = 0xFFFFFFFF;

    time_t t1, t2;
    time(&t1);

    for(unsigned int i = 0; i < c; i++)
        ;
    time(&t2);
    return (unsigned int)(t2 -t1);

}

#define T  20000                                        //周期时间 20秒
#define C  100                                            //采样点时间间隔
#define PI 3.1415                                        //PI
const unsigned int count = 0xFFFFFFFF / (test() *1000); //采样间隔可以执行的循环数目
const unsigned int N = T/C;                                //周期内采样点数目
unsigned int v[N] = { 0 };                                //所有采样点连续执行循环数
unsigned int mt[N] = { 0 };                                //所有采样点休眠毫秒数

int main()
{
    //计算循环次数和休眠时间
    for(int i = 0; i < N; i++)
    {
        double x = 2 * PI * i / N;
        double r = (sin(x) + 1) / 2;

        mt[i] = C - r * C;
        v[i] = r * C * count;
    }
    for(;;)
    {
        for(int i = 0; i < N; i++)
        {
            for(int j = 0; j < v[i]; j++)
                ;
            Sleep(mt[i]);
        }
    }
    return 0;
}

Tree

第一节是关于硬件的知识,要学的东西真不少。对了,最近决定要学习Html+Css和数据加密所以我会非常忙!!其实我自己都不信。。好咯大概就是这么多咯,写着真累。整篇文章全手打,摘自编程之美~

时间: 2024-08-26 05:09:47

玩转CPU运行曲线的相关文章

android之cpu使用率曲线效果的实现!

最近做一个效果:在手机设置里面"关于手机"里面添加一项来显示当前手机cpu使用率的曲线!其实现效果如下图所示: 上图关于手机的第一项就是我要实现的效果!今天来讲讲这个曲线的view(cpu_speedcurve_view)是如何实现的! 首先要注意以下几点: (1)由于我设计的cpu_speedcurve_view不仅仅显示动态的曲线,还需要用textview显示一些cpu相关信息!所以,我选择cpu_speedcurve_view继承一个viewgroup,这里我选择的是FrameL

Python学习笔记——进阶篇【第八周】———CPU运行原理与多线程

CPU运行原理与多线程 什么是线程(thread)? 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务 进程是容器,线程是真正执行的任务单元

【转】多核CPU运行模式

多核CPU运行模式主要有以下三种: •非对称多处理(Asymmetric multiprocessing,AMP)——每个CPU内核运行一个独立的操作系统或同一操作系统的独立实例(instantiation). •对称多处理(Symmetric multiprocessing,SMP)——一个操作系统的实例可以同时管理所有CPU内核,且应用并不绑定某一个内核. •混合多处理(Bound multiprocessing,BMP)——一个操作系统的实例可以同时管理所有CPU内核,但每个应用被锁定于某

Keras/Tensorflow选择GPU/CPU运行

首先,导入os,再按照PCI_BUS_ID顺序,从0开始排列GPU, import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" 然后就可以选择用哪一个或者那几个GPU运行: os.environ[”zCUDA_VISIBLE_DEVICES”] = "0" 用0号GPU,即'/gpu:0'运行: os.environ[“CUDA_VISIBLE_DEVICES”] = “0,1” 用0号和1

让cpu运行程序(四)

如何编译汇编程序 这个汇编程序的编译对我们设计的CPU来说非常简单.按照我们设想的CPU中,程序存储器.数据存储器是分开的.因此,不用考虑程序和数据的混淆问题.此外,由于我们设想的指令系统是一条指令就占一个存储单元,所以标号的地址非常容易计算出来.如果我们确定了第一条指令存放的地址,那么从这条指令向后数数,就可以将标号确定下来. 对于变量在什么地方的问题,常常是一般作汇编程序设计的人较为迷惑的问题.产生迷惑的原因主要是我们自己不作变量地址分配.做为一个CPU 的设计者,不仅要对程序如何放入内存进

让cpu运行程序(一)

我们应当明确,按照自己的想法设计的CPU只是一个硬件,真正让CPU能够动作起来完成任务,那还要靠软件.所谓的软件就是用指令系统编写的程序,当然也要包括程序操作的数据对象.我们知道,电子计算机所能够表达信息的基本方式是二进制数,所以无论是数据还是指令,在CPU 内部都是以二进制数的形式存在的.我们直接通过二进制数与CPU这种机器交流,大多数人吃不消,即使是计算机专家,使用起来也相当费力.怎么办?用人们容易记忆的文字符号来表达CPU的指令,使用的数仍然用我们熟悉的十进制表示.这样就可以将CPU使用的

玩转CPU之直线

近期在看编程之美,看到第一个问题时,一下子就被吸引了,原来在windows 的任务管理器中还能够让CPU舞动起来,再一次的相信了编程中仅仅有想不到没有做不到,对于书中的做法和网上的实现大致都同样.只是在看后面的解法之前,我的解法和书中第一种简单的控制之法同样,并且我还引入了一个实时监測CPU主频的函数.能够移植到其它的PC上. #include <windows.h> #include <iostream> using namespace std; int size = 0; in

TQ2440开发板学习纪实(3)--- 设置时钟频率,让CPU运行的更快

0 原理 0.1 时钟源自哪里 所谓的时钟,就是电压高低的变化,只有不断的0,1交替变化,CPU才能被驱动运行.S3C2440支持多种时钟源,这通过CPU针脚OM3和OM3来选择.对于QT2440板子来说,OM3和OM2均直接接地,这就意味着时钟源来自针脚XTIpll和XTOpll,这两个针脚在TQ2440的核心板上被连接上了一个12MHz的晶振. 0.2 S3C2440的时钟原理与设置 CPU.RAM.UART等不同的设备运行时需要不同的时钟频率,这些不同的频率需要通过变频电路来提供,在电子行

matab版的faster-rcnn的window配置(cpu运行)

1.参考博客 http://blog.csdn.net/mr_curry/article/details/54745116 http://blog.csdn.net/btbujhj/article/details/53070810 在已经配置好的caffe-master(但未添加roi_pooling_layer)的情况下,将roi_pooling_layer头文件,cu文件和cpp文件手动加入到libcaffe中,为防止出现其他问题.参考博客http://www.cnblogs.com/Lap