जब यह SIGKILL सिग्नल भेजा जाता है तो एक प्रोग्राम क्या करता है?


39

जब मैं killall -9 nameएक कार्यक्रम को मारता था, तो राज्य ज़ोंबी हो जाता था। कुछ मिनट बाद, यह वास्तव में बंद हो गया। तो, उन मिनटों के दौरान क्या हो रहा है?

जवाबों:


66

प्रोग्राम वास्तव में कभी भी SIGKILL सिग्नल प्राप्त नहीं करता है, क्योंकि SIGKILL ऑपरेटिंग सिस्टम / कर्नेल द्वारा पूरी तरह से संभाला जाता है।

जब किसी विशेष प्रक्रिया के लिए SIGKILL भेजा जाता है, तो कर्नेल का शेड्यूलर उस प्रक्रिया को उपयोगकर्ता-स्थान कोड चलाने के लिए और अधिक CPU समय देना तुरंत बंद कर देता है। यदि समय-समय पर शेड्यूलर यह निर्णय लेता है तो प्रक्रिया में अन्य CPU / कोर पर उपयोगकर्ता-स्पेस कोड निष्पादित करने वाले थ्रेड्स हैं, उन थ्रेड्स को भी रोक दिया जाएगा। (सिंगल-कोर सिस्टम में यह बहुत सरल हुआ करता था: यदि सिस्टम में एकमात्र CPU कोर शेड्यूलर चला रहा था, तो परिभाषा के अनुसार यह उसी समय प्रक्रिया नहीं चला रहा था!)

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

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

नतीजतन, इस प्रक्रिया को वास्तव में उस जानकारी को संसाधित करने का मौका कभी नहीं मिलेगा जो इसे SIGKILL को मिली है।

जब एक प्रक्रिया "ज़ोंबी" स्थिति में होती है तो इसका मतलब है कि प्रक्रिया पहले से ही मृत है, लेकिन इसकी मूल प्रक्रिया ने wait(2)सिस्टम कॉल का उपयोग करके मृत प्रक्रिया के निकास कोड को पढ़कर अभी तक इसे स्वीकार नहीं किया है । मूल रूप से एकमात्र संसाधन एक ज़ोंबी प्रक्रिया है जो किसी भी अधिक उपभोग कर रही है वह प्रक्रिया तालिका में एक स्लॉट है जो अपनी पीआईडी, निकास कोड और प्रक्रिया के कुछ अन्य "महत्वपूर्ण आंकड़े" को अपनी मृत्यु के समय रखती है।

यदि माता-पिता की प्रक्रिया अपने बच्चों से पहले मर जाती है, तो अनाथ बच्चे की प्रक्रियाओं को स्वचालित रूप से PID # 1 द्वारा अपनाया जाता है, जिसका विशेष कर्तव्य होता wait(2)है कि वह फोन करता रहे ताकि कोई भी अनाथ प्रक्रिया लाश के रूप में चारों ओर न चिपके।

यदि किसी ज़ोंबी प्रक्रिया को स्पष्ट होने में कई मिनट लगते हैं, तो यह बताता है कि ज़ोंबी की मूल प्रक्रिया संघर्ष कर रही है या अपना काम ठीक से नहीं कर रही है।

यूनिक्स जैसे ऑपरेटिंग सिस्टम में ज़ोंबी समस्याओं के मामले में क्या करना है, इस पर जीभ-में-गाल का वर्णन है: "आप लाश के लिए कुछ भी नहीं कर सकते, क्योंकि वे पहले से ही मर चुके हैं। इसके बजाय, दुष्ट ज़ोंबी मास्टर को मार डालो! " (यानी कष्टप्रद लाश की मूल प्रक्रिया)


5
यदि SIGKILL भेजे जाने पर प्रक्रिया कर्नेल कॉल में होती है (जैसे I / O कर रही है) तो क्या होगा?
gidds

9
@ गिग्स या तो I / O SIGKILL को निष्पादित करने के लिए रद्द कर दिया जाएगा, या I / O पूर्ण होने तक SIGKILL को विलंबित किया जाएगा। यह 'एस' और 'डी' स्लीप के बीच का अंतर है ps: 'एस' आई / ओ के लिए है जो इस बात का इंतजार करता है कि सिग्नल देने के लिए कर्नेल रद्द हो सकता है, और उन लोगों के लिए 'डी' नहीं।
zwol

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

4
@ गिड्स कम से कम चार अलग-अलग राज्य हैं जो प्रक्रिया में हो सकते हैं। यह इस समय कर्नेल कोड चला सकता है या यह तीन अलग-अलग नींद राज्यों में से एक में सो सकता है। नींद के संकेत घातक संकेतों को छोड़कर या तो बाधित, गैर-रुकावट या गैर-रुकावट हो सकते हैं। यदि यह बिना रुकावट की नींद में है तो इसे तब तक सोते रहना है जब तक इसकी जरूरत है और केवल एक बार यह जागने के बाद इसे मरने का मौका मिलेगा। यदि यह अन्य दो स्लीप स्टेट्स में से एक में था, तो इसे तुरंत जगा दिया जाएगा और जैसे ही इसके लिए सीपीयू उपलब्ध होगा, अनुसूचित कर दिया जाएगा।
15

2
@ आगे क्या होता है यह उस कर्नेल कोड पर निर्भर करता है जो वह चला रहा था। भले ही यह पहले से ही चल रहा था या पहले जागना था और फिर कर्नेल कोड को चलाना शुरू किया जा सकता था जिस समय इसे जारी रखने की अनुमति दी जाएगी। और उस कर्नेल कोड को ध्यान देने के लिए जिम्मेदार है कि प्रक्रिया को मरने और तदनुसार कार्य करने के लिए कहा गया है। उस समय कर्नेल कोड से निपटने का उचित तरीका यह है कि जिस भी कार्य को अंजाम दिया जा रहा है, उसमें से केवल एक त्रुटि वापस करें। एक बार जब कर्नेल कॉल स्टैक को अनसुना कर दिया गया है तो सिग्नल हैंडलिंग कोड उपयोगकर्ता मोड पर लौटने से पहले ले सकता है।
कास्परड डे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.