पुराने लिनक्स कर्नेल की गैर-प्रीमिटिविटी का कारण क्या था?


15

पहले लिनक्स डेवलपर्स ने गैर-प्रीमेप्टिव कर्नेल को लागू करने का विकल्प क्यों चुना? यह सिंक्रनाइज़ेशन को बचाने के लिए है?

जहां तक ​​मुझे पता है, 90 के दशक की शुरुआत में लिनक्स विकसित किया गया था, जब पीसी में एक एकल प्रोसेसर था। इस तरह के पीसी में गैर-प्रीमेप्टिव कर्नेल क्या लाभ देता है? हालांकि, मल्टी-कोर प्रोसेसर द्वारा लाभ को कम क्यों किया जाता है?

जवाबों:


26

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

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

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


12

प्रीमेप्टिव कर्नेल का मतलब केवल यह है कि कोई बिग कर्नेल लॉक नहीं है

लिनक्स में प्रीमेप्टिव मल्टी-टास्किंग था (यानी यूजर कोड पहले से ही प्रीमिटेबल था) (जहाँ तक मुझे पता है, लिनस द्वारा फ़नट फ़ीट सर्वर पर अपलोड किया गया बहुत ही पहला लिनक्स 0.0.1 पहले से ही प्रीमिटिव मल्टीटास्क था)। यदि आपने निष्पादित किया है, उदाहरण के लिए, कई संपीड़न या संकलन प्रक्रियाएं, उन्हें पहले क्षण से समानांतर निष्पादित किया गया था।

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

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

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

कर्नेल प्रीमेप्टिव बनाने के लिए इस बड़े कर्नेल लॉक को समाप्त करना आवश्यक था, अर्थात माउंट और किसी भी अन्य कार्य को समवर्ती रूप से चलाने में सक्षम होना। यह एक बड़ा काम था।

ऐतिहासिक रूप से, यह एसएमपी (मल्टी-सीपीयू समर्थन) के बढ़ते समर्थन से वास्तव में जरूरी हो गया था। पहले समय में, वास्तव में कई-सीपीयू मेनबोर्ड थे। बाद में कई सीपीयू ("कोर") को एक चिप में एकीकृत किया गया था, आज वास्तव में मल्टी-सीपीयू मेनबोर्ड पहले से ही दुर्लभ हैं (वे आमतौर पर महंगा सर्वर सिस्टम में हैं)। इसके अलावा वास्तव में सिंगल-कोर सिस्टम (जहां एक सिंगल सीपीयू है, सिंगल कोर के साथ) दुर्लभ हैं।

इस प्रकार, आपके प्रश्न का उत्तर यह नहीं है कि "गैर-प्रीमेप्टिविटी का कारण क्या था", क्योंकि यह हमेशा प्रीमेप्टिव था। असली सवाल यह है कि वास्तव में आवश्यक आवश्यक कर्नेल निष्पादन क्या है । इसका उत्तर इसके लिए है: कई-सीपीयू, कई-कोर सिस्टम का बढ़ता अनुपात।


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

@ मुझे नहीं पता कि आप इसे पढ़ रहे थे। मोटे तौर पर 1.3 या 2.0 तक, केवल एक प्रक्रिया कर्नेल स्थान में हो सकती है, भले ही कई प्रक्रियाएं चल रही हों। यह सीमा 2.0 के साथ लगभग समाप्त हो गई थी। 2.4 तक, एक बड़ा कर्नेल लॉक था (यानी एक साथ कई फाइल सिस्टम बढ़ते हुए काम नहीं किया)।
पेटेर - मोनिका

@ नर्डन यह एक सहकारी मल्टीटास्किंग नहीं है, सीपीयू को जानबूझकर कार्य शेड्यूलर को वापस देने के लिए किसी भी प्रक्रिया की आवश्यकता नहीं थी। हां, BKL का कारण यह था कि इसे सही ढंग से करना बहुत काम है: 1) तालों को विभाजित करना होगा 2) ताला मुक्त डेटा संरचनाओं का उपयोग किया जाना चाहिए यह संभव था 3) विभाजित ताले गतिरोध को जन्म देते हैं / livelocks, ये आम तौर पर विशेष रूप से गंदे, कठोर-से-फिक्स कीड़े हैं, इन सभी को ढूंढना चाहिए और उन्हें ठीक करना चाहिए 4) सभी ड्राइवरों को कर्नेल कोर एपीआई में परिवर्तन के लिए पोर्ट किया जाना चाहिए।
पीटर - मोनिका

मैं इसे पढ़ रहा था जब मैं एक उत्तर की खोज कर रहा था, और यह एक कोर्स में एक जानकारी के रूप में दिया गया था जिसे मैं ले रहा हूं, जिसका नाम ऑपरेटिंग सिस्टम है।
नार्डन

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

3

यह एक तकनीकी जवाब नहीं है, लेकिन ओपी द्वारा पूछे गए विशिष्ट प्रश्न का एक ऐतिहासिक उत्तर है : "पुराने लिनक्स कर्नेल की गैर-प्रीमिटिविटी का कारण क्या था?"

(मुझे लगता है, जैसा कि @peterh द्वारा उनके उत्तर और टिप्पणियों में समझाया गया है, कि "गैर-अप्रत्यक्षता" द्वारा ओपी या तो इस तथ्य का या दोनों का उल्लेख कर रहा है कि केवल एक उपयोगकर्ता प्रक्रिया कर्नेल के अंदर हो सकती है (एक एपीआई में) समय और / या बड़ी कर्नेल लॉक।)

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

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

अगर वह जानता होता तो कितना लोकप्रिय / उपयोगी / महत्वपूर्ण लिनक्स बन जाता ... उसने शायद उसी तरह किया होता। (केवल IMO, मुझे नहीं पता कि वह वास्तव में क्या सोचता है।) क्योंकि आपके चलने से पहले ही आपको चलना होगा।

और यह उस तरह से एक लंबे समय तक रहा क्योंकि क) लिनक्स बनाने पर बहुत सारे अन्य काम होने थे जो आज है (या यहां तक ​​कि तब यह क्या था) और बी) इसे बदलने के लिए एक बड़ा मुश्किल उपक्रम होगा (जैसा कि अन्य उत्तरों में बताया गया है)।

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