sleep()
लागू करने के लिए विशिष्ट तरीका और nanosleep()
जो कुछ पैमाने ओएस अनुसूचक का उपयोग करता है में परिवर्तित करने के लिए तर्क है (ऊपर गोलाई जबकि) और एक "पूर्ण जगाने के समय" के रूप में इसे करने के लिए वर्तमान समय जोड़ने; फिर शेड्यूलर को बताएं कि थ्रेड CPU समय देने के बाद तक "पूर्ण जागने का समय" तक पहुंच गया है। कोई व्यस्त प्रतीक्षा शामिल नहीं है।
ध्यान दें कि ओएस के शेड्यूलर का जो भी पैमाने सामान्य रूप से उपयोग करता है, उस पर निर्भर करता है कि कौन सा हार्डवेयर उपलब्ध है और/या समय रखने के लिए उपयोग किया जा रहा है। यह एक नैनोसेकंड से छोटा हो सकता है (उदाहरण के लिए 80x86 पर स्थानीय एपीआईसी "टीएससी समय सीमा मोड" में उपयोग किया जा रहा है) या 100 एमएस जितना बड़ा हो सकता है।
यह भी ध्यान दें कि ओएस गारंटी देता है कि देरी आपके द्वारा पूछे जाने वाले कार्यों से कम नहीं होगी; लेकिन आम तौर पर कोई गारंटी नहीं है कि यह अधिक नहीं होगा और कुछ मामलों में (जैसे भारी भारित प्रणाली पर कम प्राथमिकता धागा) देरी अनुरोध से कहीं अधिक बड़ी हो सकती है। उदाहरण के लिए, यदि आप 123 नैनोसेकंड के लिए सोने के लिए कहते हैं तो शेड्यूलर निर्णय लेने से पहले आप 2 एमएस के लिए सो सकते हैं, यह आपको CPU समय दे सकता है, और फिर शेड्यूलर वास्तव में आपको CPU समय देता है (उदाहरण के लिए अन्य) धागे सीपीयू का उपयोग कर रहे हैं)।
कुछ ओएस इसे "अनुरोध से अधिक लंबे समय तक सोए" को कम करने का प्रयास कर सकते हैं, और कुछ ओएस (जैसे हार्ड-रीयल टाइम के लिए डिज़ाइन किया गया) कुछ प्रकार की गारंटी प्रदान कर सकता है (प्रतिबंधों के साथ - उदाहरण के लिए थ्रेड प्राथमिकता के अधीन) देरी की समाप्ति और सीपीयू वापस पाने के बीच न्यूनतम समय। ऐसा करने के लिए, ओएस/कर्नेल ओएस के शेड्यूलर का उपयोग करने वाले किसी भी पैमाने पर तर्क को परिवर्तित करेगा (गोल करने के दौरान और गोल नहीं होने पर) और "केवल मामले में" एक छोटी राशि घटा सकता है; ताकि शेड्यूलर अनुरोधित विलंब समाप्त होने से ठीक पहले (और बाद में नहीं) थ्रेड को जगाता है; और फिर जब थ्रेड को CPU समय दिया जाता है (संदर्भ की लागत के बाद धागे पर स्विच किया जाता है, और संभावित रूप से विभिन्न कैश लाइनों को प्री-फ़ेच करने के बाद थ्रेड को उपयोग करने की गारंटी दी जाती है) कर्नेल वास्तव में देरी की अवधि समाप्त होने तक संक्षेप में प्रतीक्षा करेगा। यह कर्नेल को देरी की समाप्ति के बहुत करीब थ्रेड पर वापस नियंत्रण करने की अनुमति देता है।
उदाहरण के लिए, यदि आप 123 नैनोसेकंड के लिए सोने के लिए कहते हैं, तो शेड्यूलर आपको 100 नैनोसेकंड के लिए CPU समय नहीं दे सकता है, तो यह आपके थ्रेड पर 10 नैनोसेकंड स्विच कर सकता है, फिर यह शेष 13 नैनोसेकंडों के लिए प्रतीक्षा कर सकता है। यहां तक कि इस मामले में (जहां व्यस्त प्रतीक्षा की जाती है) यह आमतौर पर देरी की पूरी अवधि के लिए प्रतीक्षा में व्यस्त नहीं होगा।हालांकि, अगर देरी बहुत कम है तो कर्नेल केवल अंतिम व्यस्त प्रतीक्षा करेगा।
अंत में, एक विशेष मामला है जो उल्लेखनीय हो सकता है। POSIX सिस्टम पर sleep(0);
आमतौर पर yield()
के रूप में दुरुपयोग किया जाता है। मुझे यह भी यकीन नहीं है कि यह अभ्यास कितना वैध है - शेड्यूलर के लिए yield()
जैसे कुछ का समर्थन करना असंभव है जब तक कि शेड्यूलर CPU समय को अपरिहार्य काम करने के लिए तैयार नहीं करता है, जबकि अधिक महत्वपूर्ण काम प्रतीक्षा करता है।
प्रश्न के साथ क्या गलत है? – Kam
_ "प्रश्न के साथ क्या गलत है?" _ बहुत व्यापक। ओएस विशिष्ट, कार्यान्वयन विशिष्ट। –
POSIX यह निर्दिष्ट नहीं करता है कि इसे कैसे लागू किया जाना चाहिए – StenSoft