init प्रक्रिया: सभी प्रक्रियाओं के पूर्वज?


26

मैंने हमेशा सीखा है कि init प्रक्रिया सभी प्रक्रियाओं का पूर्वज है। प्रक्रिया 2 में 0 का PPID क्यों है?

$ ps -ef | head -n 3
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 May14 ?        00:00:01 /sbin/init
root         2     0  0 May14 ?        00:00:00 [kthreadd]

जवाबों:


32

सबसे पहले, "पूर्वज" "माता-पिता" के समान नहीं है। पूर्वज माता-पिता के माता-पिता के माता-पिता के माता-पिता हो सकते हैं, और कर्नेल केवल एक स्तर का ट्रैक रखता है। हालांकि, जब एक प्रक्रिया मर जाती है, तो उसके बच्चों को init द्वारा अपनाया जाता है, इसलिए आपको बहुत सारी प्रक्रियाएं दिखाई देंगी जिनके माता-पिता एक विशिष्ट प्रणाली पर 1 हैं।

आधुनिक लिनक्स सिस्टम में कुछ प्रक्रियाएं होती हैं जो कर्नेल कोड को निष्पादित करती हैं, लेकिन उपयोगकर्ता प्रक्रियाओं के रूप में प्रबंधित की जाती हैं, जहां तक ​​शेड्यूलिंग का संबंध है। (वे सामान्य स्मृति प्रबंधन नियमों का पालन नहीं करते हैं क्योंकि वे कर्नेल कोड चला रहे हैं।) ये प्रक्रियाएँ kthreadd(यह कर्नेल थ्रेड्स का init) हैं। आप उन्हें उनके मूल प्रक्रिया आईडी (2) या, आमतौर पर, इस तथ्य से पहचान सकते हैं कि psउन्हें वर्ग कोष्ठक के बीच एक नाम के साथ या इस तथ्य से पता चलता है कि /proc/2/exe(आमतौर पर प्रक्रिया निष्पादन योग्य के लिए एक प्रतीकात्मक लिंक) पढ़ा नहीं जा सकता है।

प्रक्रियाएं 1 ( init) और 2 ( kthreadd) बूट समय पर कर्नेल द्वारा सीधे बनाई जाती हैं, इसलिए उनके पास माता-पिता नहीं हैं। मान 0 का उपयोग उनके ppid फ़ील्ड में इंगित करने के लिए किया जाता है। 0 के रूप में यहाँ "कर्नेल ही" का अर्थ है।

उपयोगकर्ता प्रक्रियाओं को शुरू करने के लिए लिनक्स में कर्नेल के लिए कुछ सुविधाएं भी हैं, जिनका स्थान कुछ परिस्थितियों में sysctl पैरामीटर के माध्यम से इंगित किया गया है। उदाहरण के लिए, कर्नेल मॉड्यूल लोडिंग घटनाओं को ट्रिगर कर सकता है (उदाहरण के लिए जब नया हार्डवेयर खोजा जाता है, या जब कुछ नेटवर्क प्रोटोकॉल का उपयोग किया जाता है) तो प्रोग्राम को kernel.modprobesysctl मान में कॉल करके । जब कोई प्रोग्राम कोर को डंप करता है, तो कर्नेल प्रोग्राम को इंगित करता है kernel.core_patternयदि कोई हो।


1
तो initक्या सभी का "पूर्वज" है user threads, जबकि सभी [kthreadd ]का "माता-पिता" kernel threadsसही है? धन्यवाद!
नान जिओ

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