让CPU占用率曲线听你指挥

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

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

【解法一】 简单的解法

  一个空的for循环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时则重复循环

需要执行5条代码,假设要运行的CPU是2.66Ghz(2.66*10^9个时钟周期每秒)。现在CPU每个时钟周期可以执行两条以上的代码,那么我们就取平均值两条,于是让(2660000000*2)/5=1064000000(循环/秒),如果让CPU工作1秒钟,然后休息1秒钟,波形很可能就是锯齿状的——先达到一个峰值(>50%),然后跌到一个很低的占用率。

于是尝试降两个数量级。用10ms是因为它不大不小,比较接近Windows的调度时间片。如果太小会造成线程频繁被唤醒和挂起,无形中增加了内核时间的不确定性影响。最后我们得到如下代码:

package chapter1youxizhile;
/**
* 【解法一】简单的方法
* 运行的CPU是2.66Ghz(2.66*10^9个时钟周期每秒)
* @author DELL
*
*/
public class ControlCPU1 { public static void main(String[] args) {
for( ; ; ){
for(int i=0;i<10640000;i++); //运行10ms
try {
Thread.sleep(10); //休眠10ms
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} } }

  在不断调整10640000后,我们就可以在一台指定的机器上获得一条大致稳定的50%CPU占用率直线。

【解法二】使用System.currentTimeMillis()和Thread.sleep()

package chapter1youxizhile;
/**
* 【解法二】使用System.currentTimeMillis()和Thread.sleep()
* 运行的CPU是2.66Ghz(2.66*10^9个时钟周期每秒)
* @author DELL
*
*/
public class CopyOfControlCPU2 { public static void main(String[] args) {
int busyTime = 10; //繁忙时间10ms
int idleTime = busyTime; //空闲时间
while(true){
long startTime = System.currentTimeMillis(); //获取系统运行时间
while(System.currentTimeMillis()-startTime<= busyTime) ;
try {
Thread.sleep(idleTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} } }

效果如下:

  这两种解法都是假设目前系统上只有当前程序在运行,但实际上,操作系统中有很多程序会同时执行各种各样的任务,如果此刻其他进程使用了10%的CPU,那么我们的程序应该只能使用40%的CPU,这样才能达到50%的效果。

  怎么做呢?这就需要用到另个工具的帮忙——Perform.exe。如下图所示:

  我们可以写程序来查询Perform的值,Mircrosoft .Net Framework提供了PerformanceCounter这一对象,可以方便地得到当前各种性能的数据,包括CPU的使用率。例如下面这个程序:

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

//C# code
static void MakeUsage(float level)
{
PerformanceCounter p = new PerformanceCounter("Processor", "% Processor Time", "_Total");
while(true)
{
if(p.NextValue()>level)
System.Threading.Thread.Sleep();
}
}

  可以看到,上面的解法能方便地处理各种CPU使用率的参数。这个程序可以解答前面提到的问题2。

【解法四】正弦曲线

package chapter1youxizhile;
/**
* 【解法四】正弦曲线
* @author DELL
*
*/
public class CopyOfCopyOfControlCPU4 {
static final double SPLIT = 0.01; //2PI周期步长
static final int COUNT = 200; //取点个数
static final double PI = 3.1415926;
static final int INTERVAL = 300; //空闲和繁忙的总时间
public static void main(String[] args) {
long busySpan[]; //CPU繁忙时间的数组
long idleSpan[]; //CPU空闲时间的数组
busySpan = new long[COUNT];
idleSpan = new long[COUNT];
int half = INTERVAL/2;
double radian = 0.0;
for(int i=0;i<COUNT;i++){
busySpan[i] = (long) (half+(Math.sin(PI*radian)*half));
idleSpan[i] = INTERVAL - busySpan[i];
radian += SPLIT;
}
long startTime = 0;
int j = 0;
while(true){
j = j%COUNT; //实现周期循环
startTime = System.currentTimeMillis();
while((System.currentTimeMillis()-startTime)<=busySpan[j]) ;
try {
Thread.sleep(idleSpan[j]);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
j++;
}
} }

程序运行后任务管理器效果如下:

第1章 游戏之乐——让CPU占用率曲线听你指挥的更多相关文章

