सभी आधुनिक सीपीयू में वर्तमान में निष्पादित मशीन अनुदेश को बाधित करने की क्षमता है । वे पर्याप्त स्थिति को बचाते हैं (आमतौर पर, लेकिन हमेशा नहीं, स्टैक पर) बाद में निष्पादन को फिर से शुरू करना संभव बनाने के लिए , जैसे कि कुछ भी नहीं हुआ था (बाधित निर्देश को खरोंच से फिर से शुरू किया जाएगा, आमतौर पर)। फिर वे एक बाधा हैंडलर को निष्पादित करना शुरू करते हैं , जो सिर्फ अधिक मशीन कोड है, लेकिन एक विशेष स्थान पर रखा गया है ताकि सीपीयू को पता हो कि यह पहले से कहां है। बाधित हैंडलर हमेशा ऑपरेटिंग सिस्टम के कर्नेल का हिस्सा होते हैं : वह घटक जो सबसे बड़े विशेषाधिकार के साथ चलता है और अन्य सभी घटकों के निष्पादन की निगरानी के लिए जिम्मेदार होता है। 1,2
रुकावटों को सिंक्रोनस किया जा सकता है , जिसका अर्थ है कि वे सीपीयू द्वारा ट्रिगर किए जाते हैं, जो वर्तमान में निष्पादित निर्देश, या अतुल्यकालिक किसी चीज की सीधी प्रतिक्रिया के रूप में है , जिसका अर्थ है कि वे किसी बाहरी घटना के कारण अप्रत्याशित समय पर होते हैं, जैसे नेटवर्क पर पहुंचने वाले डेटा बंदरगाह। कुछ लोग एसिंक्रोनस इंटरप्ट के लिए "इंटरप्ट" शब्द को आरक्षित करते हैं, और सिंक्रोनस इंटरप्ट को "ट्रैप", "दोष", या "अपवाद" के बजाय कहते हैं, लेकिन उन सभी शब्दों के अन्य अर्थ हैं इसलिए मैं "सिंक्रोनस इंटरप्ट" के साथ छड़ी करने जा रहा हूं।
अब, अधिकांश आधुनिक ऑपरेटिंग सिस्टम में प्रक्रियाओं की धारणा है । इसके सबसे बुनियादी में, यह एक ऐसा तंत्र है जिससे कंप्यूटर एक ही समय में एक से अधिक प्रोग्राम चला सकता है, लेकिन यह भी एक प्रमुख पहलू है कि ऑपरेटिंग सिस्टम मेमोरी प्रोटेक्शन को कैसे कॉन्फ़िगर करते हैं , जो कि अधिकांश (लेकिन, अफसोस) की विशेषता है अभी भी सभी नहीं ) आधुनिक सीपीयू। यह वर्चुअल मेमोरी के साथ जाता है, जो रैम में मेमोरी एड्रेस और वास्तविक स्थानों के बीच मैपिंग को बदलने की क्षमता है। मैमोरी प्रोटेक्शन ऑपरेटिंग सिस्टम को प्रत्येक प्रक्रिया को रैम के अपने निजी हिस्से को देने की अनुमति देता है, कि केवल यह एक्सेस कर सकता है। यह ऑपरेटिंग सिस्टम (कुछ प्रक्रिया की ओर से अभिनय) को रैम के क्षेत्रों को पढ़ने के लिए नामित करने के लिए अनुमति देता है, केवल पढ़ने योग्य, निष्पादन योग्य, सहयोग करने वाली प्रक्रियाओं के समूह के बीच साझा किया जाता है, आदि में मेमोरी का एक हिस्सा भी होगा जो केवल द्वारा पहुँचा जा सकता है। गिरी। 3
जब तक प्रत्येक प्रक्रिया केवल उन तरीकों से मेमोरी तक पहुंचती है जो सीपीयू को अनुमति देने के लिए कॉन्फ़िगर किया गया है, स्मृति सुरक्षा अदृश्य है। जब एक प्रक्रिया नियमों को तोड़ती है, तो सीपीयू एक तुल्यकालिक व्यवधान उत्पन्न करेगा, जिससे कर्नेल को चीजों को छाँटने के लिए कहा जाएगा। यह नियमित रूप से होता है कि प्रक्रिया वास्तव में नियमों को नहीं तोड़ती है, प्रक्रिया को जारी रखने की अनुमति देने से पहले केवल कर्नेल को कुछ काम करने की आवश्यकता होती है। उदाहरण के लिए, यदि किसी प्रक्रिया की मेमोरी के किसी पृष्ठ को स्वैप फ़ाइल में "बेदखल" करने की आवश्यकता होती है, तो कुछ और के लिए रैम में जगह खाली करने के लिए, कर्नेल उस पृष्ठ को अप्राप्य चिह्नित करेगा। अगली बार जब प्रक्रिया इसका उपयोग करने की कोशिश करेगी, तो सीपीयू एक मेमोरी-सुरक्षा व्यवधान उत्पन्न करेगा; कर्नेल स्वैप से पृष्ठ को फिर से प्राप्त करेगा, इसे वापस वहीं रखें जहां यह था, इसे फिर से चिह्नित करें, और निष्पादन को फिर से शुरू करें।
लेकिन मान लीजिए कि इस प्रक्रिया ने वास्तव में नियमों को तोड़ दिया। इसने एक ऐसे पेज को एक्सेस करने की कोशिश की, जिसमें कभी भी कोई रैम मैप नहीं की गई हो, या उसने किसी ऐसे पेज को अंजाम देने की कोशिश की हो, जो मशीन कोड या नहीं के रूप में चिह्नित हो। ऑपरेटिंग सिस्टम के परिवार को आमतौर पर "यूनिक्स" के रूप में जाना जाता है, सभी इस स्थिति से निपटने के लिए संकेतों का उपयोग करते हैं । 4 सिग्नल इंटरप्ट के समान होते हैं, लेकिन वे कर्नेल द्वारा उत्पन्न होते हैं और प्रक्रियाओं द्वारा फील्ड किए जाते हैं, बजाय हार्डवेयर द्वारा उत्पन्न किए और कर्नेल द्वारा फील्ड किए जाते हैं। प्रक्रियाएं सिग्नल हैंडलर को परिभाषित कर सकती हैंअपने कोड में, और कर्नेल को बताएं कि वे कहां हैं। उन सिग्नल हैंडलर को तब नियंत्रित किया जाएगा, जब आवश्यक हो, नियंत्रण के सामान्य प्रवाह को बाधित करें। सिग्नल सभी में एक नंबर और दो नाम होते हैं, जिनमें से एक क्रिप्टोकरंसी और दूसरा थोड़ा कम क्रिप्टोकरंसी होता है। जब एक प्रक्रिया स्मृति-सुरक्षा नियमों को तोड़ती है तो संकेत उत्पन्न होता है (कन्वेंशन द्वारा) संख्या 11, और इसके नाम हैं SIGSEGV
और "विभाजन दोष"। 5,6
सिग्नल और इंटरप्ट के बीच एक महत्वपूर्ण अंतर यह है कि हर सिग्नल के लिए एक डिफ़ॉल्ट व्यवहार होता है। यदि ऑपरेटिंग सिस्टम सभी अवरोधों के लिए हैंडलर को परिभाषित करने में विफल रहता है, तो यह ओएस में एक बग है, और सीपीयू एक लापता हैंडलर को लागू करने की कोशिश करने पर पूरा कंप्यूटर क्रैश हो जाएगा। लेकिन सभी सिग्नल के लिए सिग्नल हैंडलर को परिभाषित करने के लिए प्रक्रियाएं किसी दायित्व के तहत नहीं हैं। यदि कर्नेल किसी प्रक्रिया के लिए एक संकेत उत्पन्न करता है, और वह संकेत अपने डिफ़ॉल्ट व्यवहार पर छोड़ दिया गया है, तो कर्नेल बस आगे बढ़ेगा और जो कुछ भी डिफ़ॉल्ट है और प्रक्रिया को परेशान नहीं करेगा। अधिकांश संकेतों के डिफ़ॉल्ट व्यवहार या तो "कुछ नहीं करते हैं" या "इस प्रक्रिया को समाप्त करते हैं और शायद एक कोर डंप का उत्पादन भी करते हैं।" SIGSEGV
उत्तरार्द्ध में से एक है।
इसलिए, पुनरावृत्ति के लिए, हमारे पास एक प्रक्रिया है जिसने मेमोरी-सुरक्षा नियमों को तोड़ दिया है। सीपीयू ने प्रक्रिया को निलंबित कर दिया और एक तुल्यकालिक व्यवधान उत्पन्न किया। कर्नेल ने उस रुकावट को उत्पन्न SIGSEGV
किया और प्रक्रिया के लिए एक संकेत उत्पन्न किया । मान लेते हैं कि प्रक्रिया ने सिग्नल हैंडलर स्थापित नहीं किया है SIGSEGV
, इसलिए कर्नेल डिफ़ॉल्ट व्यवहार करता है, जो प्रक्रिया को समाप्त करना है। _exit
सिस्टम कॉल के रूप में इसका सभी समान प्रभाव पड़ता है : खुली फाइलें बंद हो जाती हैं, मेमोरी डीलॉक्लेटेड होती है, आदि।
इस बिंदु तक कुछ भी किसी भी संदेश को मुद्रित नहीं किया गया है जिसे एक मानव देख सकता है, और शेल (या, आमतौर पर, इस प्रक्रिया की मूल प्रक्रिया जो अभी समाप्त हो गई है) बिल्कुल भी शामिल नहीं है। SIGSEGV
उस प्रक्रिया में जाता है जिसने नियमों को तोड़ा, उसके माता-पिता को नहीं । अगले अनुक्रम में कदम है, हालांकि, माता पिता प्रक्रिया है कि अपने बच्चे को समाप्त कर दिया गया सूचित करने के लिए है। यह कई अलग अलग तरीकों, जिनमें से सबसे सरल है, जब माता-पिता पहले से ही इस अधिसूचना के लिए इंतजार कर रहा है, में से एक का उपयोग करने में भी हो सकता है wait
सिस्टम कॉल ( wait
, waitpid
, wait4
, आदि)। उस स्थिति में, कर्नेल सिर्फ उस सिस्टम कॉल को वापस करने का कारण बनेगा, और पेरेंट प्रक्रिया को एक कोड संख्या के साथ आपूर्ति करेगा, जिसे एक्ज़िट स्टेटस कहा जाता है। 7 बाहर निकलने की स्थिति माता-पिता को सूचित करती है कि बच्चे की प्रक्रिया क्यों समाप्त की गई; इस मामले में, यह सीखेगा कि SIGSEGV
संकेत के डिफ़ॉल्ट व्यवहार के कारण बच्चे को समाप्त कर दिया गया था ।
माता-पिता की प्रक्रिया तब संदेश को मुद्रित करके मानव को घटना की सूचना दे सकती है; शेल प्रोग्राम लगभग हमेशा ऐसा करते हैं। आपके crsh
पास ऐसा करने के लिए कोड शामिल नहीं है, लेकिन यह वैसे भी होता है, क्योंकि सी लाइब्रेरी की दिनचर्या system
पूर्ण रूप से चित्रित शेल /bin/sh
, "हूड के तहत" चलती है । crsh
है दादा-दादी इस परिदृश्य में, पेरेंट-प्रोसेस नोटिफिकेशन फ़ील्ड द्वारा दिया गया है /bin/sh
, जो इसके सामान्य संदेश को प्रिंट करता है। उसके बाद /bin/sh
ही बाहर निकलता है, क्योंकि इसके पास करने के लिए अधिक कुछ नहीं है, और सी लाइब्रेरी के कार्यान्वयन से उस निकास अधिसूचना को system
प्राप्त होता है । आप अपने कोड में उस निकास सूचना को देख सकते हैं, के रिटर्न मान का निरीक्षण करकेsystem
; लेकिन यह आपको यह नहीं बताएगा कि पोते की प्रक्रिया एक सेगफॉल्ट पर मृत्यु हो गई, क्योंकि वह मध्यवर्ती शेल प्रक्रिया द्वारा भस्म हो गई थी।
फुटनोट
कुछ ऑपरेटिंग सिस्टम कर्नेल के हिस्से के रूप में डिवाइस ड्राइवरों को लागू नहीं करते हैं ; हालांकि, सभी को बाधित संचालकों अभी भी गिरी का हिस्सा बनने के लिए है, और क्योंकि हार्डवेयर कुछ भी अनुमति नहीं देता है तो, कोड है कि स्मृति संरक्षण कॉन्फ़िगर करता है लेकिन इन कार्यों को गिरी।
एक "हाइपरवाइज़र" या "वर्चुअल मशीन मैनेजर" नामक एक कार्यक्रम हो सकता है जो कर्नेल की तुलना में अधिक विशेषाधिकार प्राप्त है, लेकिन इस उत्तर के प्रयोजनों के लिए इसे हार्डवेयर का हिस्सा माना जा सकता है ।
कर्नेल एक कार्यक्रम है , लेकिन यह एक प्रक्रिया नहीं है; यह पुस्तकालय जैसा है। सभी प्रक्रियाएं कर्नेल कोड के कुछ हिस्सों को समय-समय पर अपने कोड के अलावा निष्पादित करती हैं। कई "कर्नेल थ्रेड्स" हो सकते हैं जो केवल कर्नेल कोड निष्पादित करते हैं, लेकिन वे हमें यहां चिंता नहीं करते हैं।
एक और केवल OS की संभावना है कि आप अब और यूनिक्स के कार्यान्वयन पर विचार नहीं कर सकते, जो कि विंडोज से संबंधित है। यह इस स्थिति में संकेतों का उपयोग नहीं करता है। (वास्तव में, इसमें संकेत नहीं हैं । विंडोज पर <signal.h>
इंटरफ़ेस पूरी तरह से सी लाइब्रेरी द्वारा फेक है।) इसके बजाय " संरचित अपवाद हैंडलिंग " नामक कुछ का उपयोग करता है ।
कुछ स्मृति-सुरक्षा उल्लंघन उत्पन्न होते हैं SIGBUS
("बस त्रुटि") के बजाय SIGSEGV
। दोनों के बीच की रेखा अंडरस्क्राइब है और सिस्टम से सिस्टम में भिन्न होती है। यदि आपने एक प्रोग्राम लिखा है SIGSEGV
, जो हैंडलर को परिभाषित करता है , तो संभवतः उसी हैंडलर को परिभाषित करना एक अच्छा विचार है SIGBUS
।
"सेगमेंटेशन फॉल्ट" मूल यूनिक्स को चलाने वाले कंप्यूटरों में से एक , संभवतः पीडीपी -11 द्वारा मेमोरी-प्रोटेक्शन उल्लंघन के लिए उत्पन्न बाधा का नाम था । " सेगमेंटेशन " एक प्रकार का मेमोरी प्रोटेक्शन है, लेकिन आजकल "सेगमेंटेशन फ़ॉल्ट " शब्द किसी भी प्रकार के मेमोरी प्रोटेक्शन उल्लंघन को संदर्भित करता है।
अन्य सभी तरीकों से माता-पिता की प्रक्रिया को समाप्त होने वाले बच्चे के बारे में सूचित किया जा सकता है, माता-पिता को कॉल wait
करने और बाहर निकलने की स्थिति प्राप्त करने के साथ समाप्त हो सकता है । यह सिर्फ इतना है कि पहले कुछ और होता है।
crsh
इस तरह के प्रयोग के लिए एक महान विचार है। हम सभी को इसके बारे में और इसके पीछे के विचार के बारे में बताने के लिए धन्यवाद।