2011-02-06 18 views
15

यह एक बेवकूफ सवाल हो सकता है, लेकिन sleep(), wait(), pause(), कार्य कैसे काम करते हैं?नींद() कैसे काम करती है?

+13

भाषा और ओएस पर निर्भर करता है। –

+1

इसमें नाइट कैप शामिल है – kelloti

+2

बिल्कुल बेवकूफ सवाल नहीं है! –

उत्तर

20

हम सोने के संचालन को एक अधिक अमूर्त दृष्टिकोण से देख सकते हैं: यह एक ऐसा ऑपरेशन है जो आपको किसी ईवेंट की प्रतीक्षा करने देता है।
प्रश्न में घटना तब ट्रिगर होती है जब sleep आमंत्रण से गुजरने का समय नींद पैरामीटर से अधिक हो जाता है।

जब एक प्रक्रिया सक्रिय है (यानी: यह एक सीपीयू का मालिक है) यह एक सक्रिय में एक घटना के लिए इंतजार कर सकते हैं या एक निष्क्रिय रास्ते में:

  • एक सक्रिय इंतजार है जब एक प्रक्रिया को सक्रिय रूप से/स्पष्ट रूप से इंतजार कर रहा है घटना के लिए:

    sleep(t): 
        while not [event: elapsedTime > t ]: 
         NOP // no operatior - do nothing 
    

    यह एक तुच्छ एल्गोरिथ्म है और जहां भी एक पोर्टेबल तरह से लागू किया जा सकता है, लेकिन मुद्दा यह है कि, जबकि अपनी प्रक्रिया को सक्रिय रूप से इंतज़ार कर रहा है यह अभी भी सीपीयू का मालिक है, अपनी प्रक्रिया नहीं करता है, क्योंकि यह (बर्बाद कर दिया है वास्तव में सीपीयू की जरूरत नहीं है, जबकि अन्य कार्यों को इसकी आवश्यकता हो सकती है)।

    आमतौर पर यह केवल उन प्रक्रियाओं द्वारा किया जाना चाहिए जो निष्क्रिय रूप से प्रतीक्षा नहीं कर सकते (नीचे बिंदु देखें)।

  • एक निष्क्रिय प्रतीक्षा के बजाय आप को जगाने के लिए ईवेंट होने पर कुछ और करने के लिए पूछ रहा है, और अपने आप को निलंबित द्वारा किया जाता है (यानी: सीपीयू जारी):

    sleep(t): 
        system.wakeMeUpWhen([event: elapsedTime > t ]) 
        release CPU 
    

    आदेश एक निष्क्रिय प्रतीक्षा लागू करने के लिए आपको कुछ बाहरी समर्थन की आवश्यकता है: आप अपने सीपीयू को रिलीज़ करने में सक्षम होना चाहिए और घटना होने पर आपको जागने के लिए किसी और से पूछना चाहिए।

    यह एकल-कार्य डिवाइस (जैसे कई एम्बेडेड डिवाइस) पर संभव नहीं हो सकता है जब तक हार्डवेयर wakeMeUpWhen ऑपरेशन प्रदान नहीं करता है, क्योंकि सीपीयू को छोड़ने या जागने के लिए कोई भी नहीं है।

    x86 प्रोसेसर (और अधिकतर अन्य) HLT ऑपरेशन प्रदान करते हैं जो बाहरी बाधा को ट्रिगर होने तक CPU को नींद देता है। सीपीयू को शांत रखने के लिए इस तरह से ऑपरेटिंग सिस्टम कर्नेल भी सो सकते हैं।

+1

धन्यवाद। मुझे नहीं पता था कि विभिन्न CPUs और OSes ने इसे अलग-अलग संभाला है ... – Blender

1

ये सिस्टम कॉल हैं। लिनक्स या ओपन बीएसडी जैसे ओपन-सोर्स कोड में कार्यान्वयन की तलाश करें।

+2

उदाहरण हैं ['नैनोस्लीप (2)'] (http://linux.die.net/man/2/ नैनोस्ली) और ['नींद (3)'] (http://linux.die.net/man/3/sleep) लिंक के लिए लिनक्स –

+0

+1 थेंक्स के लिए प्रलेखन ... :-) –

4

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

ओएस जिस तरह से यह प्रकट करता है कि कई चीजें (आप वेब ब्राउज़ कर रहे हैं, संगीत सुन रहे हैं और फ़ाइलों को डाउनलोड कर रहे हैं) एक ही समय में प्रत्येक कार्य को बहुत कम समय के लिए निष्पादित कर रहा है (मान लें कि 10 एमएस)। यह तेज़ स्विचिंग यह प्रतीत होता है कि सामान एक साथ हो रहा है जब सब कुछ वास्तव में अनुक्रमिक रूप से हो रहा है। (बहु-कोर सिस्टम के लिए स्पष्ट अंतर के साथ)।

सवाल का जवाब के लिए के रूप में: नींद के साथ या प्रतीक्षा करने या तुल्यकालिक आईओ, कार्यक्रम मूल रूप से ओएस कह रहा है अन्य कार्यों को निष्पादित करने के लिए, और मुझे फिर से नहीं चला जब तक: एक्स एमएस बीत जाती, घटना किया गया है संकेतित, या डेटा तैयार है।

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