2011-09-02 21 views
8

मैं समझता हूं कि एक ज़ोंबी बनाई जाती है जब कोई प्रक्रिया अच्छी तरह से साफ नहीं होती है (इसके संसाधनों को पुनः प्राप्त नहीं किया जाता है/काटा जाता है)। एक नई प्रक्रिया बनाने के लिए कांटा() को कॉल करने के बाद, माता-पिता को इसे साफ़ करने के लिए हमेशा उस प्रक्रिया पर प्रतीक्षापिड को कॉल करना चाहिए।यूनिक्स लाश और डेमन्स

मैंने यह भी सीखा है कि एक बच्चे को फोर्क करके बनाया गया एक डिमन बनाया जाता है, और फिर बच्चे को मरने देता है। स्पष्ट रूप से यूनिक्स में इनिट प्रक्रिया (पिड # 1) प्रक्रिया करने के बाद प्रक्रिया की हिरासत ले लेगी।

जो मैं जानना चाहता हूं वह है - जहां तक ​​मुझे पता है, जब एक माता-पिता मर जाता है तो यह बच्चे को स्वचालित रूप से साफ करता है - तो ज़ोंबी पहली जगह कैसे बनता है?

दूसरा, एक डिमोनाइज्ड प्रक्रिया के माता-पिता मर जाते हैं, तो डिमनीकृत प्रक्रिया को ज़ोंबी क्यों नहीं माना जाता है?

+2

कोई भी अनाम डाउनवोट और करीबी अनुरोध के लिए कोई टिप्पणी देना चाहता है? मुझे लगता है कि यह एक सुंदर ठोस सवाल है। –

+2

यह तर्क दिया जा सकता है कि यह एक सर्वरफॉल्ट प्रश्न है, लेकिन प्रक्रिया प्रबंधन * निक्स प्रोग्रामिंग के लिए प्रासंगिक है इसलिए मुझे इसके साथ बहुत अधिक समस्या दिखाई नहीं दे रही है। –

+0

प्रक्रिया जिनके माता-पिता की मृत्यु हो गई है वे अनाथ हैं, ज़ोंबी नहीं। लाश 'जीवित मृत' हैं; अनाथ समाज के उत्पादक सदस्य हो सकते हैं। –

उत्तर

13

क्या मैं जानना चाहता हूँ है - जहाँ तक मुझे पता है, जब एक माता पिता यह मर जाता है स्वचालित रूप से बच्चे को साफ - तो कैसे एक ज़ोंबी पहली जगह में बनाया जाता है?

नहीं, माता-पिता स्वचालित रूप से बच्चों को साफ नहीं करते हैं। जब भी कोई प्रक्रिया समाप्त हो जाती है, तो उसके सभी बच्चे (दौड़ या ज़ोंबी) init प्रक्रिया द्वारा अपनाए जाते हैं।

लाश बाल प्रक्रियाएं हैं जो पहले से ही समाप्त हो चुकी हैं, और मौजूद हैं जब उनके माता-पिता अभी भी जिंदा हैं लेकिन अभी तक wait को उनकी निकास स्थिति प्राप्त करने के लिए नहीं कहा गया है। यदि माता-पिता मर जाता है (और wait नहीं कहा जाता है), ज़ोंबी बच्चों को init प्रक्रिया द्वारा अपनाया जाता है और अंत में उन्हें wait पर कॉल करने के लिए उन सभी पर कॉल किया जाता है, इसलिए वे प्रक्रिया तालिका से गायब हो जाते हैं।

ज़ोंबी प्रक्रिया को बनाए रखने के पीछे विचार है कि माता-पिता को wait के माध्यम से कभी दिलचस्पी हो, तो प्रक्रिया को समाप्त करने के बारे में उपयुक्त डेटा संरचनाओं को रखना है।

दूसरा, एक डिमोनाइज्ड प्रक्रिया के माता-पिता मर जाते हैं, तो क्यों नहीं है ज़ोनमी प्रक्रिया को ज़ोंबी माना जाता है?

daemonized प्रक्रियाओं के माता-पिता मर जाते हैं, लेकिन daemonized प्रक्रिया को नियंत्रित करने के टर्मिनल से अलग हो जाता है और setsid प्रणाली कॉल के माध्यम से एक प्रक्रिया समूह नेता बन जाता है।

+0

नाइट चुनना: प्रक्रिया 1 को छोड़कर सभी प्रक्रियाएं बाल प्रक्रियाएं हैं, और एक ज़ोंबी बस 'जीवित मृत' में से एक है, एक प्रक्रिया जो मर गई है लेकिन जिसका माता-पिता अभी तक मस्तिष्क की स्थिति एकत्र करने का इंतजार नहीं कर रहा है।एक ज़ोंबी एक समस्या है क्योंकि यह प्रक्रिया तालिका में एक स्लॉट पर कब्जा कर लेती है जिसे तब तक पुन: उपयोग नहीं किया जा सकता जब तक कि मस्तिष्क को साफ नहीं किया जाता है (मूल मूल प्रक्रिया द्वारा या सिस्टम द्वारा यदि माता-पिता प्रतीक्षा किए बिना मर जाते हैं)। चरम मामलों में (200,000 लाश), वे गंभीर रूप से एक प्रणाली को धीमा कर सकते हैं। मुझे इस साल की शुरुआत में यह समस्या थी: एक सिस्टम प्रक्रिया से एक मिनट में तीन लाश। ओ/एस अद्यतन! –

+1

इस अच्छे उत्तर के लिए बस एक और अतिरिक्त: ज़ोंबी रखने का एक कारण यह है कि पीआईडी ​​का पुन: उपयोग नहीं किया जाना चाहिए जब तक कि अभिभावक ने समाप्ति संदेश संसाधित नहीं किया हो। – Drunix

0

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

+1

सोलारिस के पुराने संस्करणों में केवल माता-पिता की प्रक्रिया को बाल प्रक्रिया को साफ करने के लिए अधिकृत किया जाता है लेकिन सोलारिस 11 इनिट प्रक्रिया से माता-पिता मरने पर सभी ज़ोंबी प्रक्रिया को साफ कर देते हैं। – sumana