【问题标题】:how to slow down a process?如何减慢进程?
【发布时间】:2013-03-11 01:18:13
【问题描述】:

假设我有一个程序在给定的时间内(比如三秒)运行。我想运行这个程序,使它运行慢 n 倍(在命令行上指定)。如果对程序进行更改(或更好,不更改),您将如何实现它?

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

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

假设程序是一个 C 编译程序。

【问题讨论】:

  • 使旧游戏在新计算机上运行的解决方案是在 DOSBox 中运行它们(我认为它在 386 或其他设备上模拟 DOS)。

标签: c performance


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我在我的 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
    

    【讨论】:

    • 这很好,但它会“打嗝”:)
    【解决方案3】:

    cpulimit 是一个可以做类似事情的工具。它通过周期性地 kill -STOPkill -CONT 进程来工作,这会导致它运行得更慢(随着时间的推移平均)。

    【讨论】:

    • 那个工具救了我,真的很有帮助,大大减少了我的备用 CPU 使用率(笔记本电脑温度下降得很快)
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      您可能会通过在虚拟机下运行虚拟机来进一步混淆情况,...

      【讨论】:

      • ... 顺便说一句,这是不可能的。
      • @Johannes Rudolph - 不是吗?谷歌搜索“嵌套虚拟机”会得到一些结果。例如:vcritical.com/2009/05/vmware-esx-4-can-even-virtualize-itself
      • 这种事我不会做,还有更实用的方法。
      • 确实,我发现减慢应用程序最方便的方法是在饥饿的虚拟机中运行它。 VirtualBox 非常容易配置。在 VM 下运行 VM 是可能的,尽管这很愚蠢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      相关资源
      最近更新 更多