सबसे पहले, "पूर्वज" "माता-पिता" के समान नहीं है। पूर्वज माता-पिता के माता-पिता के माता-पिता के माता-पिता हो सकते हैं, और कर्नेल केवल एक स्तर का ट्रैक रखता है। हालांकि, जब एक प्रक्रिया मर जाती है, तो उसके बच्चों को init द्वारा अपनाया जाता है, इसलिए आपको बहुत सारी प्रक्रियाएं दिखाई देंगी जिनके माता-पिता एक विशिष्ट प्रणाली पर 1 हैं।
आधुनिक लिनक्स सिस्टम में कुछ प्रक्रियाएं होती हैं जो कर्नेल कोड को निष्पादित करती हैं, लेकिन उपयोगकर्ता प्रक्रियाओं के रूप में प्रबंधित की जाती हैं, जहां तक शेड्यूलिंग का संबंध है। (वे सामान्य स्मृति प्रबंधन नियमों का पालन नहीं करते हैं क्योंकि वे कर्नेल कोड चला रहे हैं।) ये प्रक्रियाएँ kthreadd
(यह कर्नेल थ्रेड्स का init) हैं। आप उन्हें उनके मूल प्रक्रिया आईडी (2) या, आमतौर पर, इस तथ्य से पहचान सकते हैं कि ps
उन्हें वर्ग कोष्ठक के बीच एक नाम के साथ या इस तथ्य से पता चलता है कि /proc/2/exe
(आमतौर पर प्रक्रिया निष्पादन योग्य के लिए एक प्रतीकात्मक लिंक) पढ़ा नहीं जा सकता है।
प्रक्रियाएं 1 ( init
) और 2 ( kthreadd
) बूट समय पर कर्नेल द्वारा सीधे बनाई जाती हैं, इसलिए उनके पास माता-पिता नहीं हैं। मान 0 का उपयोग उनके ppid फ़ील्ड में इंगित करने के लिए किया जाता है। 0 के रूप में यहाँ "कर्नेल ही" का अर्थ है।
उपयोगकर्ता प्रक्रियाओं को शुरू करने के लिए लिनक्स में कर्नेल के लिए कुछ सुविधाएं भी हैं, जिनका स्थान कुछ परिस्थितियों में sysctl पैरामीटर के माध्यम से इंगित किया गया है। उदाहरण के लिए, कर्नेल मॉड्यूल लोडिंग घटनाओं को ट्रिगर कर सकता है (उदाहरण के लिए जब नया हार्डवेयर खोजा जाता है, या जब कुछ नेटवर्क प्रोटोकॉल का उपयोग किया जाता है) तो प्रोग्राम को kernel.modprobe
sysctl मान में कॉल करके । जब कोई प्रोग्राम कोर को डंप करता है, तो कर्नेल प्रोग्राम को इंगित करता है kernel.core_pattern
यदि कोई हो।
init
क्या सभी का "पूर्वज" हैuser threads
, जबकि सभी[kthreadd ]
का "माता-पिता"kernel threads
सही है? धन्यवाद!