2012-10-10 9 views
10

पर सी ++ में नींद (0) का प्रभाव documentation for usleep बताता है कि usleep(0) पर कॉल करने से कोई प्रभाव नहीं पड़ता है। हालांकि, मेरे सिस्टम (आरएचईएल 5.2) पर नीचे सी ++ कोड के छोटे स्निपेट चल रहे हैं, मुझे लगता है कि यह वास्तव में usleep(1) के समान प्रभाव प्रतीत होता है। क्या इसकी उम्मीद की जा सकती है, और यदि हां, तो दस्तावेज के बीच विसंगति क्यों है और मैं वास्तविक जीवन में क्या देखता हूं?लिनक्स

प्रदर्शनी एक

कोड:

#include <unistd.h> 

int main() 
{ 
    for(int i = 0; i < 10000; i++) 
    { 
     usleep(1); 
    } 
} 

आउटपुट:

$ time ./test 
real 0m10.124s 
user 0m0.001s 
sys 0m0.000s 

प्रदर्शनी बी

कोड:

+०१२३५१६४१०
#include <unistd.h> 

int main() 
{ 
    for(int i = 0; i < 10000; i++) 
    { 
     usleep(1); 
     usleep(0); 
    } 
} 

आउटपुट:

$ time ./test 
real 0m20.770s 
user 0m0.002s 
sys 0m0.001s 

उत्तर

13

तकनीकी रूप से इसका कोई प्रभाव नहीं होना चाहिए। लेकिन आपको याद रखना चाहिए कि पास किया गया मान न्यूनतम के रूप में उपयोग किया जाता है, और पूर्ण नहीं, इसलिए सिस्टम इसके बजाय सबसे छोटे संभव अंतराल का उपयोग करने के लिए स्वतंत्र है।

+0

जबकि अन्य उत्तर अन्य कारण बताते हैं कि ऐसा क्यों होता है, मुझे लगता है कि यह उत्तर उन्हें उच्च स्तर से समझाता है। – Dunnie

2

कि प्रलेखन 1997 से वापस आ गया है, यकीन नहीं अगर यह मौजूदा RHEL5 पर लागू होता है, usleep के लिए मेरे Redhat देव सिस्टम आदमी पेज का संकेत नहीं है 0 से सोने का समय नहीं है प्रभाव।

आपके द्वारा पारित पैरामीटर सोने के लिए न्यूनतम समय है। इस बात की कोई गारंटी नहीं है कि निर्दिष्ट समय के बाद धागा जाग जाएगा। शेड्यूलर की विशिष्ट गतिशीलता को देखते हुए, यह अपेक्षित देरी से अधिक हो सकता है।

3

मुझे यह सुनिश्चित करने के लिए स्रोत देखना होगा, लेकिन मेरा अनुमान है कि यह काफी "प्रभाव नहीं" है, लेकिन यह शायद usleep(1) से भी कम है - अभी भी फ़ंक्शन कॉल ओवरहेड है, जो कि मापने योग्य हो सकता है तंग लूप, भले ही लाइब्रेरी कॉल केवल अपने तर्कों की जांच करे और तुरंत लौटाए, टाइमर/कॉलबैक स्थापित करने और शेड्यूलर को कॉल करने की अधिक सामान्य प्रक्रिया से परहेज करें।

1

यह भी निर्भर करता है कि अगर उडले को लघु अवधि के लिए व्यस्त लूप के रूप में कार्यान्वित किया जाता है।

4

मैं बस यहां इस्तेमाल किए गए समय कमांड के बारे में बताना चाहता था। यदि आप अपनी प्रोग्राम मेमोरी, सीपीयू, टाइम स्टेट देखना चाहते हैं तो आपको केवल time कमांड के बजाय /usr/bin/time का उपयोग करना चाहिए। जब आप पूर्ण पथ के बिना समय कॉल करते हैं तो अंतर्निहित समय कमांड कहा जाता है। अंतर देखें। पूर्ण पथ के साथ

# time -v ./a.out 
-bash: -v: command not found 

real 0m0.001s 
user 0m0.000s 
sys  0m0.001s 

:

पूरा पथ के बिना

/usr/bin/time मैनुअल के लिए

# /usr/bin/time -v ./a.out 
Command being timed: "./a.out" 
User time (seconds): 0.00 
System time (seconds): 0.00 
Percent of CPU this job got: 0% 
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:10.87 
Average shared text size (kbytes): 0 
Average unshared data size (kbytes): 0 
Average stack size (kbytes): 0 
Average total size (kbytes): 0 
Maximum resident set size (kbytes): 0 
Average resident set size (kbytes): 0 
Major (requiring I/O) page faults: 0 
Minor (reclaiming a frame) page faults: 220 
Voluntary context switches: 10001 
Involuntary context switches: 1 
Swaps: 0 
File system inputs: 0 
File system outputs: 0 
Socket messages sent: 0 
Socket messages received: 0 
Signals delivered: 0 
Page size (bytes): 4096 
Exit status: 0 

उपयोग man time और समय की जानकारी में बनाया के लिए help time का उपयोग करें।

+0

समय का बहुत उपयोगी संस्करण, सूचक के लिए धन्यवाद! –

0

मेरे अनुभव के अनुसार इसका एक प्रभाव है: यह एक बाधा को बुला रहा है।
मल्टीथ्रेडिंग प्रोग्रामिंग में सबसे कम समय के लिए प्रोसेसर को रिलीज़ करना अच्छा होता है।

2

usleep() और sleep()nanosleep() सिस्टम कॉल में अनुवादित हैं। अपने प्रोग्राम को strace आज़माएं और आप इसे देखेंगे। nanosleep() manual से:

nanosleep() suspends the execution of the calling thread until either 
    at least the time specified in *req has elapsed, or the delivery of a 
    signal that triggers the invocation of a handler in the calling 
    thread or that terminates the process. 

तो मुझे लगता है ulseep (0) एक अवरोध और एक संदर्भ स्विच उत्पन्न होगा।