क्या लिनक्स कर्नेल थ्रेड वास्तव में कर्नेल प्रक्रियाएं हैं?


19

मैंने कई स्थानों पर पढ़ा है कि लिनक्स जावा वीएम में प्रत्येक उपयोगकर्ता थ्रेड के लिए एक कर्नेल थ्रेड बनाता है। (मैं "कर्नेल थ्रेड" शब्द को दो अलग-अलग तरीकों से देखता हूं:

  1. कोर ओएस काम करने के लिए बनाया गया एक धागा और
  2. एक थ्रेड ओएस उपयोगकर्ता के काम करने के लिए और शेड्यूल से अवगत है।

मैं बाद के प्रकार के बारे में बात कर रहा हूं।)

क्या एक कर्नेल थ्रेड एक कर्नेल प्रक्रिया के समान है, क्योंकि लिनक्स प्रक्रिया माता-पिता और बच्चे के बीच साझा मेमोरी स्पेस का समर्थन करती है, या क्या यह वास्तव में एक अलग इकाई है?

जवाबों:


23

लिनक्स पर एक थ्रेड और एक प्रक्रिया के बीच कोई अंतर नहीं है। यदि आप क्लोन (2) को देखते हैं तो आपको झंडे का एक सेट दिखाई देगा जो यह निर्धारित करेगा कि क्या साझा किया गया है, और क्या नहीं साझा किया गया है, थ्रेड्स के बीच।

क्लासिक प्रक्रियाएं केवल धागे हैं जो कुछ भी साझा नहीं करते हैं; आप लिनक्स के तहत क्या घटक साझा कर सकते हैं।

यह अन्य OS कार्यान्वयन पर मामला नहीं है, जहां बहुत अधिक अंतर हैं।


22

प्रलेखन बहुत भ्रामक हो सकता है, इसलिए यहां " वास्तविक " लिनक्स मॉडल है:

  • लिनक्स कर्नेल के अंदर, जो कुछ चलाया जा सकता है (और अनुसूचित) उसे "प्रक्रिया" कहा जाता है,
  • प्रत्येक प्रक्रिया में एक सिस्टम-अद्वितीय प्रक्रिया ID (PID) और एक थ्रेड समूह ID (TGID) होती है,
  • "सामान्य" प्रक्रिया में PID = TGID है और कोई अन्य प्रक्रिया इस TGID मान को साझा नहीं करती है,
  • "थ्रेडेड" प्रक्रिया एक प्रक्रिया है जिसे TGID मान अन्य प्रक्रियाओं द्वारा साझा किया जाता है,
  • एक ही TGID को साझा करने वाली कई प्रक्रियाएं भी साझा करती हैं, कम से कम, समान मेमोरी स्पेस और सिग्नल हैंडलर (कभी-कभी)
  • यदि "थ्रेडेड" प्रक्रिया में PID = TGID है, तो इसे "मुख्य धागा" कहा जा सकता है,
  • getpid()किसी भी प्रक्रिया से कॉल करने पर उसका TGID (= "मुख्य धागा" PID) वापस आ जाएगा,
  • gettid()किसी भी प्रक्रिया से कॉल करने पर उसका PID (!) वापस आ जाएगा!
  • clone(2)सिस्टम कॉल के साथ किसी भी तरह की प्रक्रिया बनाई जा सकती है ,
  • फ़ोल्डर 'सांख्यिक नाम आप के साथ सूचीबद्ध कर सकते हैं ls /procके रूप में /proc/NUMBERTGIDs कर रहे हैं,
  • PID के /proc/TGID/taskरूप में फ़ोल्डर के संख्यात्मक नाम /proc/TGID/task/NUMBER,
  • यद्यपि आप हर मौजूदा PID को नहीं देखते हैं ls /proc, फिर भी आप कर सकते हैं cd /proc/any_PID

निष्कर्ष : कर्नेल के दृष्टिकोण से, केवल प्रक्रियाएं मौजूद हैं, प्रत्येक का अपना विशिष्ट पीआईडी ​​है, और एक तथाकथित धागा सिर्फ एक अलग तरह की प्रक्रिया है।

नोट: लिनक्स में "थ्रेड" अवधारणा के कार्यान्वयन से एक शब्दावली भ्रम पैदा हो गया है, और यदि getpid() आप झूठ बोल रहे हैं तो आप जो सोचते हैं वह नहीं करते हैं, यह इसलिए है क्योंकि इसका व्यवहार POSIX संगतता का अनुसरण करता है (थ्रेड्स एक आम पीआईडी ​​साझा करने वाले हैं) ।


1
सुझाव: "टास्क" शब्द का उपयोग करने से प्रक्रिया / थ्रेड कन्फ्यूजन में इतना कुछ न हो पाने से किसी चीज को चलाने में मदद मिल सकती है।
टॉरट

17

थ्रेड लिनक्स के तहत प्रक्रियाएं हैं। वे cloneसिस्टम कॉल के साथ बनाए जाते हैं , जो एक प्रक्रिया आईडी देता है जिसे killसिस्टम कॉल के माध्यम से सिग्नल भेजा जा सकता है , ठीक एक प्रक्रिया की तरह। थ्रेड प्रोसेस psआउटपुट में दिखाई देते हैं । cloneकॉल झंडे जो निर्धारित करती हैं कि माता-पिता की प्रक्रिया के वातावरण के ज्यादा धागा प्रक्रिया के साथ साझा किया जाता है पारित कर दिया है।


1
आदमी का pthreads(7)कहना है कि वर्तमान एनपीटीएल (मूल निवासी पॉसिक थ्रेड्स लाइब्रेरी) कार्यान्वयन के लिए, "एक प्रक्रिया में सभी थ्रेड्स को एक ही थ्रेड समूह में रखा जाता है, एक थ्रेड समूह के सभी सदस्य एक ही पीआईडी ​​को साझा करते हैं।" अप्रचलित LinuxThreads कार्यान्वयन में, प्रत्येक "थ्रेड" का अपना पीआईडी ​​है।
टॉटर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.