2010-02-07 77 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()函數。你幾乎可以在任何地方插入一個寒冷的用戶級應用程序和多個地方。它之前用於複製較慢系統上看到的競爭條件。