红联Linux门户
Linux帮助

java程序占用linux固定CPU比例

发布时间:2015-10-04 10:01:35来源:linux网站作者:小白的学习日记

编写占用固定CPU比例的程序的关键是控制好Busy和Idle的比例,注意要在毫秒级别上控制,如果Busy的比例为60%,则CPU的利用率在60%左右,这里Busy可以是一个无限循环,而Idle可以是sleep(),在Java中,System.currentTimeMillis()获得的是从1970到现在的毫秒数,而Thead.sleep(400),也是指睡眠的毫秒数,因此java在linux下写此程序比较简单,下面是一个示例程序,其中Busy为600毫秒,Idle为400毫秒。这个程序在windows下不成功,windows下可参考下面内容。


此程序在linux多CPU多核下,也能正常运行。

public class Test { 
 
public static void main(String[] args) throws InterruptedException { 
while(true){ 
long start = System.currentTimeMillis(); 
long end = System.currentTimeMillis(); 
while(end-start<600){   //运行600毫秒 
end = System.currentTimeMillis(); 

Thread.sleep(400);  //睡眠400毫秒 

 

 
}


参考内容:C语言控制cpu使用率
<<编程之美>>。第一节,里面讲的是控制cpu的占有率,

cpu的占有率是由进程的忙和空闲来决定的,即 

rate=(busy_time)/(busy_time+idle_time);

怎么来控制它呢? busy可以用循环(这个循环用空循环,以便好控制),idle可以用sleep

比如先让任务管理器的cpu使用率始终保持在50%左右,那么在一个主循环中,

让空循环和sleep运行同样的一小段时间。sleep的时间好搞,空循环的怎么办呢?可以用cpu的主频估算出运行一个空循环所需要的时间,然后去设定空循环所要运行的次数,


比如:

while(true){  

//for 循环运行x次,使它的时间和sleep的时间相等

for(int i=0;i<x;i++);

sleep(time);

}

这种要估算cpu的运行速度,不太方便,准确性也不高。

《编程之美》里面介绍一种好的方法。在运行的时候设定空循环的运行时间

int start_time=click();

while((click()-start_time)<runtime);

这样就能使空循环运行runtime 毫秒

有了这个只要设定一下循环和sleep的比例就可以随意控制任务管理器中的cpu的使用率了,


下面用任务管理器画个弦函数图像

#include <iostream> 
#include <math.h> 
#include <stdlib.h>  
#include <windows.h> 
using namespace std; 
 
int main() 

const float PI=3.1416; 
int count=180; //时间数组的个数  
int idle[count]; 
int busy[count]; 
float delta=2*PI/count; 
float alpha=0; 
/*
给循环和sleep各生成一列时间数组 
busy按照正弦规律变化,busy和对应的sleep的和不变 
*/ 
for(int i=0;i<count;i++) 

busy[i]=count*(sin(alpha)+1)/2; 
idle[i]=count-busy[i]; 
alpha=alpha+delta; 
cout<<busy[i]<<"---"<<idle[i]<<endl;  

  
int j=0; 
int st_time; 
while(true) 
{
j=j%count; 
st_time=clock(); //起始时间  
while((clock()-st_time)<busy[j]); 
Sleep(idle[j]); 
j++; 
}
system("PAUSE"); 
return 0; 
}

java程序占用linux固定CPU比例

不过图片还是没有那么完美。有时突然蹦起来,可能是机器的原因,这是在pentium二 400M 主频,130M内存下测试的。书上还说在双核上的效果是一样的,不过这个机器就无能为力了!


Linux中部署JAVA程序:http://www.linuxdiyf.com/linux/12172.html

Linux下独立执行Java程序:http://www.linuxdiyf.com/linux/7552.html