c - अनाथ प्रक्रिया बनाम ज़ोंबी प्रक्रिया




unix fork (4)

एक ज़ोंबी बनाया जाता है जब एक माता-पिता की प्रक्रिया प्रतीक्षा प्रणाली कॉल का उपयोग नहीं करती है जब बच्चा अपने निकास की स्थिति को पढ़ने के लिए मर जाता है, और एक अनाथ बच्चे की प्रक्रिया होती है जिसे मूल अभिभावक प्रक्रिया बच्चे से पहले समाप्त होने पर init द्वारा पुन: प्राप्त किया जाता है।

स्मृति प्रबंधन और प्रक्रिया तालिका के संदर्भ में इन प्रक्रियाओं को अलग-अलग तरीके से कैसे नियंत्रित किया जाता है, विशेष रूप से यूनिक्स में?

एक उदाहरण या चरम मामला क्या है जब लाश या अनाथों का निर्माण अधिक से अधिक आवेदन या प्रणाली के लिए हानिकारक हो सकता है?


  1. कोई अनाथ नहीं हैं, लेकिन पीआईडी ​​1 का उपयोग करने की प्रक्रिया है।

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

  2. प्रत्येक प्रक्रिया किसी प्रकार की ज़ोंबी अवस्था से गुज़रती है, जब समाप्त होती है, अर्थात् SIGCHLD जारी करके इसके अंत की घोषणा करने और इसके प्रसंस्करण (वितरण या अज्ञानता) को स्वीकार करने के बीच का चरण।

जब ज़ोंबी राज्य में प्रवेश किया गया था, तो सिस्टम की प्रक्रिया सूची में एक प्रविष्टि है।

केवल एक महत्वपूर्ण संसाधन एक ज़ोंबी विशेष रूप से एक वैध पीआईडी ​​है।


एक अनाथ प्रक्रिया एक कंप्यूटर प्रक्रिया है जिसकी parent process समाप्त हो गई है या समाप्त हो गई है, हालांकि यह (बच्चे की प्रक्रिया) स्वयं चल रही है।
एक ज़ोंबी प्रक्रिया या अशुद्ध प्रक्रिया एक ऐसी प्रक्रिया है जिसने निष्पादन को पूरा कर लिया है लेकिन अभी भी प्रक्रिया तालिका में एक प्रविष्टि है क्योंकि इसकी मूल प्रक्रिया एक wait() सिस्टम कॉल को आमंत्रित नहीं करती है।


जब कोई प्रक्रिया समाप्त होती है, तो उसके संसाधनों को ऑपरेटिंग सिस्टम द्वारा निपटाया जाता है। हालाँकि, प्रक्रिया तालिका में उसका प्रवेश तब तक बना रहना चाहिए जब तक कि अभिभावक कॉल प्रतीक्षा () नहीं करते, क्योंकि प्रक्रिया तालिका में प्रक्रिया की निकास स्थिति होती है। एक प्रक्रिया जो समाप्त हो गई है, लेकिन जिनके माता-पिता ने अभी तक इंतजार नहीं किया है (), एक ज़ोंबी प्रक्रिया के रूप में जाना जाता है । जब वे समाप्त हो जाते हैं तो सभी इस स्थिति में संक्रमण करते हैं, लेकिन आम तौर पर वे केवल संक्षिप्त रूप में लाश के रूप में मौजूद होते हैं। एक बार जब अभिभावक प्रतीक्षा करें (), ज़ोंबी प्रक्रिया की प्रक्रिया पहचानकर्ता और प्रक्रिया तालिका में इसकी प्रविष्टि जारी हो जाती है।

अब विचार करें कि क्या होगा यदि एक माता-पिता ने प्रतीक्षा () को समाप्त नहीं किया और इसके बजाय, बच्चे की प्रक्रिया को अनाथों के रूप में छोड़ दिया। लिनक्स और UNIX अनाथ प्रक्रियाओं के लिए नए अभिभावक के रूप में init प्रक्रिया को असाइन करके इस परिदृश्य को संबोधित करते हैं। Init प्रक्रिया समय-समय पर प्रतीक्षा () को आमंत्रित करती है, जिससे किसी भी अनाथ प्रक्रिया की निकास स्थिति को एकत्र किया जा सकता है और अनाथ की प्रक्रिया पहचानकर्ता और प्रक्रिया-तालिका प्रविष्टि को जारी कर सकता है।

स्रोत: अब्राहम, पीटर, ग्रेग द्वारा ऑपरेटिंग सिस्टम अवधारणा


जब कोई बच्चा बाहर निकलता है, तो कुछ प्रक्रिया को उसका निकास कोड प्राप्त करने के लिए उस पर wait करनी चाहिए। ऐसा होने तक प्रक्रिया तालिका में निकास कोड संग्रहीत होता है। उस एग्जिट कोड को पढ़ने की क्रिया को बच्चे को "चीरना" कहा जाता है। उस समय के बीच जब कोई बच्चा बाहर निकलता है और काट दिया जाता है, उसे ज़ोंबी कहा जाता है। (जब आप इसके बारे में सोचते हैं तो पूरा नामकरण थोड़ा भीषण होता है; मैं इसके बारे में ज्यादा नहीं सोचने की सलाह देता हूं।)

प्रोसेस टेबल में लाश केवल जगह घेरती है। वे कोई मेमोरी या सीपीयू नहीं लेते हैं। हालांकि, प्रक्रिया तालिका एक सीमित संसाधन है, और अत्यधिक लाश इसे भर सकती है, जिसका अर्थ है कि कोई अन्य प्रक्रिया लॉन्च नहीं कर सकती है। इसके अलावा, वे कष्टप्रद अव्यवस्था हैं, और दृढ़ता से बचा जाना चाहिए।

यदि कोई प्रक्रिया अभी भी चल रहे बच्चों के साथ बाहर निकलती है (और अपने बच्चों को नहीं मारती है, तो रूपक विचित्र है), वे बच्चे अनाथ हैं। अनाथ बच्चों को तुरंत init ("वास्तव में, मुझे लगता है कि ज्यादातर लोग इसे" रेपरेंटिंग, "कहते हैं, लेकिन" गोद लेने "रूपक को बेहतर ढंग से ले जाते हैं)। एक अनाथ सिर्फ एक प्रक्रिया है। यह जो भी संसाधन उपयोग करेगा, उसका उपयोग करेगा। यह कहना उचित है कि यह एक "अनाथ" नहीं है क्योंकि उसके माता-पिता हैं, लेकिन मैंने उन्हें अक्सर यह कहते सुना है।

init स्वचालित रूप से अपने बच्चों को गोद ले (अपनाया या अन्यथा)। इसलिए यदि आप अपने बच्चों को साफ किए बिना बाहर निकलते हैं, तो वे लाश नहीं बनेंगे (कम से कम एक पल के लिए नहीं)।

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

इसलिए यदि आप एक पल से अधिक समय तक लाश देखते हैं, तो इसका मतलब है कि मूल प्रक्रिया में कुछ गड़बड़ है, और इस कार्यक्रम को बेहतर बनाने के लिए कुछ किया जाना चाहिए।