2011-08-11 14 views
7

पुन: प्रवेश प्रक्रिया क्या है और क्या आप इसका उपयोग करते समय उदाहरण का परिदृश्य दे सकते हैं?पुन: प्रवेश प्रक्रिया क्या है?

संपादित करें: साथ ही, कई प्रक्रियाएं समांतर में पुन: प्रवेश प्रक्रिया तक पहुंच सकती हैं?

के रूप में मैं पूरी तरह इसलिए मेरे सवाल यहाँ

उत्तर

15

पुन: प्रवेश के पीछे विचार यह है कि दिनचर्या को पहले से निष्पादित करने के बीच में कहा जा सकता है और यह अभी भी सही काम करेगा।

आम तौर पर यह केवल पैरामीटर और स्टैक पर घोषित स्थानीय चर का उपयोग करके प्राप्त किया जाता है (सी शर्तों में, static स्थानीय)। यह भी महत्वपूर्ण होगा कि यह निष्पादन के दौरान किसी भी वैश्विक संसाधन को लॉक न करे।

अब, आप पूछ सकते हैं, "नियमित रूप से एक अजीब चीज कितनी बार एक बार चलती है?" खैर, यह कुछ तरीकों से हो सकता है:

  • दिनचर्या रिकर्सिव (या दिनचर्या के किसी अन्य सेट के साथ परस्पर-पुनरावर्ती) है।
  • इसे किसी अन्य धागे द्वारा बुलाया जाता है।
  • इसे एक बाधा से बुलाया जाता है।

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

+0

ध्यान दें कि आपके मामले के लिए पुनर्वित्त आवश्यक नहीं है (2) (इसे किसी अन्य धागे द्वारा बुलाया जाता है)। उस मामले के लिए लॉकिंग हमेशा पर्याप्त होती है, क्योंकि धागा स्वतंत्र रूप से प्रगति कर सकता है। रिकर्सिव कॉलिंग, और सिग्नल हैंडलर से कॉल, अलग हैं कि "बाहरी" कॉल "आंतरिक" कॉल रिटर्न तक प्रगति नहीं कर सकता है। –

+0

ध्यान दें कि थ्रेड स्थानीय संग्रहण का उपयोग करके एक गैर-पुन: प्रवेश फ़ंक्शन थ्रेड सुरक्षित हो सकता है। –

2

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

+0

पर बनाए गए स्टैक फ्रेम का हिस्सा बन जाता है रिकर्सिव फ़ंक्शंस जरूरी नहीं है। उदाहरण के लिए: 'int तथ्य (int x) {static int tmp = fact (x-1); वापसी x> 1? एक्स * टीएमपी: 1; } ' –

+0

@ आर ..., जैसा कि मैं सहमत हूं, बदल गया है, लेकिन आपका उदाहरण छोटी है (स्थैतिक चर केवल प्रथम कॉल पर प्रारंभ किए जाते हैं)। – AProgrammer

+0

क्षमा करें, मैं आलसी था कि इसे एक टिप्पणी में फिट करने की कोशिश कर रहा था। सही संस्करण है: 'int तथ्य (int x) {स्थिर int tmp; टीएमपी = तथ्य (एक्स -1); वापसी x> 1? एक्स * टीएमपी: 1; } ' –

1

एक पुनर्वित्त प्रक्रिया वह है जिसमें प्रोग्राम कोड की एक प्रति एक ही अवधि के दौरान एकाधिक उपयोगकर्ताओं द्वारा साझा की जा सकती है। प्रवेश द्वार में दो प्रमुख पहलू हैं: प्रोग्राम कोड स्वयं को संशोधित नहीं कर सकता है और प्रत्येक उपयोगकर्ता के लिए स्थानीय डेटा अलग से संग्रहीत किया जाना चाहिए।

एक साझा प्रणाली में, पुनर्वितरण मुख्य स्मृति के अधिक कुशल उपयोग की अनुमति देता है: प्रोग्राम कोड की एक प्रति मुख्य स्मृति में रखी जाती है, लेकिन एक से अधिक एप्लिकेशन प्रक्रिया को कॉल कर सकते हैं। इस प्रकार, एक पुनर्वित्त प्रक्रिया में स्थायी भाग होना चाहिए (निर्देश जो प्रक्रिया को तैयार करते हैं) और एक अस्थायी हिस्सा (कॉलर प्रोग्राम पर एक पॉइंटर और कार्यक्रम द्वारा उपयोग किए जाने वाले स्थानीय चर के लिए स्मृति) होना चाहिए।

एक प्रक्रिया के सक्रियण नामक प्रत्येक निष्पादन उदाहरण स्थायी भाग में कोड निष्पादित करेगा लेकिन इसकी स्थानीय चर और पैरामीटर की अपनी प्रति होना चाहिए। किसी विशेष सक्रियण से जुड़े अस्थायी भाग को सक्रियण रिकॉर्ड के रूप में जाना जाता है।

पुनर्विक्रेता प्रक्रियाओं का समर्थन करने का सबसे सुविधाजनक तरीका एक ढेर के माध्यम से है। जब एक पुनर्वित्त प्रक्रिया कहा जाता है, तो सक्रियण रिकॉर्ड प्रक्रिया कॉल

संबंधित मुद्दे