क्या सहकारी शेड्यूलिंग प्रक्रियाएँ स्थगित करती हैं जब वे I / O ऑपरेशन करते हैं?


19

कई ऑपरेटिंग सिस्टम संदर्भों का कहना है कि सहकारी (प्रीमेप्टिव के विपरीत) मल्टीटास्किंग के साथ, एक प्रक्रिया सीपीयू को तब तक रखती है जब तक कि यह स्पष्ट रूप से स्वैच्छिक रूप से खुद को निलंबित न कर दे। यदि कोई रनिंग प्रक्रिया एक I / O अनुरोध करता है जो तुरंत संतुष्ट नहीं हो सकता है (उदाहरण के लिए, एक कुंजी स्ट्रोक जो अभी तक उपलब्ध नहीं है) का अनुरोध करता है, क्या शेड्यूलर इसे निलंबित करता है, या क्या यह सीपीयू को तब तक रखता है जब तक अनुरोध सेवित नहीं किया जा सकता है?

["पर i / o" के साथ "ब्लॉक को बदलने के लिए संपादित" एक I / O अनुरोध करता है जिसे तुरंत संतुष्ट नहीं किया जा सकता है। "]


यह सवाल ऑपरेटिंग सिस्टम की बारीकियों के बारे में पूछता है, जो कि, यहाँ पर, बहुत ही अपमानजनक होगा। यदि यह मामला नहीं है, तो कृपया अपने प्रश्न को और अधिक सार में पुनः लिखें।
राफेल

3
जब मैंने इसे यूनिक्स समूह में पोस्ट किया, तो मुझे बताया गया कि यह वहां अनुचित था और यहां से संबंधित था, जिससे मैं सहमत था, क्योंकि यह एक विशिष्ट ऑपरेटिंग सिस्टम के बारे में नहीं है। मुझे लगता है कि यह एक शाखा भविष्यवाणी के बारे में सवाल करने के लिए तुलनीय है। यह देखना दिलचस्प होगा कि समुदाय इस बारे में क्या निर्णय लेता है और यहां क्या उचित नहीं है।
एलेन स्पार्टस

जवाबों:


15

वास्तव में "सहकारी" सेटिंग में, और यदि कोई हार्डवेयर सुरक्षा नहीं थी, तो एक प्रक्रिया निश्चित रूप से I / O पर ब्लॉक कर सकती है और जब तक कि I / O नहीं किया गया था (या कभी भी नियंत्रण को कभी भी नियंत्रण न करें) तब तक नियंत्रण नहीं छोड़ना चाहिए। उदाहरण के लिए, विंडोज 3.1 इस तरह से था: यदि कोई एकल उपयोगकर्ता प्रक्रिया पूरे कंप्यूटर पर ले जाना चाहती थी, और किसी अन्य चीज को चलाने से रोकती है, तो यह हो सकता है।

लेकिन मल्टीटास्किंग वाले सिस्टम पर आप सिस्टम API I / O कमांड की उम्मीद करते हैं जब उन्हें कॉल किया जाता है तो प्रोसेसर के नियंत्रण को त्याग दिया जाता है। इसलिए जब एक रनिंग प्रोसेस I / O पर ब्लॉक होता है, तो यह मानते हुए कि यह प्रक्रिया सामान्य सिस्टम API का उपयोग करती है, अन्य प्रक्रियाओं को I / O पूरा होने तक चलने दिया जाएगा, और आखिरकार I / O पूरा होने के बाद मूल प्रक्रिया फिर से शुरू हो जाएगी। । दूसरे शब्दों में, अवरुद्ध I / O फ़ंक्शन को कॉल करना एक तरीका है कि सहकारी प्रणाली पर एक प्रक्रिया स्वेच्छा से खुद को निलंबित कर सकती है।


11

यदि एक रनिंग प्रोसेस i / o पर ब्लॉक हो जाता है

आपकी प्रक्रिया को निलंबित करने के लिए IO पर ब्लॉक करना बहुत अधिक समान है। लिनक्स कर्नेल के संदर्भ में, कुछ IO सिस्टम कॉल को निष्पादित करता है जैसे कि या उस हैंडओवर को देखने के लिए ट्रिगर करने के लिए read()एक sysenterया बाधा हैंडलर का कारण होगा , do_sys_read()अंततः कॉलिंग । यहां, यदि वर्तमान अनुरोध तुरंत संतुष्ट नहीं हो सकता है, तो फ़ंक्शन कॉल करता है sched()जो फिर किसी अन्य प्रक्रिया को निष्पादित कर सकता है।

एक सहकारी प्रणाली के संदर्भ में, मैं अपेक्षा करता हूं कि जब आप किसी IO कारण के लिए एक सिस्टम कॉल करते हैं, यदि अनुरोध को संतुष्ट नहीं किया जा सकता है तो कर्नेल एक अन्य कार्य को चुनता है और उस पर अमल करता है। यह दस्तावेज़ कुछ पृष्ठभूमि प्रदान करता है - मूल रूप से, यदि आप IO पर प्रतीक्षा करते हैं, तो आपको उस IO की प्रतीक्षा में हमेशा के लिए लटका दिया जा सकता है। को-ऑपरेटिव शेड्यूलिंग का विचार है कि आप sched()सीपीयू-गहन कार्यों को करते हैं, तो आप अक्सर कॉल करते हैं या समतुल्य relinquish-a-cpu विधि करते हैं।

कर्नेल-मोड विचार अधिक रोचक हैं। आर्किटेक्चर पर, जहां वे कुछ एम्बेडेड प्लेटफार्मों जैसे उपलब्ध हैं , इंटरप्टर्स हैंडलर अभी भी हार्डवेयर या सॉफ्टवेयर इंटरप्ट के जवाब में लगाए जाएंगे। यह आमतौर पर संभव है, कार्यान्वयन-वार, से बाधित हैंडलिंग अक्षम लिए , लेकिन इसमें भी कमियां हैं।


4

सहकारी शेड्यूलिंग (अधिमानतः cooperative multitasking) मॉडल में, इस अर्थ में किसी शेड्यूलर की कोई अवधारणा नहीं है कि ऑपरेटिंग सिस्टम का कोई नियंत्रण नहीं है कि प्रक्रिया कितनी देर तक चलती है।

एक प्रोग्राम जो सही ढंग से प्रोग्राम किया गया है वह स्वेच्छा से सीपीयू को I / O पर छोड़ देगा। लेकिन, बुरी तरह से लिखे गए एप्लिकेशन केवल I / O पर प्रतीक्षा कर सकते हैं, जिससे अन्य प्रक्रियाएं अवरुद्ध हो सकती हैं।

पुनश्च: इस दृष्टिकोण को बाद में प्री-सेप्टिव-शेड्यूलिंग (जिसमें एक बाहरी शेड्यूलर था) के पक्ष में अधिकांश ओएस द्वारा दिया गया था और अब हमारे पास अलग-अलग ओएस द्वारा उपयोग किए जाने वाले सभी शेड्यूलिंग एल्गोरिदम हैं।

संपादित करें: मेरा उत्तर अपने मूल रूप में वर्णित शेड्यूलिंग पर आधारित था (वर्षों पहले: पी)। जैसा कि गिल्स ने कहा कि कुछ प्रणालियाँ अभी भी सहकारी समय-निर्धारण का उपयोग करती हैं। और एक शेड्यूलर है। मुझे यकीन नहीं है कि अगर वे सिस्टम अपने शुद्ध और मूल रूप में COS का उपयोग करते हैं।


2
कई एम्बेडेड OS (जिसमें RTOS तक सीमित नहीं है) सहकारी शेड्यूलिंग है। यह कहना नहीं है कि कोई अनुसूचक नहीं है; शेड्यूलर वह कोड होता है जो यह निर्धारित करता है कि आगे कौन सा धागा चलाना है। पहले से चल रहे कार्य के अनुरोध के विपरीत, शेड्यूलर को स्वचालित रूप से दर्ज किए जाने के बारे में है।
गाइल्स का SO- बुराई पर रोक '

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

4

सहकारी मल्टीटास्किंग का तात्पर्य है कि एक निष्पादित संदर्भ को अनुसूचक के लिए स्पष्ट रूप से नियंत्रण छोड़ना चाहिए, और यदि वह चाहे तो एक संदर्भ स्विच को होने से रोक सकता है।

अधिकांश कार्यान्वयन स्पष्ट रूप से किसी भी सिस्टम कॉल के लिए एक संदर्भ स्विच करते हैं जो प्रोसेसर के आवंटन की निष्पक्षता को बढ़ाने के लिए, और अक्सर ऐसा करने पर भी नहीं लौटते हैं।

आमतौर पर यह केवल विफल प्रक्रियाओं (या सिस्टम के शेष के लिए जानबूझकर सेवा से वंचित करना) के लिए संभव है, लगातार कार्य-स्विचिंग को रोकने के लिए।

गाइल्स द्वारा समझाया गया पूर्व-उत्सर्जन, सिस्टम की वास्तुकला की एक सीमा है जो सक्रिय कार्य और मजबूर संदर्भ स्विच की समयबद्ध रुकावट को रोकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.