程序控制CPU显示特定曲线

         程序控制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();
			}
		}
	}
}

    以上代码在我的电脑上的运行结果为:



 

猜你喜欢

转载自blog.csdn.net/Andreaw/article/details/84382998