2009-05-03 4 views
47

अपने शब्दों में समझाया गया, मोचन क्या है और इसका मतलब क्या है (लिनक्स) कर्नेल?प्रीपेम्प्शन/प्रीमेटेबल कर्नेल क्या है? ये किस काम के लिए अच्छा है?

प्रीपेप्टिबल कर्नेल होने में फायदे और नुकसान क्या हैं?

+26

क्यों डाउनवोट और क्यों "होमवर्क"? यह एक होमवर्क नहीं है। असल में, मेरे जैसे लोग हैं जो इस तरह के प्रश्न में रुचि रखते हैं और आम विकिपीडिया लेखों को समझ नहीं पाते हैं। –

+3

http://en.wikipedia.org/wiki/Preemption_(computing) – Oli

उत्तर

56

प्रीपेप्टिव मल्टीटास्किंग - एक प्रोसेसर पर कई प्रक्रियाओं/धागे चलाना, भ्रम पैदा करना, जब वास्तव में प्रत्येक को छोटे मल्टीप्लेक्ड टाइम स्लाइस आवंटित किए जाते हैं। प्रक्रिया को निष्पादित होने पर "प्रीempt" किया जाता है और अगली बार स्लाइस चलाने के लिए इंतजार कर रहा है।

एक प्रीपेप्टिव कर्नेल वह है जिसे कोड निष्पादित करने के बीच में बाधा डाली जा सकती है - उदाहरण के लिए सिस्टम कॉल के जवाब में - अन्य चीजों को करने और अन्य धागे चलाने के लिए, संभवतः जो कर्नेल में नहीं हैं।

प्रीपेप्टिव कर्नेल का मुख्य लाभ यह है कि sys-call पूरे सिस्टम को अवरुद्ध नहीं करता है। यदि एक sys-call को समाप्त करने में लंबा समय लगता है तो इसका मतलब यह नहीं है कि कर्नेल इस समय कुछ और नहीं कर सकता है। मुख्य नुकसान यह है कि यह कर्नेल कोड के लिए अधिक जटिलता पेश करता है, जिसमें अधिक अंत मामलों को संभालने, अधिक बढ़िया अनाज लॉकिंग करने या लॉक-कम संरचनाओं और एल्गोरिदम का उपयोग करने के लिए किया जाता है।

+8

यही कारण है कि जब एक फाइल सिस्टम खराब हो जाता है, खासकर एक नेटवर्क फाइल सिस्टम, तो आप खुद को ऐसी प्रक्रिया के साथ पा सकते हैं जिसे मार नहीं किया जा सकता है। एक sys के इंतजार के आसपास बैठे फाइल सिस्टम को वापस लौटने के लिए कहते हैं, लेकिन यह कभी नहीं होगा और इसे बाधित नहीं किया जा सकता है। – Schwern

13

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

+1

मुझे पता है, अपने योगदान कुछ समय पहले बनाया गया था, लेकिन वैसे भी, मुझे आपसे एक सवाल पूछ सकते हैं। आप "preemptive" शब्द "preemptive" पर क्यों पसंद करेंगे? विशेष रूप से कर्नेल कॉन्फ़िगरेशन के लिए बाद वाले का उपयोग करता है, यह इस का उपयोग करके थोड़ा अधिक सहज हो सकता है। –

4

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

7

दूसरों ने पर्याप्त रूप से समझाया है कि एक प्रीemptणीय कर्नेल क्या है।

इसके लिए क्या अच्छा है?

अधिकतर लाभ हैं:

    गैर SMP सिस्टम पर
  • लोअर विलंबता - आम तौर पर वास्तविक समय प्रणाली में या अन्य चीजों के लिए इस्तेमाल किया जहां विलंबता महत्वपूर्ण है (ऑडियो, वीडियो शायद एप्लिकेशन)
  • शिक्षण गिरी करने वाले डेवलपर SMP सिस्टम नहीं कैसे SMP

के लिए सही कोड लिखने के लिए एक गैर preemptible गिरी के साथ, एक एकल प्रोसेसर सिस्टम पर यह संभव है कर्नेल डेवलपर्स आलसी हो सकता है और समय के किसी भी सबसे ताला लगा के बिना दूर पाने के लिए करते हैं - निश्चित रूप से यह एसएमपी पर एक बड़ा असफलता है। प्रीपेप्टिबल कर्नेल उन्हें बिना दर्द के इस दर्द को पाने की अनुमति देते हैं।

4

मुझे लगता है कि इस post आपके प्रश्नों का बताते हैं:

पूर्वक्रय क्या है?

ऑपरेटिंग सिस्टम की उच्च प्राथमिकता कार्य के पक्ष में वर्तमान में निर्धारित कार्य को पूर्ववत या बंद करने की क्षमता। शेड्यूलिंग प्रक्रिया, या I/O शेड्यूलिंग इत्यादि में से एक तक सीमित नहीं है,

एक प्रीम्प्शन कर्नेल क्या है?

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

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

कर्नेल पूर्वक्रय 2.6 कर्नेल में शुरू किया गया है, और एक सक्षम या CONFIG_PREEMPT विकल्प चुन कर उसे निष्क्रिय कर सकते हैं। यदि CONFIG_PREEMPT सक्षम है, तो कोड को स्थानीय इंटरप्ट को अक्षम करने के अलावा, कर्नेल कोड को हर जगह प्राथमिकता दी जा सकती है। कोड में एक अनंत लूप अब पूरे सिस्टम को अवरुद्ध नहीं कर सकता है। यदि CONFIG_PREEMPT अक्षम है, तो 2.4 व्यवहार बहाल किया गया है।

पेशेवरों और विपक्ष?

पेशेवर: प्रक्षेपण कर्नेल विलंबता और स्केलेबिलिटी में सुधार कर सकता है, और यह उच्च प्राथमिकता कार्य को चला सकता है और समय पर प्रतिक्रिया दे सकता है।

विपक्ष: यह लेखन कोड पूर्वक्रय कर्नेल में मुश्किल है, विशेष रूप से SMP में बनाने के लिए, और आप कई कारकों पर विचार करना चाहिए।

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