2016-07-18 2 views
8

हाल ही में मैं स्टैक ओवरफ़्लो (अजगर) पर सर्फिंग और this post देखा जहां हारून हॉल का दावा है किक्या समय.sleep प्रोसेसर की मदद करता है?

लगातार छोरों में संसाधन क्षमता का एक बहुत उपभोग कर सकते हैं, जबकि चल रहा था। नींद की अवधि जोड़ना (यहां तक ​​कि केवल एक सेकंड) उस उपयोग को बहुत कम कर सकता है।

क्या यह वाकई सच है? और यदि हां, तो कैसे आते हैं? क्या वही नियम अन्य प्रोग्रामिंग भाषाओं पर भी लागू होता है (यानी सी ++)?

+2

लूप में नींद जोड़ना आम तौर पर प्रोग्राम तर्क के साथ एक समस्या है लेकिन हाँ यह खराब कोड में मदद करता है। – NathanOliver

+0

क्या होगा यदि आप एक प्रोग्राम को हमेशा के लिए चलाना चाहते हैं, जबकि यह किसी बाधा की प्रतीक्षा करता है? क्या कोई बेहतर विकल्प है? – dashiell

+1

यदि कुछ बाहरी घटना के लिए प्रतीक्षा करने के लिए थोड़ी देर लूप है, तो इसे ईवेंट के इंतजार के लिए डिज़ाइन किए गए किसी प्रकार के मल्टीथ्रेड टूल द्वारा प्रतिस्थापित करने की आवश्यकता है। यदि यह फ़ाइल के लिए डिस्क को मतदान कर रहा है, तो सो जाओ तो चेक शायद सबसे अच्छा विकल्प है। लेकिन वास्तविक सीपीयू निर्देशों के माध्यम से बस जल रहा है जैसे कि (सत्य) घटना की प्रतीक्षा करने का सबसे खराब तरीका है। क्या कोई बेहतर तरीका है ... इस बात पर निर्भर करता है कि आप किस घटना की प्रतीक्षा कर रहे हैं। –

उत्तर

8

टीएल; डीआर यदि आप एक घटना के लिए मतदान कर रहे हैं जो एक मिनट में होता है, तो आप हर नैनो दूसरे की जांच नहीं कर सकते हैं।

हां, यह वास्तव में सच है। धागे में सोना उस थ्रेड के सीपीयू उपयोग को कम करता है। जबकि एक धागा सोता है, यह शायद ही कभी किसी भी CPU समय का उपभोग करता है।

हां, यह काफी हद तक किसी भी भाषा के लिए सच है जब तक ओएस देशी थ्रेडिंग एपीआई का उपयोग करके नींद लागू की जाती है।

इस बारे में सहज लगता है करने के लिए, हमें जुड़ा हुआ सवाल से कार्यक्रम का एक सरलीकृत संस्करण पर विचार करते हैं: अब

while end_condition_expression: 
    if time_based_condition_expression: 
     do_something() 

, हमें दुनिया को आसान बनाने, और लगता है कि कार्यक्रम केवल प्रक्रिया पर चल रहा है प्रोसेसर

आइए हम यह भी मान लें कि समय आधारित स्थिति एक मिनट में सच है। आइए यह भी मान लें कि end_condition_expression और time_based_condition_expression निष्पादित करने से cpu समय के 10 नैनो सेकंड खर्च होते हैं।

यह एक मिनट के भीतर कितना सीपीयू समय उपभोग करेगा? बिल्कुल एक मिनट == 60 000 000 000 नैनो सेकंड। पूरे समय के दौरान सीपीयू उपयोग 100% होगा। लूप छह अरब बार फिर से शुरू होगा।

while end_condition_expression: 
    if time_based_condition_expression: 
     do_something() 
    sleep_for_a_second() 

कितनी बार पाश एक मिनट के भीतर क्रियान्वित होगा:

अब, कार्यक्रम के इस बदलाव पर विचार? 60 पुनरावृत्तियों। यह एक मिनट के भीतर कितना सीपीयू का उपभोग करेगा? 60 * 10 एनएस = 600 एनएस। कार्यक्रम का गैर-नींद संस्करण क्या है इसका एक सौ मिलियनवां हिस्सा है।

असल में, कॉल से सोने के लिए थोड़ा अधिक ओवरहेड होता है, और सीपीयू समय अन्य प्रक्रियाओं के साथ साझा किया जाता है, और एक शेड्यूलर शामिल होता है, और सटीक सीपीयू उपयोग मेरी धारणाओं से बिल्कुल मेल नहीं खाएगा, लेकिन विचार वही रहता है।

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