2011-03-12 13 views
23

मैंने पढ़ा कि लिनक्स कर्नेल प्रीपेप्टिव है, जो कि अधिकांश यूनिक्स कर्नेल से अलग है। तो, एक कर्नल के लिए प्रीपेप्टिव होने का वास्तव में क्या मतलब है?"लिनक्स कर्नेल प्रीपेप्टिव" कहने का क्या अर्थ है?

कुछ अनुरूपता या उदाहरण शुद्ध सैद्धांतिक स्पष्टीकरण से बेहतर होंगे।

उत्तर

0

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

5

पारंपरिक यूनिक्स कर्नेल के पास एक एकल ताला था, जो कर्नेल कोड चल रहा था, जबकि थ्रेड द्वारा आयोजित किया गया था। इसलिए कोई अन्य कर्नेल कोड उस धागे को बाधित नहीं कर सकता है।

इसने कर्नेल को आसान बना दिया, क्योंकि आप जानते थे कि कर्नेल संसाधनों का उपयोग करते हुए एक धागा, कोई अन्य धागा नहीं था। इसलिए विभिन्न धागे एक-दूसरे के काम को गड़बड़ नहीं कर सकते हैं।

एकल प्रोसेसर सिस्टम में यह बहुत सी समस्याएं नहीं पैदा करता है।

हालांकि मल्टीप्रोसेसर सिस्टम में, आपको ऐसी स्थिति हो सकती है जहां विभिन्न प्रोसेसर या कोर पर कई थ्रेड एक ही समय में कर्नेल कोड चलाने के लिए चाहते थे। इसका मतलब है कि वर्कलोड के प्रकार के आधार पर, आपके पास बहुत से प्रोसेसर हो सकते हैं, लेकिन उनमें से सभी अपने समय का एक दूसरे के लिए इंतजार कर रहे हैं।

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

+5

लॉकिंग के विवरण का स्तर है कि क्या गिरी रिक्तिपूर्व है के साथ कोई संबंध नहीं है। जबकि लिनक्स लगातार बेहतर स्केलेबिलिटी और फाइनर-ग्रेनेड लॉकिंग की ओर बढ़ रहा है, जिस स्थिति के बारे में आप बात कर रहे हैं वह दस साल तक अस्तित्व में नहीं है। –

4

प्रीम्प्शन कर्नेल को समांतरता के प्रभाव देने की अनुमति देता है: आपके पास केवल एक प्रोसेसर है (चलो एक दशक पहले कहें), लेकिन आपको लगता है कि आपकी सभी प्रक्रियाएं एक साथ चल रही हैं। ऐसा इसलिए है क्योंकि कर्नेल एक प्रक्रिया से निष्पादन को निष्पादित करता है (यानी, निष्पादन को बाहर ले जाता है) इसे अगले (इसे उनकी प्राथमिकता के अनुसार) देने के लिए। इसलिए यदि आपके प्रक्रिया काफी मात्रा में डेटा की गणना करता है और yield समारोह के किसी भी प्रकार फोन नहीं करता है

संपादित रिक्तिपूर्व नहीं कर्नेल (अर्थात syscalls दौरान) प्रक्रियाओं हाथ वापस देने के लिए के लिए प्रतीक्षा,, अन्य प्रक्रियाओं उनकी कॉल निष्पादित करने के लिए निष्पादित करने में सक्षम नहीं होंगे। ऐसी प्रणालियों कहा जाता है सहकारी हो सकता है क्योंकि वे प्रक्रियाओं के सहयोग के लिए पूछना निष्पादन समय की इक्विटी सुनिश्चित करने के लिए

संपादित 2 पूर्वक्रय का मुख्य लक्ष्य कई कार्यों के बीच प्रणाली की प्रतिक्रिया में सुधार है तो यह है कि, अंत उपयोगकर्ताओं के लिए अच्छा है, जबकि अन्य-हाथ पर, सर्वर उच्चतम througput हासिल करना चाहते हैं, तो वे इसकी आवश्यकता नहीं है: (लिनक्स कर्नेल विन्यास से)

2

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

एक प्रीमेप्टिव कर्नेल में switch context की क्षमता है। इसका मतलब यह है कि यह "फांसी" प्रक्रिया को रोक सकता है भले ही यह समाप्त नहीं हुआ हो, और कंप्यूटिंग समय को अगली प्रक्रिया में अपेक्षित के रूप में दें। "फांसी" प्रक्रिया निष्पादित रहेगी जब इसका समय बिना किसी समस्या के आ गया है।

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

ubuntu studio districution पैकेज एक प्रीपेप्टिव कर्नेल के साथ-साथ ऑडियो और वीडियो संस्करण को समर्पित गुणवत्ता मुक्त सॉफ्टवेयर का एक समूह भी पैकेज करता है।

+0

रीयलटाइम के लिए किसी भी तरह का प्रीपेप्टिव कर्नेल नहीं है? बिना किसी प्रस्तुति के, आपके ऑडियो/वीडियो कार्य में सभी प्रोसेसर स्वयं तक पहुंच जाएंगे, इसलिए यह ऐसी बाधाओं के लिए अधिक सुविधाजनक होगा? – Kevin

+0

@ केविन: यह विपरीत है। एक प्रीपेप्टिव कर्नेल का अर्थ है कि कर्नेल मोड पर चल रही अन्य प्रक्रियाओं के कारण विलंबता कम है। आप वास्तव में ज्यादातर समय के बारे में परवाह करते हैं विलंबता है। – ninjalj

+0

@ केविन: एक प्रीपेप्टिव कर्नेल के साथ, एक उच्च प्राथमिकता कार्य (उदाहरण के लिए आपका ऑडियो/वीडियो प्लेयर) निम्न प्राथमिकता कार्य को पूर्ववत कर सकता है, भले ही बाद वाला कर्नेल मोड में चल रहा हो। इसका मतलब यह है कि जब ऑडियो/वीडियो प्लेयर को चलाने की आवश्यकता होती है तो उसे चलाने के लिए चला जाता है। – caf

3

इसका मतलब है कि ऑपरेटिंग सिस्टम शेड्यूलर चलने वाली प्रक्रियाओं के निष्पादन को निलंबित करने के लिए स्वतंत्र है जब भी सीपीयू किसी अन्य प्रक्रिया को देता है; ऐसा करने का सामान्य तरीका सीपीयू के लिए CPU समय के "क्वांटम" को चलाने के लिए प्रत्येक प्रक्रिया को देना है। इसकी समाप्ति के बाद शेड्यूलर दूसरी प्रक्रिया को एक और क्वांटम देने के लिए नियंत्रण वापस ले जाता है (और चलने की प्रक्रिया इससे बच नहीं सकती है)।

इस विधि को अक्सर सहकारी मल्टीटास्किंग के साथ तुलना की जाती है, जिसमें प्रक्रियाओं को बिना किसी बाधा के सीपीयू को हमेशा रखा जाता है, और अन्य अनुप्रयोगों को चलाने के लिए उन्हें स्पष्ट रूप से किसी प्रकार का "उपज" कार्य करना होता है; स्वाभाविक रूप से, सिस्टम को अटकने की भावना देने से बचने के लिए, अच्छी तरह से व्यवहार किए गए एप्लिकेशन अक्सर सीपीयू उत्पन्न करेंगे। फिर भी, यदि किसी एप्लिकेशन में कोई बग है (उदाहरण के लिए उपज कॉल के बिना एक अनंत लूप) पूरी प्रणाली लटका दी जाएगी, क्योंकि सीपीयू पूरी तरह से दोषपूर्ण प्रोग्राम द्वारा रखा जाता है।

लगभग सभी हालिया डेस्कटॉप ओएस प्रीपेप्टिव मल्टीटास्किंग का उपयोग करते हैं, भले ही यह संसाधनों के मामले में अधिक महंगा हो, सामान्य रूप से अधिक स्थिर है (एक सिग्नल दोषपूर्ण ऐप के लिए पूरे सिस्टम को लटका देना अधिक कठिन है, क्योंकि ओएस हमेशा होता है नियंत्रण में)। दूसरी तरफ, जब संसाधन तंग होते हैं और आवेदन अच्छी तरह से व्यवहार करने की उम्मीद है, सहकारी मल्टीटास्किंग का उपयोग किया जाता है। विंडोज 3 एक सहकारी मल्टीटास्किंग ओएस था; एक और हालिया उदाहरण रॉकबॉक्स, एक ओपनसोर्स पीएमपी फर्मवेयर प्रतिस्थापन हो सकता है।

22

लिनक्स कर्नेल संस्करण 2.5.4 से पहले, लिनक्स कर्नेल प्रीemptempt नहीं था जिसका मतलब है कि कर्नेल मोड में चल रही प्रक्रिया को प्रोसेसर से बाहर नहीं ले जाया जा सकता है जब तक कि यह प्रोसेसर को छोड़ देता है या यह कुछ इनपुट आउटपुट ऑपरेशन को पूरा करने के लिए इंतजार करना शुरू कर देता है ।

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

12

प्रीपेप्टिव मल्टी-टास्किंग के सरल दृश्य की कल्पना करें। हमारे पास दो उपयोगकर्ता कार्य हैं, जिनमें से दोनों किसी भी I/O या कर्नेल कॉल करने के बिना हर समय चल रहे हैं। उन दो कार्यों को बहु-कार्यशील ऑपरेटिंग सिस्टम पर चलाने में सक्षम होने के लिए कुछ भी विशेष करने की ज़रूरत नहीं है। कर्नेल, आमतौर पर टाइमर इंटरप्ट पर आधारित होता है, बस यह तय करता है कि यह एक कार्य के लिए एक और रन चलाने के लिए रुकने का समय है। प्रश्न में कार्य पूरी तरह से अनजान है कि कुछ भी हुआ।

हालांकि, अधिकांश कार्य कर्नेल के सिस्को के माध्यम से कभी-कभी अनुरोध करते हैं। जब ऐसा होता है, वही उपयोगकर्ता संदर्भ मौजूद है, लेकिन सीपीयू उस कार्य की ओर से कर्नेल कोड चला रहा है।

पुराना लिनक्स कर्नेल कभी भी कर्नेल कोड चलाने में व्यस्त होने पर किसी कार्य की छूट की अनुमति नहीं देगा। (ध्यान दें कि I/O संचालन हमेशा स्वेच्छा से पुनः शेड्यूल करते हैं। मैं ऐसे मामले के बारे में बात कर रहा हूं जहां कर्नेल कोड में कुछ सीपीयू-गहन ऑपरेशन है जैसे सूची को सॉर्ट करना।)

यदि सिस्टम उस कार्य को को पूर्ववत करने की अनुमति देता है जबकि यह कर्नेल कोड चला रहा है, तब हमारे पास "प्रीपेप्टिव कर्नेल" कहा जाता है। ऐसी प्रणाली अप्रत्याशित देरी से प्रतिरक्षा है जिसे सिस्कोल के दौरान सामना किया जा सकता है, इसलिए यह एम्बेडेड या रीयल-टाइम कार्यों के लिए बेहतर अनुकूल हो सकता है।

उदाहरण के लिए, यदि किसी विशेष सीपीयू पर दो कार्य उपलब्ध हैं, और कोई एक सिस्कोल लेता है जो पूरा करने के लिए 5ms लेता है, और दूसरा एमपी 3 प्लेयर एप्लिकेशन है जिसे प्रत्येक 2ms ऑडियो पाइप को खिलाने की आवश्यकता होती है, तो आप सुन सकते हैं ऑडियो stuttering।

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

एक समझौता CONFIG_PREEMPT_VOLUNTARY है, जो कर्नेल के अंदर कुछ बिंदुओं पर कार्य-स्विच की अनुमति देता है, लेकिन हर जगह नहीं। यदि वहां केवल कुछ ही जगहें हैं जहां कर्नेल कोड कम हो सकता है, जटिलता को प्रबंधित करने के दौरान यह विलंबता को कम करने का एक सस्ता तरीका है।

0

लिनक्स कर्नेल प्रीपेप्टिव का अर्थ है कि कर्नेल प्रीपेशन का समर्थन करता है।

उदाहरण के लिए, दो प्रक्रियाएं पी 1 (उच्च प्राथमिकता) और पी 2 (कम प्राथमिकता) हैं जो पढ़ी गई सिस्टम कॉल कर रही हैं और वे कर्नेल मोड में चल रही हैं। मान लें कि पी 2 चल रहा है और कर्नेल मोड में है और पी 2 चलाने के लिए निर्धारित है।

यदि कर्नेल छूट उपलब्ध है, तो कर्नेल स्तर पर प्रीपेप्शन हो सकता है यानी पी 2 को छूट दी जा सकती है और सोने के लिए और पी 1 चलना जारी रख सकता है।

तो गिरी पूर्वक्रय उपलब्ध नहीं है, के बाद से P2 कर्नेल मोड में है, प्रणाली बस इंतजार कर रहा है जब तक P2 पूरा हो गया है और उसके बाद

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