2010-02-07 79 views
8

假设我有一段程序在给定的时间内运行(比如三秒钟)。我想运行这个程序,使其运行速度慢n倍(在命令行中指定)。你如何实现(或更好,没有)程序的变化?如何减慢过程?

请注意,在最后添加睡眠不是一个解决方案。程序必须运行得更慢,而不是在前三秒全速运行,然后对剩余时间不做任何处理。另外,在unix下使用“nice”也不是一个好的解决方案。如果其他进程需要处理器,它将运行得更慢,但如果同时没有任何处理器需求,它将全速运行。

这是一个好奇的问题。没有什么严重的事情可以做到。事实是,我记得15 - 20年前的游戏太快了,无法在新处理器上玩,因为它们是用处理器时钟计时的。你必须关闭涡轮。

我们假设程序是一个C编译的程序。

+2

让旧游戏在新电脑上工作的解决方案是在DOSBox中运行它们(我认为它在386上模拟DOS)。 – 2010-02-07 08:19:01

回答

5

一个想法是写一个“ptrace的选手。” ptrace是允许您在Linux和Mac等平台上实现调试器的调用。

这个想法是附加到程序,然后只是反复告诉应用程序运行ptrace(PTACE_SINGLESTEP)一条指令。如果速度不够慢,您可以在跑步程序中每次调用ptrace之间添加一次睡眠。

-6

我在ubuntu下的虚拟机中运行了一些应用程序。这真的很慢。 您可以配置系统的虚拟机使用情况。

您可以通过虚拟机下虚拟机下运行的虚拟机,混淆情况远一点......

+0

...这是不可能的顺便说一句。 – 2010-02-07 12:23:21

+1

@Johannes鲁道夫 - 不是吗?谷歌搜索“嵌套虚拟机”获得一些结果。例如:http://www.vcritical.com/2009/05/vmware-esx-4-can-even-virtualize-itself/ – 2010-12-17 18:35:54

+0

我不会这样做,有更实际的方法来做到这一点。 – v01d 2012-06-25 14:29:43

5

我写了一篇关于我的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 
+0

这很好,但它会运行在“打嗝”:) – 2010-02-23 10:44:40

2

cpulimit是一个工具,做这样的事情。它通过定期 kill -STOPkill -CONT这个过程运行,其效果是运行速度较慢(随着时间的推移而平均)。

+0

该工具救了我,真的很有帮助,减少了我的备份cpu使用量(很多笔记本电脑的温度下降得相当快) – 2014-02-15 23:45:41

0

如果你有DTrace,你可以使用它的 chill()函数。你几乎可以在任何地方插入一个寒冷的用户级应用程序和多个地方。它之前用于复制较慢系统上看到的竞争条件。