2010-02-07 18 views
8

Supongamos que tengo un programa que se ejecuta en un período de tiempo determinado (por ejemplo, tres segundos). Quiero ejecutar este programa para que se ejecute n veces más lento (especificado en la línea de comandos). ¿Cómo lo lograrías con (o mejor, sin) cambios en el programa?cómo ralentizar un proceso?

tenga en cuenta que agregar una suspensión al final no es una solución. El programa tiene que correr más lento, no para funcionar a máxima velocidad durante los primeros tres segundos y luego no hacer nada por el tiempo restante. Además, usar "nice" en Unix tampoco es una buena solución. funcionará más despacio si otros procesos exigen el procesador, pero a toda velocidad si nada es exigente con el procesador al mismo tiempo.

Esta es una pregunta de curiosidad. Nada serio que hacer relacionado con eso. El hecho es que recuerdo que hace 15-20 años los juegos eran simplemente demasiado rápidos para jugar en los procesadores nuevos, porque estaban sincronizados con el reloj del procesador. Tuviste que apagar el turbo.

Supongamos que el programa es un programa compilado en C.

+2

La solución para hacer que los juegos viejos funcionen en computadoras nuevas es ejecutarlos en DOSBox (creo que emula DOS en un 386 o algo así). –

Respuesta

5

Una idea es escribir un 'corredor ptrace.' ptrace es la llamada que le permite implementar un depurador en plataformas como Linux y Mac.

La idea es adjuntar al programa y luego simplemente decirle repetidamente a la aplicación que ejecute una instrucción con ptrace(PTACE_SINGLESTEP). Si eso no es lo suficientemente lento, puede agregar un descanso entre cada llamada para dar seguimiento en el programa corredor.

-6

Ejecuté algunas aplicaciones en una máquina virtual bajo ubuntu. Fue realmente lento. Puede configurar el uso de la máquina virtual del sistema.

Es posible confundir la situación un poco más lejos mediante la ejecución de una máquina virtual en una máquina virtual en una máquina virtual, ...

+0

... que no es posible por cierto. –

+1

@Johannes Rudolph - ¿No es así? Buscar en Google "máquinas virtuales anidadas" obtiene algunos resultados. Por ejemplo: http://www.vcritical.com/2009/05/vmware-esx-4-can-even-virtualize-itself/ –

+0

No haré algo así, hay formas más prácticas de hacerlo. – v01d

5

me escribió un ejemplo sencillo en mi máquina Linux cómo frenar un proceso hijo con SIGSTOP y SIGCONT señales:

#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)); 
} 

Sin desaceleración cuando WAIT es cero, de lo contrario después de cada RUN segundos el padre detiene al niño para WAIT segundos.

resultados en tiempo de ejecución:

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 
+0

es bueno, pero se ejecutará en "hipo" :) –

2

cpulimit es una herramienta que hace algo como esto. Funciona periódicamente mediante el proceso kill -STOP y kill -CONT, que tiene el efecto de que se ejecuta más lento (cuando se promedia a lo largo del tiempo).

+0

Esa herramienta me salvó, realmente útil, redujo mucho el uso de la CPU de respaldo (y la temperatura de la computadora portátil bajó bastante rápido) –

0

Si tiene DTrace, es posible que pueda utilizar su función chill(). Puede insertar este enfriamiento en casi cualquier lugar en una aplicación de usuario y en múltiples lugares. Se ha utilizado antes para replicar las condiciones de carrera que se ven en los sistemas más lentos.

Cuestiones relacionadas