थ्रेड्स: कर्नेल थ्रेड्स बनाम कर्नेल समर्थित थ्रेड्स बनाम उपयोगकर्ता-स्तरीय थ्रेड्स?


9

क्या किसी को पता है कि इन के बीच अंतर क्या हैं?

यह मुझे लगता है कि कर्नेल थ्रेड कोड के साथ मेल खाता है जो कर्नेल (सहज रूप से) चलाता है, लेकिन मुझे दूसरे के बारे में निश्चित नहीं है ...

इसके अलावा, क्या pthreads मानक को उपयोगकर्ता-स्तर और कर्नेल-समर्थित माना जाएगा, क्योंकि आप एक लाइब्रेरी एक्सेस कर रहे हैं, जबकि कर्नेल सभी थ्रेड शेड्यूलिंग / स्विचिंग करता है?

जवाबों:


14

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

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

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


लिनक्स की तरह कार्यान्वयन क्या है?
यती ने १४'११ को

3
सभी आधुनिक (2.6 कर्नेल या बाद में) लिनक्स सिस्टम जिन्हें मैं जानता हूं, सिस्टम का डिफ़ॉल्ट थ्रेडिंग कार्यान्वयन 1-टू -1 है, प्रत्येक उपयोगकर्ता-स्तरीय थ्रेड में एक केएसई (कर्नेल शेड्यूलिंग इकाई - मूल रूप से, एक थ्रेड निर्धारित है लिनक्स कर्नेल)। आपके द्वारा 'pthread_create' के साथ बनाया गया धागा सीधे कर्नेल द्वारा शेड्यूल किया जाएगा। आधुनिक सिस्टम आमतौर पर एनपीटीएल का उपयोग करते हैं , पुराने सिस्टम ने लिनक्सट्रेड्स का उपयोग किया है - वे दोनों 1-टू -1 हैं।
डेविड श्वार्ट्ज

"या एक हाइब्रिड दृष्टिकोण (जहां कर्नेल एक कर्नेल-स्तरीय थ्रेड को शेड्यूल करता है, जो तब उपयोगकर्ता-स्पेस में, एक यूज़र-लेवल थ्रेड को शेड्यूल करता है)।" हे डेविड, क्या आप इसे फिर से समझा सकते हैं? मुझे यकीन नहीं है कि क्या चल रहा है ... जब आप कहते हैं कि 1-टू -1 मैपिंग क्या आप कर्नेल-स्तर के थ्रेड्स का उल्लेख करते समय थ्रेड कंट्रोल ब्लॉक का उल्लेख कर रहे हैं?
डार्क टमप्लर

द्वारा 1 से 1 मेरा मतलब है कि हर बार जब आप 'pthread_create' कहते हैं, एक नया संदर्भ बनाई गई है कि कर्नेल द्वारा निर्धारित है। एक हाइब्रिड दृष्टिकोण में, कर्नेल द्वारा निर्धारित संदर्भों की संख्या निर्मित थ्रेड्स की संख्या से कम है - कर्नेल उन संदर्भों में से एक का शेड्यूल करता है, और फिर लाइब्रेरीज़ थ्रेडिंग एप्लिकेशन द्वारा बनाए गए थ्रेड्स में से एक को शेड्यूल करता है।
डेविड श्वार्ट्ज 1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.