第1章 游戏之乐——让CPU占用率曲线听你指挥
让CPU占用率曲线听你指挥
写一个程序,让用于来决定Windows任务管理器(Task Manager)的CPU占用率。程序越精简越好,计算机语言不限。例如,可以实现下面三种情况:
- CPU的占用率固定在50%,为一条直线;
- CPU的占用率为一条直线,但是具体占用率由命令行参数决定(参数范围1~100);
- 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占用率曲线听你指挥的更多相关文章
- 让cpu占用率曲线听你指挥(多核处理器)
编程之美 1.1 让cpu占用率曲线听你指挥(多核处理器) [版权声明]转载请注明出处 http://www.cnblogs.com/TenosDoIt/p/3242910.html [目录] 不考 ...
- 1.1 让CPU占用率曲线听你指挥[cpu manager]
[本文链接] http://www.cnblogs.com/hellogiser/p/cpu-manager.html [题目] 写一个程序,让用户来决定Windows任务管理器(Task Manag ...
- 编程之美_1.1 让CPU占用率曲线听你指挥
听到有人说让要写一个程序,让用户来决定Windows任务管理器的CPU占用率. 觉得很好奇.但第一个想法就是写个死循环.哈哈.不知道具体的占用率是多少,但至少能保证在程序运行时,CPU的占用率终会稳定 ...
- 编程之美 1.1 让cpu占用率曲线听你指挥(多核处理器)
[目录] 不考虑其他进程,cpu画正弦曲线 获取总体cpu利用率 获取多核处理器单个cpu利用率 考虑其他进程,cpu画正弦曲线 下面的程序针对多核处理器,可以设置让任何一个cpu显示相应的曲线(本文 ...
- 让CPU占用率曲线听你指挥
使用GetTickCount()和Sleep(): Code#include <stdio.h> #include <unistd.h> #include <time.h ...
- 编程之美读书笔记1.1——让CPU占用率曲线听你的指挥
http://blog.csdn.net/pipisorry/article/details/36189155 <strong><span style="font-size ...
- 让CPU的占有率曲线听我指挥
最近我要在公司的一个study group负责AWS的AutoScaling功能的介绍.AWS可以根据instance(虚拟机)的CPU使用量进行scaling. 为了做demo,于是就有这样一个需求 ...
- 控制CPU占用率曲线
编程之美的第一个问题,我的机器是双核的,用文中的代码,得到的曲线波动比较大额,受其他进程的影响比较大.文中提到10ms接近windows的调度时间片,如果选得太小,会造成线程被频繁唤醒和挂起,造成内核 ...
- 编程之美 之 让CPU占用率听你指挥
昨天在bbs上淘到了这本编程之美.顺手刷了第一章,很有意思.第一章的要求是要控制CPU曲线,绘制出对应的形状. 拿到这个问题,我的第一反应是, 是不是有这么一个API,能在任务管理器上的对应区域直接绘 ...
随机推荐
- CSStickyHeaderFlowLayout collectionView headerView 悬浮
github:https://github.com/levyleo/CSStickyHeaderFlowLayout iOS 10 使用时会出现崩溃:https://github.com/CSStic ...
- HDU ACM 1515 Anagrams by Stack
Anagrams by Stack Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- django1.77+mod_wsgi+python2.79+apache2.24 在阿里云centos部署攻略
心平气和的记录一下今天 踩的坑以防万一 以后还踩 首先我今天的平台是在 阿里云上的一台纯净版的 centos6.5 64位主机上进行的 首先装python2.7 去官网下载python2.7安装包 然 ...
- 利用AuthorizeAttribute属性简单避免 MVC 中的跨域攻击
跨域攻击---自然来路页面和目标页面不在同一个域下,所以直接判断来路域和当前自己的域就可以了. 可以广泛应用于表单提交,ajax调用或者某些不想让用户直接输入网址看到的页面 [csharp] view ...
- this compilation unit is not on the build of a java project
this compilation unit is not on the build of a java project java里输入代码就出这个提示,无法写代码了. 找到觉得路径打开文件编辑就好了, ...
- 制作Andriod程序的数字签名需要使用JDK
原文地址:制作Andriod程序的数字签名需要使用JDK作者:黄金大劫案88 制作Andriod程序的数字签名需要使用JDK,先确认本机是否安装了JDK,在JDK目录下有一个KEYTOOL工具,这个 ...
- int* V.S. int[]
[int* V.S. int[]] 在C++中,int[]有2种形态,一种是指针形态,即使用方法和int*一样,另一种是符号形态,即只是一个编译期的符号(意味着在runtime期,所定义的int[]根 ...
- CCS5 编译器手动设置dsp支持可变参数宏等问题
IDE:CSS5.4,compiler不支持可变参数宏.需要手动设置编译器相关选项: Language Option->Language Mode —>no strict ANSI. 1. ...
- URAL 2070 Interesting Numbers (找规律)
题意:在[L, R]之间求:x是个素数,因子个数是素数,同时满足两个条件,或者同时不满足两个条件的数的个数. 析:很明显所有的素数,因数都是2,是素数,所以我们只要算不是素数但因子是素数的数目就好,然 ...
- How Tomcat Works(十二)
tomcat容器通过一个称为Session管理器的组件来管理建立的Session对象,该组件由org.apache.catalina.Manager接口表示:Session管理器必须与一个Contex ...