在空闲机器中使用Perl脚本是否可以控制cpu的使用?
在空闲机器中使用Perl脚本是否可以控制cpu的使用在空闲机器中使用Perl脚本是否可以控制cpu的使用?,perl,Perl,在空闲机器中使用Perl脚本是否可以控制cpu的使用 像some.pl 50将消耗50%的cpu,some.pl 100将消耗100%的cpu使用率。您无法真正告诉进程要使用多少cpu。相反,Unix使用优先级系统分配CPU。高优先级进程将比低优先级进程获得更多的CPU时间。一个低优先级的项目被称为。您可以通过使用nice启动程序来控制程序的优先级 nice some.pl 或者在使用renice运行时更改其优先级 Windows的工作方式有所不同。在没有任何其他进程的情况下,正在运行的进程将
像
some.pl 50
将消耗50%的cpu,some.pl 100
将消耗100%的cpu使用率。您无法真正告诉进程要使用多少cpu。相反,Unix使用优先级系统分配CPU。高优先级进程将比低优先级进程获得更多的CPU时间。一个低优先级的项目被称为。您可以通过使用nice
启动程序来控制程序的优先级
nice some.pl
或者在使用renice
运行时更改其优先级
Windows的工作方式有所不同。在没有任何其他进程的情况下,正在运行的进程将始终获得100%的收益,除非它以某种方式定期休眠
唯一的例外是多处理器机器,其中一个单线程进程只能获得一个CPU核心的100%。您可以通过以下方式粗略估计这一点
while (1) {
if ($load < .5) {
... do something ...
} else {
sleep(10);
}
}
while(1){
如果($load<.5){
…做点什么。。。
}否则{
睡眠(10);
}
}
为了建立足够的负载,您可能需要运行其中的多个。剩下的挑战是如何“做一些事情”来显著增加负载,但只运行几秒钟,并且不需要大量内存或I/O(素因子分解?)Schwern有正确的答案,但如果你想尝试一些东西,我建议你使用一个单独的线程来控制插件。在我看来,不得触碰实际代码。相反,我将尝试在代码的开头启动一个线程,每当CPU超过某个级别时,该线程都会生成中断或事件。当然,这一点都不容易,需要非常好地了解线程和(可能)信号量。唯一的优点是,如果你写得好,那么你也可以在其他插件中使用它。是的,这当然是可能的。下面的代码段计算某个进程在瞬间的处理器负载百分比。您可能首先希望收集一定数量的值,并对其进行平均,以获得平滑的结果 然后,简单地说,如果负载不够高,告诉流程进行工作,如果负载过高,告诉流程暂停工作
use constant UTIME => 13;
use constant STIME => 14;
use List::Util qw(sum);
use Time::HiRes qw(sleep);
use autodie qw(:all);
sub pidload {
my ($pid) = @_;
open my $pstat, '<', "/proc/$pid/stat";
my @pstat = split ' ', <$pstat>;
close $pstat;
return $pstat[UTIME] + $pstat[STIME];
}
sub cpuload {
open my $stat, '<', '/proc/stat';
my @total = split ' ', <$stat>;
close $stat;
shift @total;
return sum @total;
}
my ($pid) = @ARGV;
my $prev_cpu = cpuload;
my $prev_pid = pidload $pid;
while (1) {
sleep 0.1;
my $now_pid = pidload $pid;
my $now_cpu = cpuload;
printf "%.0f\n", 100*(($now_pid - $prev_pid) / ($now_cpu - $prev_cpu));
$prev_cpu = $now_cpu;
$prev_pid = $now_pid;
}
使用常量UTIME=>13;
使用常数STIME=>14;
使用列表::Util qw(总和);
使用时间:雇佣qw(睡眠);
使用autodie qw(:全部);
次级负载{
我的($pid)=@;
打开我的$pstat,“如果您的操作系统有BSD层,请使用: