как замедлить процесс? - PullRequest
8 голосов
/ 07 февраля 2010

Предположим, у меня есть программа, которая запускается за определенное время (скажем, три секунды).Я хочу запустить эту программу, чтобы она работала в n раз медленнее (указано в командной строке).Как бы вы достигли этого с (или лучше без изменений) в программе?

обратите внимание, что добавление спящего режима в конце не является решением.Программа должна работать медленнее, не запускаться на полной скорости в течение первых трех секунд, а затем ничего не делать в течение оставшегося времени.Кроме того, использование «nice» под unix также не является хорошим решением.он будет работать медленнее, если другие процессы требуют процессора, но на полной скорости, если одновременно ничего не требует процессора.

Это вопрос любопытства.Ничего серьезного, связанного с этим.Дело в том, что я помню игры 15-20 лет назад, которые были слишком быстрыми, чтобы играть на новых процессорах, потому что они были рассчитаны с тактовой частотой процессора.Вы должны были выключить турбо.

Давайте предположим, что программа является скомпилированной программой на Си.

Ответы [ 5 ]

5 голосов
/ 07 февраля 2010

Одна идея состоит в том, чтобы написать 'ptrace runner.' ptrace - это вызов, который позволяет реализовать отладчик на таких платформах, как Linux и Mac.

Идея состоит в том, чтобы присоединиться к программе, а затем просто несколько раз сказать приложению запустить одну инструкцию с ptrace(PTACE_SINGLESTEP). Если это не достаточно медленно, вы можете добавить режим сна между каждым вызовом ptrace в программе выполнения.

5 голосов
/ 07 февраля 2010

Я написал простой пример на моем компьютере с Linux, как замедлить дочерний процесс с помощью сигналов SIGSTOP и SIGCONT:

#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>

void dosomething(void){
  static volatile unsigned char buffer[1000000];
  for(unsigned i=0;i<1000;i++) for(unsigned j=0;j<sizeof(buffer);buffer[j++]=i){;}
}

#define RUN  1
#define WAIT 1

int main(void){
  int delay=0, status, pid = fork();
  if( !pid ){ kill(getpid(),SIGSTOP); dosomething(); return 0; }
  do{
    waitpid( pid, &status, WUNTRACED | WCONTINUED );
    if( WIFSTOPPED  (status)         ){ sleep(delay); kill(pid,SIGCONT); }
    if( WIFCONTINUED(status) && WAIT ){ sleep(RUN  ); kill(pid,SIGSTOP); }
    delay=WAIT;
  }while( !WIFEXITED(status) && !WIFSIGNALED (status) );
}

Нет замедления, когда WAIT равен нулю, в противном случае после каждых RUN секунд родитель останавливает ребенка на WAIT секунд.

Результаты выполнения:

RUN=1 WAIT=0
---------------
real     3.905s
user     3.704s
sys      0.012s

RUN=1 WAIT=1
---------------
real     9.061s
user     3.640s
sys      0.016s

RUN=1 WAIT=2
---------------
real    13.027s
user     3.372s
sys      0.032s
2 голосов
/ 07 февраля 2010

cpulimit - это инструмент, который делает что-то подобное. Он работает периодически kill -STOP и kill -CONT процессом, в результате чего он работает медленнее (при усреднении по времени).

0 голосов
/ 10 марта 2013

Если у вас есть DTrace, вы можете использовать функцию chill () . Вы можете вставить этот холод практически в любом месте в приложении пользователя и в нескольких местах. Ранее он использовался для репликации условий гонки, наблюдаемых в более медленных системах.

0 голосов
/ 07 февраля 2010

Я запустил какое-то приложение на виртуальной машине под Ubuntu. Это было действительно медленно. Вы можете настроить использование виртуальной машины в системе.

Вы могли бы немного запутать ситуацию, запустив виртуальную машину под виртуальной машиной под виртуальной машиной, ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...