  1. 让cpu占用率曲线听你指挥(多核处理器)

    编程之美 1.1 让cpu占用率曲线听你指挥(多核处理器) [版权声明]转载请注明出处 http://www.cnblogs.com/TenosDoIt/p/3242910.html  [目录] 不考 ...

  2. 1.1 让CPU占用率曲线听你指挥[cpu manager]

    [本文链接] http://www.cnblogs.com/hellogiser/p/cpu-manager.html [题目] 写一个程序,让用户来决定Windows任务管理器(Task Manag ...

  3. 编程之美_1.1 让CPU占用率曲线听你指挥

    听到有人说让要写一个程序,让用户来决定Windows任务管理器的CPU占用率. 觉得很好奇.但第一个想法就是写个死循环.哈哈.不知道具体的占用率是多少,但至少能保证在程序运行时,CPU的占用率终会稳定 ...

  4. 编程之美 1.1 让cpu占用率曲线听你指挥(多核处理器)

    [目录] 不考虑其他进程,cpu画正弦曲线 获取总体cpu利用率 获取多核处理器单个cpu利用率 考虑其他进程,cpu画正弦曲线 下面的程序针对多核处理器,可以设置让任何一个cpu显示相应的曲线(本文 ...

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

    使用GetTickCount()和Sleep(): Code#include <stdio.h> #include <unistd.h> #include <time.h ...

  6. 编程之美读书笔记1.1——让CPU占用率曲线听你的指挥

    http://blog.csdn.net/pipisorry/article/details/36189155 <strong><span style="font-size ...

  7. 让CPU的占有率曲线听我指挥

    最近我要在公司的一个study group负责AWS的AutoScaling功能的介绍.AWS可以根据instance(虚拟机)的CPU使用量进行scaling. 为了做demo,于是就有这样一个需求 ...

  8. 控制CPU占用率曲线

    编程之美的第一个问题,我的机器是双核的,用文中的代码,得到的曲线波动比较大额,受其他进程的影响比较大.文中提到10ms接近windows的调度时间片,如果选得太小,会造成线程被频繁唤醒和挂起,造成内核 ...

  9. 编程之美 之 让CPU占用率听你指挥

    昨天在bbs上淘到了这本编程之美.顺手刷了第一章,很有意思.第一章的要求是要控制CPU曲线,绘制出对应的形状. 拿到这个问题,我的第一反应是, 是不是有这么一个API,能在任务管理器上的对应区域直接绘 ...

随机推荐

  1. 创建被访问的swf文件

    首先创建一个fla文件,名字叫movie.fla,在该文件库中放一个mc, 并将其拖放到舞台上,然后 命名为test_mc, 然后在库中给该mc绑定一个类,类名随意. 创建访问swf文件的swf文件 ...

  2. AWS Summit 2014 San Francisco站总结

    我上个月去San Francisco参加了AWS Summit 2014 会议,总结一下参加这个会议的情况. 什么是AWS Summit? AWS Summit 是AWS在全球各地举办的,针对AWS用 ...

  3. Hadoop 中疑问解析

    Hadoop 中疑问解析 FAQ问题剖析 一.HDFS 文件备份与数据安全性分析1 HDFS 原理分析1.1 Hdfs master/slave模型 hdfs采用的是master/slave模型,一个 ...

  4. 桶排序-Node.js-对象排序

    const b = [{index:5,name:"s5"}, {index:2,name:"s2"}, {index:3,name:"s3" ...

  5. geeksforgeeks@ Find sum of different corresponding bits for all pairs (Bit manipulation)

    http://www.practice.geeksforgeeks.org/problem-page.php?pid=387 Find sum of different corresponding b ...

  6. dom div移动解决停顿问题

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  7. jQuery和js如何判断checkbox是否选中

    jquery: <div id="divId" class="divTable"><div class="tableBody&quo ...

  8. return View()

  9. ProxyFactory的一个问题

    今天写了一段很简单的代码,但一直都有问题.代码如下. 接口定义 using System; using System.Collections.Generic; using System.Linq; u ...

  10. python知识点 07-11

    python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 python的 nonlocal关键字用来在函数或其他作用域中使用 ...