В радиотехнике есть такая хренота, называется обратная связь.
Допустим ты форкаешься на два процесса. Первый смотрит каждую секунду
вывод программы top, и через пайп передаат данные второму процессу,
который в зависимости значений загрузки проца умеет повышать или понижать множитель в цикле фор. Эта вот идея и есть обратная связь. Только в проводнике там частоты или заряды таким образом сравниваются... На перле это сделать нехитро через eval например...
например както так:
usr/bin/perl
parent
@mass=qx[top];
какннить через IPC
child
if $mass[1]>=20% then begin sub {$c++ foreach my $xx($xx=0; $xx++; $cc<=sqr($cc)){$'}} end
if $mass[1]<=20% then begin sub {$c-- foreach my $xx1($xx=0; $xx++; $cc<=sqr($cc)){$'}} end
Она довольно долго выходит на заданную загрузку.
Надо поиграться с шагом увеличения переменной counter в коде ниже
(с одной стороны, чем шаг больше, тем быстрее находится нужный вес,
с другой стороны, чем больше шаг, тем сильнее).