2010-02-07 9 views
8

मान लीजिए मेरे पास एक ऐसा प्रोग्राम है जो किसी निश्चित समय में चलता है (कहें, तीन सेकंड)। मैं इस कार्यक्रम को चलाने के लिए चाहता हूं ताकि यह एन-बार धीमा हो (कमांड लाइन पर निर्दिष्ट)। प्रोग्राम में परिवर्तन (या बेहतर, बिना) के साथ आप इसे कैसे प्राप्त करेंगे?प्रक्रिया को धीमा करने के लिए कैसे?

कृपया ध्यान दें कि अंत में नींद जोड़ना समाधान नहीं है। कार्यक्रम को धीमे चलाना है, पहले तीन सेकंड के लिए पूर्ण गति से नहीं चलना है और फिर शेष समय के लिए कुछ भी नहीं करना है। इसके अलावा, यूनिक्स के तहत "अच्छा" का उपयोग करना एक अच्छा समाधान नहीं है। यदि अन्य प्रक्रियाएं प्रोसेसर की मांग करती हैं तो यह धीमी गति से चलती है, लेकिन पूरी गति से अगर प्रोसेसर की मांग एक ही समय में नहीं होती है।

यह एक जिज्ञासा प्रश्न है। इससे संबंधित कुछ भी गंभीर नहीं है। तथ्य यह है कि मुझे 15-20 साल पहले गेम याद हैं जो नए प्रोसेसर पर खेलने के लिए बहुत तेज़ थे, क्योंकि उन्हें प्रोसेसर घड़ी के साथ समय दिया गया था। आपको टर्बो बंद करना पड़ा।

मान लें कि कार्यक्रम एक सी संकलित प्रोग्राम है।

+2

नए कंप्यूटरों पर पुराने गेम काम करने का समाधान उन्हें डॉसबॉक्स में चलाने के लिए है (मुझे लगता है कि यह 386 या किसी चीज़ पर डॉस को अनुकरण करता है)। –

उत्तर

5

एक विचार एक लिखने के लिए है 'ptrace धावक।' ptrace वह कॉल है जो आपको लिनक्स और मैक जैसे प्लेटफ़ॉर्म पर डीबगर लागू करने की अनुमति देती है।

विचार प्रोग्राम से जुड़ा हुआ है और फिरके साथ एक निर्देश चलाने के लिए बार-बार एप्लिकेशन को बताएं। यदि यह पर्याप्त धीमा नहीं है, तो आप धावक कार्यक्रम में प्रत्येक कॉल के बीच एक नींद जोड़ सकते हैं।

-6

मैंने उबंटू के तहत वर्चुअल मशीन में कुछ एप्लिकेशन चलाया। यह वास्तव में धीमा था। आप सिस्टम के वर्चुअल मशीन उपयोग को कॉन्फ़िगर कर सकते हैं।

आप स्थिति थोड़ा आगे अंधेरा हो सकता है एक आभासी मशीन के नीचे एक आभासी मशीन के नीचे एक आभासी मशीन चल रहा है, से ...

+0

... जो संभव नहीं है बीटीडब्ल्यू। –

+1

@ जोहान्स रुडॉल्फ - है ना? गुगलिंग "नेस्टेड वर्चुअल मशीन" कुछ परिणाम प्राप्त करती है। उदाहरण के लिए: http://www.vcritical.com/2009/05/vmware-esx-4-can-even-virtualize-itself/ –

+0

मैं ऐसा कुछ नहीं करूंगा, ऐसा करने के लिए और अधिक व्यावहारिक तरीके हैं। – v01d

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

यह अच्छा है, लेकिन यह "हिचकी" में चला जाएगा :) –

2

cpulimit एक उपकरण है जो कुछ इस तरह करता है। यह समय-समय पर kill -STOP और kill -CONT प्रक्रिया द्वारा काम करता है, जिसका प्रभाव धीमा चल रहा है (जब समय के साथ औसत होता है)।

+0

उस टूल ने मुझे बचाया, वास्तव में सहायक, मेरे बैकअप सीपीयू उपयोग को बहुत कम कर दिया (और लैपटॉप अस्थायी तेजी से नीचे चला गया) –

0

यदि आपके पास डीटीआर है तो आप इसका ठंडा() फ़ंक्शन का उपयोग करने में सक्षम हो सकते हैं। आप इस ठंड को उपयोगकर्तालैंड एप्लिकेशन में और कई स्थानों पर लगभग किसी भी स्थान पर डाल सकते हैं। इसका उपयोग धीमे सिस्टम पर देखी गई दौड़ की स्थिति को दोहराने से पहले किया गया है।

संबंधित मुद्दे