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 ms
int idleTime = busyTime; // same ratio willlead to 50% cpu usage _int64 startTime = ,middleTime = ;
while(true)
{
startTime = GetTickCount ();
// busy loop
while (((middleTime=GetTickCount ()) - startTime) <= busyTime)
; // idle loop
Sleep(idleTime);
}return ;
}

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

因为注释着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();
}
}

【解法四】正弦曲线

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

现在直接上代码吧!!

#include "Windows.h"
#include "stdlib.h"
#include "math.h" const double SPLIT = 0.01;
const int COUNT = ;
const double PI = 3.14159265;
const int INTERVAL = ; int main()
{
DWORD busySpan[COUNT]; // array of busy times
DWORD idleSpan[COUNT]; // array of idle times
int half = INTERVAL / ;
double radian = 0.0;
for ( int i = ; i < COUNT; i++)
{
busySpan[i] = (DWORD)(half + (sin(PI * radian) * half));
idleSpan[i] = INTERVAL - busySpan[i];
radian += SPLIT;
} DWORD startTime = ;
int j = ;
while(true)
{
j = j % COUNT;
startTime = GetTickCount();
while((GetTickCount() - startTime) <= busySpan[j])
;
Sleep(idleSpan[j]);
j++; }
return ;
}

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

附上江湖代码一份

原址

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 = ; 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() *); //采样间隔可以执行的循环数目
const unsigned int N = T/C; //周期内采样点数目
unsigned int v[N] = { }; //所有采样点连续执行循环数
unsigned int mt[N] = { }; //所有采样点休眠毫秒数 int main()
{
//计算循环次数和休眠时间
for(int i = ; i < N; i++)
{
double x = * PI * i / N;
double r = (sin(x) + ) / ; mt[i] = C - r * C;
v[i] = r * C * count;
}
for(;;)
{
for(int i = ; i < N; i++)
{
for(int j = ; j < v[i]; j++)
;
Sleep(mt[i]);
}
}
return ;
}

Tree

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

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

  1. [C++]让CPU使用率曲线呈现为正弦曲线(一)

    看<编程之美>的第一题就很有意思: 写一个程序,让用户来决定Windows任务管理器的CPU占用率.可以实现下面三种情况: 1. CPU的占用率固定在50%,为一条直线: 2. CPU的占 ...

  2. 深入理解 Linux Cgroup 系列(二):玩转 CPU

    原文链接:深入理解 Linux Cgroup 系列(二):玩转 CPU 上篇文章主要介绍了 cgroup 的一些基本概念,包括其在 CentOS 系统中的默认设置和控制工具,并以 CPU 为例阐述 c ...

  3. 【转】多核CPU运行模式

    多核CPU运行模式主要有以下三种: •非对称多处理(Asymmetric multiprocessing,AMP)——每个CPU内核运行一个独立的操作系统或同一操作系统的独立实例(instantiat ...

  4. Keras/Tensorflow选择GPU/CPU运行

    首先,导入os,再按照PCI_BUS_ID顺序,从0开始排列GPU, import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_B ...

  5. Process和Thread在指定CPU运行

    最近帮朋友写了一个多线程程序,他那边一运行多线程就出错,我这边却没有任何问题,找了好久才找到解决方法,原来是CPU的问题,有朋友遇到同样的问题,可以一起参考 //进程与指定cpu绑定 SetProce ...

  6. ubuntu16.04下caffe以cpu运行faster rcnn demo

    参考https://haoyu.love/blog404.html 获取并修改代码 首先,我们需要获取源代码: git clone --recursive https://github.com/rbg ...

  7. 玩转CPU之直线

    近期在看编程之美,看到第一个问题时,一下子就被吸引了,原来在windows 的任务管理器中还能够让CPU舞动起来,再一次的相信了编程中仅仅有想不到没有做不到,对于书中的做法和网上的实现大致都同样.只是 ...

  8. GPU版TensorFlow怎么指定让CPU运行

    由于某些原因GPU版的TensorFlow运行起来会出现一些问题,比如内存溢出等情况.此时我们可以用CPU和系统内存来运行我们的程序. 代码如下: import osos.environ[" ...

  9. 软硬件协同编程 - C#玩转CPU高速缓存(附示例)

    写在前面 好久没有写博客了,一直在不断地探索响应式DDD,又get到了很多新知识,解惑了很多老问题,最近读了Martin Fowler大师一篇非常精彩的博客The LMAX Architecture, ...

随机推荐

  1. TCP Operational Overview and the TCP Finite State Machine (FSM) http://tcpipguide.com/free/t_TCPOperationalOverviewandtheTCPFiniteStateMachineF.htm

    http://tcpipguide.com/free/t_TCPOperationalOverviewandtheTCPFiniteStateMachineF.htm   http://tcpipgu ...

  2. linux系统编程之进程(七):system()函数使用【转】

    本文转载自:http://www.cnblogs.com/mickole/p/3187974.html 一,system()理解 功能:system()函数调用“/bin/sh -c command” ...

  3. android 自定义View开发实战(六) 可拖动的GridView

    1前言 由于项目需求,需要把项目的主界面采用GridView显示,并且需要根据模块优先级支持拖动图标(砍死产品狗).为此,自定义了一个支持拖拽图标的GridView.效果如下: 具体效果如上图 2 可 ...

  4. TCP/IP协议与Http协议的区别

    转自:https://www.cnblogs.com/xianlei/p/tcpip_http.html TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如 ...

  5. ObjectInputStream与ObjectOutputStream类实现对象的存取

    1. ObjectInputStream与ObjectOutputStream类所读写的对象必须实现Serializable接口,对象中的transient和static类型成员变量不会被读取和写入 ...

  6. 【WIP】外汇与证券交易29个技术指标

    创建: 2017/05/16   更新: 2017/05/30 更新: 2017/10/14 标题加上[WIP],增加创建时间  指标名称  函数原型(prototype)  参考与分析 (refer ...

  7. Educational Codeforces Round 19 E. Array Queries(暴力)(DP)

    传送门 题意 给出n个数,q个询问,每个询问有两个数p,k,询问p+k+a[p]操作几次后超过n 分析 分块处理,在k<sqrt(n)时,用dp,大于sqrt(n)用暴力 trick 代码 #i ...

  8. 如何管理第三方接口token过期时间

    背景: 随着微服务的盛行,做开发时不可避免的要涉及第三方接口,安全起见,这些接口都会需要一个token参数.而token一般都会有一个过期时间,比如2小时或者30分钟.那么如何在自己的应用中存储并管理 ...

  9. Vim 插件的安装

    Vim 自带了文本格式化,通过 gg=G 触发.但大数情况下不满足需求,对于特定语言,比如 JavaScript,需要安装相应的插件来实现. 插件的存在形式 Vim 插件以三种形式存在, 单个的 .v ...

  10. dllMain函数

    Windows在加载DLL的时候,需要一个入口函数,就如同控制台或DOS程序需要main函数.Win32程序需要WinMain函数一样.一些例子中,DLL并没有提供DllMain函数,应用工程也能成功 ...