程序控制CPU曲线
通过任务管理器我们可以看到现在我们的电脑中CPU以及内存的使用率,CPU的使用是由现在所运行的程序占用。但是我们有没有想过如何自己写一个程序去控制我们的CPU占用率呢?也许这是一个比较困难的事情,因为我们首先想到的是如何从底层去控制CPU。难道它真的有那么困难吗?也许不是,下面让我们去分析如何使我们的CPU显示直线和正弦曲线。
首先,我们需要知道什么是CPU使用率。
CPU使用率:CPU忙的时间与刷新周期时间的比率。
一:实现CPU显示一条直线
任务管理器每一秒钟刷新一次,要在这一秒钟内,使CPU的平均使用时间和空闲时间各占50%. 而不是让CPU使用1秒钟,空闲一秒钟。这样的话任务管理器出现的CPU的使用图像会是忽高忽低。windows的调度时间片为10ms, 所以在编写程序的时候就可以让cpu不停的工作10ms, 然后空闲10ms, 空闲操作通过sleep(10)来实现。这样最后任务管理器在刷新CPU占用率的时候就会得到这个一秒钟内的CPU的平均使用率。显示出50%的水平。
通过空循环,来让cpu保持繁忙的工作状态,通过sleep使cpu空闲。
机器指令最接近的是汇编语言。
空的for 循环,换成汇编语言是大概5句,现在的CPU可以在一个时钟周期执行两个机器指令,相当于执行两个汇编语句。
考虑到我的电脑的主频是1.0G,所以应该是每秒可以执行 1000000000*2/5=400000000 条空循环。 然而不能让机器执行一秒的空循环,应该分时间片的执行。一个时间片10ms, 所以执行空循环应该为4000000次。
代码如下:
package cpuWaveForm;
/**
* 控制CPU波形为直线的线程
* @author Andrew
*
*/
public class LineFormThread extends Thread{
int i=0;
public void run(){
while(true){
for(i=0; i<400000000; i++)
;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
上面的程序在我的电脑上运行后通过 资源管理器 查看
二:实现CPU显示一条正弦曲线
若实现CPU显示一条正弦曲线,我们可以写一个程序让CPU工作一段时间,Sleep一段时间以便让CPU显示曲线。
代码如下:
package cpuWaveForm;
/**
* 控制波形线程
* @author Andrew
*
*/
public class WaveFormThread extends Thread{
final double SPLIT = 0.01;//角度分割
final int COUNT = (int)(2/SPLIT);
final double PI = Math.PI;
final int INTERVAL = 200;
long[] busySpan = new long[COUNT];
long[] idleSpan = new long[COUNT];
int half = INTERVAL/2;
double radian = 0.0;
public void run(){
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]);
j++;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
以上代码在我的电脑上的运行结果为: