जवाबों:
प्रीमेप्टिव कर्नेल पर, कर्नेल मोड में चलने वाली प्रक्रिया को कर्नेल फ़ंक्शन के बीच में रहते हुए दूसरी प्रक्रिया द्वारा प्रतिस्थापित किया जा सकता है।
यह केवल कर्नेल मोड में चलने वाली प्रक्रियाओं पर लागू होता है, उपयोगकर्ता मोड में एक सीपीयू निष्पादन प्रक्रिया "निष्क्रिय" माना जाता है। यदि उपयोगकर्ता मोड प्रक्रिया कर्नेल से किसी सेवा का अनुरोध करना चाहता है, तो उसे एक अपवाद जारी करना होगा जिसे कर्नेल संभाल सकता है।
उदाहरण के तौर पे:
प्रक्रिया A
एक अपवाद हैंडलर को निष्पादित करती है, प्रक्रिया B
एक IRQ अनुरोध द्वारा जागृत हो जाती है, कर्नेल प्रक्रिया A
को B
(एक मजबूर प्रक्रिया स्विच) के साथ बदल देता है । प्रक्रिया A
अधूरी छोड़ दी जाती है। शेड्यूलर बाद में निर्णय लेता है कि प्रक्रिया A
को सीपीयू समय मिलता है या नहीं।
एक गैर-व्याख्यात्मक कर्नेल पर, प्रक्रिया A
तब तक सभी प्रोसेसर समय का उपयोग करेगी जब तक कि वह समाप्त नहीं हो जाता या स्वेच्छा से अन्य प्रक्रियाओं को उसे (एक नियोजित प्रक्रिया स्विच) को बाधित करने की अनुमति देने का निर्णय नहीं लेता।
आज के लिनक्स आधारित ऑपरेटिंग सिस्टम में आम तौर पर पूरी तरह से प्रीमेप्टिव कर्नेल शामिल नहीं होते हैं, फिर भी महत्वपूर्ण कार्य होते हैं जिन्हें बिना किसी रुकावट के चलाना होता है। इसलिए मुझे लगता है कि आप इसे "सेलेक्टिव प्रीमेप्टिव कर्नेल" कह सकते हैं।
इसके अलावा, लिनक्स कर्नेल (लगभग) को पूरी तरह से प्रीमेप्टिव बनाने के लिए दृष्टिकोण हैं।
preemption है -> किसी उच्च प्राथमिकता वाले कार्य के पक्ष में वर्तमान में कार्य को पूर्व निर्धारित या बंद करने की ऑपरेटिंग सिस्टम की क्षमता। शेड्यूलिंग एक हो सकती है, लेकिन सीमित नहीं है, प्रक्रिया या I / O शेड्यूलिंग आदि।
लिनक्स के तहत, उपयोगकर्ता-अंतरिक्ष कार्यक्रम हमेशा से ही अप्राप्य रहे हैं: कर्नेल नियमित घड़ी टिक का उपयोग करके अन्य थ्रेड्स पर स्विच करने के लिए उपयोगकर्ता-अंतरिक्ष कार्यक्रमों को बाधित करता है। तो, कर्नेल स्पष्ट रूप से प्रोसेसर (जो सहकारी मल्टीटास्किंग में मामला है) को रिलीज़ करने के लिए उपयोगकर्ता-अंतरिक्ष कार्यक्रमों की प्रतीक्षा नहीं करता है। इसका मतलब है कि उपयोगकर्ता-अंतरिक्ष कार्यक्रम में एक अनंत लूप सिस्टम को ब्लॉक नहीं कर सकता है।
हालांकि, 2.6 कर्नेल तक, कर्नेल स्वयं प्रीमेचेबल नहीं था: जैसे ही एक धागे ने कर्नेल में प्रवेश किया है, यह दूसरे धागे को निष्पादित करने के लिए पूर्वनिर्मित नहीं किया जा सकता है। हालांकि, कर्नेल में प्रीमेशन की अनुपस्थिति ने विलंबता और मापनीयता के संबंध में कई समस्याएं पैदा कीं। तो, कर्नेल प्रीमेशन को 2.6 कर्नेल में पेश किया गया है, और कोई CONFIG_PREEMPT विकल्प का उपयोग करके इसे सक्षम या अक्षम कर सकता है। यदि CONFIG_PREEMPT सक्षम है, तो कर्नेल कोड को हर जगह प्रीपेप्ट किया जा सकता है, सिवाय इसके कि जब कोड ने स्थानीय व्यवधानों को निष्क्रिय कर दिया हो। कोड में एक अनंत लूप अब पूरे सिस्टम को ब्लॉक नहीं कर सकता है। यदि CONFIG_PREEMPT अक्षम है, तो 2.4 व्यवहार पुनर्स्थापित किया जाता है।
से उद्धृत और प्रारूपित: http://www.linuxquestions.org/questions/linux-general-1/pre-emptive-vs-non-pre-emptive-kernel-582437/
एक प्रीमेप्टिव कर्नेल एक प्रक्रिया को प्रीमेप्ट करने की अनुमति देता है जबकि यह कर्नेल मोड में चल रहा होता है। एक गैर-व्याख्यात्मक कर्नेल कर्नेल मोडेटो में चलने वाली एक प्रक्रिया को अनुमति नहीं देता है; एक कर्नेल-मोड प्रक्रिया तब तक चलेगी जब तक कि यह सीपीयू के नियंत्रण को कर्नेल मोड, ब्लॉक या स्वेच्छा से बाहर निकाल देता है। जाहिर है, एक गैर-व्याख्यात्मक कर्नेल अनिवार्य रूप से कर्नेल डेटा संरचनाओं पर दौड़ की स्थिति से मुक्त होता है, क्योंकि एक बार में केवल एक प्रक्रिया कर्नेल में सक्रिय होती है। हम प्रीमेप्टिव कर्नेल के बारे में ऐसा नहीं कह सकते हैं, इसलिए उन्हें यह सुनिश्चित करने के लिए सावधानीपूर्वक डिज़ाइन किया जाना चाहिए कि साझा कर्नेल डेटा दौड़ की स्थिति से मुक्त है। विशेषकर कर्नेल SMP आर्किटेक्चर के लिए डिजाइन करना विशेष रूप से मुश्किल है, क्योंकि इन वातावरणों में दो कर्नेल-मोड प्रक्रियाओं के लिए अलग-अलग प्रोसेसर पर एक साथ चलना संभव है। एक प्रीमेप्टिव कर्नेल वास्तविक समय की प्रोग्रामिंग के लिए अधिक उपयुक्त है, क्योंकि यह वास्तविक समय की प्रक्रिया को कर्नेल में वर्तमान में चल रही एक प्रक्रिया से पहले करने की अनुमति देगा। इसके अलावा, एक प्रीमेप्टिव कर्नेल अधिक उत्तरदायी हो सकता है, क्योंकि कम जोखिम होता है कि प्रोसेसर को प्रतीक्षा प्रक्रियाओं से मुक्त करने से पहले एक कर्नेल-मोड प्रक्रिया मनमाने ढंग से लंबी अवधि के लिए चलेगी। बेशक, यह प्रभाव कर्नेल कोड को डिजाइन करके कम से कम किया जा सकता है जो इस तरह से व्यवहार नहीं करता है। इस अध्याय में बाद में, हम पता लगाते हैं कि कर्नेल के भीतर विभिन्न ऑपरेटिंग सिस्टम प्रीमेशन कैसे प्रबंधित करते हैं। यह प्रभाव कर्नेल कोड को डिजाइन करके कम से कम किया जा सकता है जो इस तरह से व्यवहार नहीं करता है। इस अध्याय में बाद में, हम पता लगाते हैं कि कर्नेल के भीतर विभिन्न ऑपरेटिंग सिस्टम प्रीमेशन कैसे प्रबंधित करते हैं। यह प्रभाव कर्नेल कोड को डिजाइन करके कम से कम किया जा सकता है जो इस तरह से व्यवहार नहीं करता है। इस अध्याय में बाद में, हम पता लगाते हैं कि कर्नेल के भीतर विभिन्न ऑपरेटिंग सिस्टम प्रीमेशन कैसे प्रबंधित करते हैं।