2009-11-12 12 views
17

मैं सिर्फ रुचि कैसे sleep(time in ms) एक सी पुस्तकालय में या मूल रूप से ओएस स्तर पर कार्यान्वित किया जाता है हूँ ...ओएस स्तर पर नींद कैसे लागू की जाती है?

मैं अनुमान लगा रहा हूँ ...

  1. प्रोसेसर गति आप एक कर के आधार पर हो सकता है nop है (मुझे यकीन है कि अगर सोने का समय सही हो जाएगा नहीं कर रहा हूँ) के पाश ...
  2. प्रोसेसर, जहाँ आप कुछ मूल्य और प्रोसेसर बस निर्दिष्ट समय के लिए रुकती बारे में कोई विशेष रजिस्टर (इस रूप में बहुत अक्षम हो जाएगा, जबकि प्रोसेसर अन्य कार्यक्रम भी नहीं चला सकता है)।

कोई सुराग? शायद सी पुस्तकालय स्रोत कोड समझा सकता है? मैं इस बारे में बहुत खास नहीं हूं कि "सी" इसे कैसे कार्यान्वित कर रहा है ... मैं बस सामान्य रूप से सोच रहा हूं कि "नींद()" फ़ंक्शन कैसे कार्यान्वित किया जाता है।

उत्तर

14

Sleep() ओएस स्तर पर लागू किया जाता है। जब कोई कार्य/धागा/प्रक्रिया सो रही है तो प्रोसेसर स्पिन नहीं करता है। उस विशेष धागे को लंबित कतार में रखा जाता है (धागा चलाने के लिए तैयार नहीं होता है) जब तक कि समय समाप्त नहीं हो जाता है, उस बिंदु पर थ्रेड को कतार चलाने के लिए तैयार किया जाएगा।

इस बीच, अन्य थ्रेड को चलाने के लिए तैयार कर रहे हैं चलाया जाएगा।

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

केवल एक बहुत ही सरल प्रणाली (एम्बेडेड सिस्टम के सबसे सरल की तरह) के लिए, Sleep() वास्तव में व्यस्त प्रतीक्षा लूप से अधिक कुछ भी नहीं लागू किया जा सकता है।

"Modern Operating Systems" by Tanenbaum जैसे किसी भी ऑपरेटिंग सिस्टम पाठ्यपुस्तक में यह बहुत विस्तार से शामिल होगा - उनमें से कोई भी (यहां तक ​​कि पुराना, सस्ता, इस्तेमाल किया गया एक)।

+0

आह .. इसलिए समय के बाद जागने की गारंटी नहीं है .. यह शेड्यूलर या मूल रूप से सिस्टम में अन्य कार्यों तक है ... ?? – FatDaemon

+3

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

+0

कई एम्बेडेड प्रोसेसर के पास एक समर्पित नींद निर्देश – mocj

2

अपने प्रश्न का उत्तर पूरी तरह से कर रहा है ऑपरेटिंग सिस्टम और कार्यान्वयन पर निर्भर।

इसके बारे में सोचने का एक आसान तरीका: जब आप sleep() पर कॉल करते हैं, तो ओएस जागने के समय की गणना करता है, फिर आपकी प्रक्रिया को प्राथमिकता कतार पर कहीं भी चिपकाता है। यह तब तक आपकी प्रक्रिया को शेड्यूल करने के लिए पर्याप्त वास्तविक तक निष्पादन समय प्राप्त करने के लिए आपकी प्रक्रिया को शेड्यूल नहीं करता है।

1

आप किसी भी ऐसा नहीं करते हैं, जबकि छोरों, अन्यथा प्रणाली नहीं कुछ भी करने में सक्षम हो जाएगा - नहीं माउस, कीबोर्ड, नेटवर्क का जवाब, आदि

आमतौर पर जो सबसे ऑपरेटिंग सिस्टम कर आप जोड़ना है टाइमस्टैंप प्राप्त करने के लिए वर्तमान टाइमस्टैम्प में देरी जब देरी का अनुरोध करने वाले कार्य को फिर से शुरू किया जाएगा (माना जाता है कि उस समय कोई उच्च प्राथमिकता कार्य नहीं चल रहा है) और [wakeupTimestamp, कार्य सूचक] को उस सूची में जोड़ें जो आरोही द्वारा क्रमबद्ध है टाइमस्टैम्प द्वारा। उसके बाद, ओएस एक संदर्भ स्विच करता है और अगले उपलब्ध कार्य चलाता है। समय-समय पर, सिस्टम वर्तमान टाइमस्टैम्प के साथ नींद की सूची पर सबसे शुरुआती टाइमस्टैम्प की तुलना करता है, और यदि समय सीमा समाप्त हो गई है, तो यह सोने के काम को "तैयार" कार्य कतार में ले जाती है।

+0

आप दूसरे भाग में कुछ बुद्धिमान कैसे कहते हैं और फिर भी पहले भाग में इतने बेवकूफ हैं? थोड़ी देर लूप preemptable है और किसी भी माउस घटना को बाधित नहीं करेगा। –

2

एक विशिष्ट ऑपरेटिंग सिस्टम में, निद्रा गिरी है, जो प्रक्रिया सेट जब तक निर्दिष्ट समयावधि बीत रहा है प्रतीक्षा करने के लिए कॉल, और फिर चला जाता है और चलाने के लिए किसी अन्य प्रक्रिया पाता है। अनुपस्थित कुछ भी करने के लिए बेहतर है, यह 'निष्क्रिय प्रक्रिया' चलाएगा।एक बार समय समाप्त हो जाने के बाद, शेड्यूलर ध्यान देगा कि सोने की प्रक्रिया जाने के लिए अच्छा है, और यह इसे फिर से निर्धारित करेगा।

+0

बिल्कुल और यह ध्यान दिया जाना चाहिए कि निष्क्रिय प्रक्रिया एक प्रक्रिया है जो एचएलटी निर्देश चलाती है। आधुनिक सीपीयू में यह बहुत जटिल हो जाता है और नींद के समय की अवधि के आधार पर यह सीएन मोड में जायेगा। (सी 0 जाग, सी 1 छोटी नींद, ... सी 7 लंबी नींद) –

1

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

नींद से कॉल चुनने के लिए यह असामान्य नहीं है() और प्रतीक्षा करने के लिए कोई वर्णनकर्ता नहीं है और आपकी नींद की अवधि के बराबर एक टाइमआउट मान है।

सिस्टम समय बीतने के बाद समाप्त होने के लिए एक टाइमर सेट करके इसे कार्यान्वित कर सकता है और फिर उस सेमफोर पर प्रतीक्षा कर रहा है जिसे उस टाइमर की समयसीमा समाप्त होने पर संकेत दिया जाएगा। इस प्रकार यह उस सैमफोर पर अवरुद्ध है।