在空闲机器中使用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的工作方式有所不同。在没有任何其他进程的情况下,正在运行的进程将

在空闲机器中使用Perl脚本是否可以控制cpu的使用


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层,请使用: