संक्षेप में स्टैक फ्रेम की अवधारणा को समझाइए


200

ऐसा लगता है कि मुझे प्रोग्रामिंग भाषा डिजाइन में कॉल स्टैक का विचार है । लेकिन मैं नहीं मिल सकता है (शायद, मैं अभी पर्याप्त खोज नहीं करता हूं) स्टैक फ्रेम क्या है इसका कोई भी सभ्य विवरण ।

इसलिए मैं किसी से पूछना चाहूंगा कि वह मुझे कुछ शब्दों में समझाए।

जवाबों:


195

स्टैक फ्रेम डेटा का एक फ्रेम है जो स्टैक पर धकेल दिया जाता है। कॉल स्टैक के मामले में, एक स्टैक फ्रेम एक फ़ंक्शन कॉल और उसके तर्क डेटा का प्रतिनिधित्व करेगा।

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

संपादित करें:

उच्च-स्तरीय कॉल स्टैक और प्रोसेसर के कॉल स्टैक के बीच एक बड़ा अंतर है।

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


6
"प्रोसेसर जानता है कि प्रत्येक फ्रेम में कितने बाइट्स हैं और स्टैक पॉइंटर को तदनुसार स्थानांतरित करता है क्योंकि फ़्रेम को धकेल दिया जाता है और स्टैक को बंद कर दिया जाता है।" - मुझे संदेह है कि प्रोसेसर स्टैक के बारे में कुछ भी जानता है, क्योंकि हम इसे सबबिंग (आवंटन), पुशिंग और पॉपिंग के माध्यम से हेरफेर करते हैं। और इसलिए यहां सम्मेलनों को बुलाया जा रहा है जो बताते हैं कि हमें स्टैक का उपयोग कैसे करना चाहिए।
विक्टर पोलेवॉय

78

यदि आप स्टैक को बहुत अच्छी तरह से समझते हैं तो आप समझ पाएंगे कि मेमोरी प्रोग्राम में कैसे काम करती है और यदि आप समझते हैं कि प्रोग्राम में मेमोरी कैसे काम करती है तो आप समझेंगे कि प्रोग्राम में कैसे काम करता है और यदि आप समझते हैं कि प्रोग्राम में फ़ंक्शन स्टोर कैसे होता है, तो आप समझ पाएंगे कि रिकर्सिव फंक्शन कैसे काम करता है और यदि आप समझते हैं कि पुनरावर्ती कार्य कैसे काम करता है आप समझेंगे कि संकलक कैसे काम करता है और यदि आप समझते हैं कि संकलक कैसे काम करता है तो आपका दिमाग संकलक के रूप में काम करेगा और आप किसी भी कार्यक्रम को बहुत आसानी से डीबग करेंगे

मुझे समझाएं कि स्टैक कैसे काम करता है:

पहले आपको यह जानना होगा कि स्टैक में कार्यों का प्रतिनिधित्व कैसे किया जाता है:

हीप गतिशील रूप से आवंटित मूल्यों को संग्रहीत करता है।
स्टैक स्वचालित आवंटन और विलोपन मूल्यों को संग्रहीत करता है।

यहां छवि विवरण दर्ज करें

आइए उदाहरण के साथ समझते हैं:

def hello(x):
    if x==1:
        return "op"
    else:
        u=1
        e=12
        s=hello(x-1)
        e+=1
        print(s)
        print(x)
        u+=1
    return e

hello(4)

अब इस कार्यक्रम के कुछ हिस्सों को समझें:

यहां छवि विवरण दर्ज करें

अब देखते हैं कि स्टैक क्या है और स्टैक पार्ट्स क्या हैं:

यहां छवि विवरण दर्ज करें

स्टैक का आवंटन:

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

व्यवहार में इसे देखें:

यहां छवि विवरण दर्ज करें

ब्लॉक का निपटान:

इसलिए अब जब भी कोई फ़ंक्शन रिटर्न स्टेटमेंट का सामना करता है, तो यह स्टैक से वर्तमान फ्रेम को हटा देता है।

स्टैक से लौटते समय, मूल्यों को मूल क्रम के विपरीत वापस आ जाएगा जिसमें उन्हें स्टैक में आवंटित किया गया था।

यहां छवि विवरण दर्ज करें


3
स्टैक नीचे की ओर बढ़ता है और ढेर ऊपर की ओर बढ़ता है, आपने उन्हें अपने आरेख में उलट दिया है। सही डायग्राम यहाँ
राफेल

@ राफेल भ्रम के लिए खेद है, मैं विकास की दिशा के बारे में बात कर रहा था मैं स्टैक विकास की दिशा के बारे में बात नहीं कर रहा था। विकास की दिशा और स्टैक वृद्धि की दिशा के बीच अंतर हैं। यहां देखें stackoverflow.com/questions/1677415/…
Aaditya Ura

2
राफेल सही है। साथ ही पहली तस्वीर गलत है। इसे किसी अन्य चीज़ से बदलें ("हीप स्टैक" के लिए Google चित्र खोजें)।
निकोस

इसलिए अगर मैं सही ढंग से समझूं, तो आपके तीसरे आरेख में, 3 स्टैक फ्रेम हैं क्योंकि hello()पुनरावर्ती रूप से कहा जाता है hello()जो तब (फिर से) पुनरावर्ती रूप से कहा जाता है hello(), और वैश्विक फ्रेम मूल कार्य है जिसे पहला कहा जाता है hello()?
एंडी जे

1
लिंक हमें कहाँ ले जाते हैं ?? सुरक्षा की गंभीर चिंता के रूप में इन लिंक को जल्द से जल्द हटा दिया जाना चाहिए।
शिवांशू

45

एक त्वरित लपेटो। हो सकता है कि किसी का बेहतर स्पष्टीकरण हो।

एक कॉल स्टैक 1 या कई कई स्टैक फ़्रेम से बना होता है। प्रत्येक स्टैक फ्रेम एक फ़ंक्शन या प्रक्रिया के लिए कॉल से मेल खाती है जिसे अभी तक रिटर्न के साथ समाप्त नहीं किया गया है।

स्टैक फ्रेम का उपयोग करने के लिए, एक थ्रेड दो पॉइंटर्स रखता है, एक को स्टैक पॉइंटर (SP) कहा जाता है, और दूसरे को फ़्रेम पॉइंटर (FP) कहा जाता है। एसपी हमेशा स्टैक के "टॉप" की ओर इशारा करता है, और एफपी हमेशा फ्रेम के "टॉप" की ओर इशारा करता है। इसके अतिरिक्त, थ्रेड एक प्रोग्राम काउंटर (पीसी) भी रखता है जो निष्पादित होने वाले अगले निर्देश को इंगित करता है।

निम्नलिखित स्टैक पर संग्रहीत हैं: स्थानीय चर और अस्थायी, वर्तमान अनुदेश के वास्तविक पैरामीटर (प्रक्रिया, कार्य, आदि)

स्टैक की सफाई के संबंध में अलग-अलग कॉलिंग कन्वेंशन हैं।


7
मत भूलो कि सबरूटीन का रिटर्न एड्रेस स्टैक पर जाता है।
टोनी आर

4
फ़्रेम पॉइंटर x86 शब्दों में बेस पॉइंटर भी है
पेटेरुला

1
मैं इस बात पर जोर देना चाहूंगा कि वर्तमान में सक्रिय प्रक्रिया अवतार के लिए स्टैक फ्रेम की शुरुआत में एक फ़्रेम पॉइंटर इंगित करता है।
सर्वर खलीलोव

13

"एक कॉल स्टैक स्टैक फ्रेम से बना है ..." -  विकिपीडिया

स्टैक फ्रेम एक ऐसी चीज है जिसे आप स्टैक पर रखते हैं। वे डेटा संरचनाएं हैं जिनमें कॉल करने के लिए सबरूटीन्स के बारे में जानकारी होती है।


क्षमा करें, मुझे नहीं पता कि मैं विकी पर कैसे चूक गया। धन्यवाद। क्या मैं सही ढंग से समझता हूं, कि गतिशील भाषाओं में फ्रेम का आकार एक स्थिर मूल्य नहीं है क्योंकि फ़ंक्शन के स्थानीय लोगों को वास्तव में ज्ञात नहीं है?
इकोस्टिया

एक फ्रेम का आकार और प्रकृति मशीन की वास्तुकला पर बहुत अधिक निर्भर करती है। वास्तव में, कॉल स्टैक का बहुत प्रतिमान वास्तुकला-विशिष्ट है। जहां तक ​​मुझे पता है कि यह हमेशा परिवर्तनशील होता है क्योंकि विभिन्न फ़ंक्शन कॉल में भिन्न मात्रा में तर्क डेटा होगा।
टोनी आर

ध्यान दें कि स्टैक फ्रेम का आकार प्रोसेसर द्वारा ज्ञात होना चाहिए जब यह हेरफेर किया जा रहा हो। जब यह हो रहा होता है, तो डेटा का आकार पहले से निर्धारित होता है। डायनेमिक भाषाओं को स्थिर भाषाओं की तरह मशीन कोड में संकलित किया जाता है, लेकिन अक्सर इन-टाइम ही किया जाता है ताकि कंपाइलर डायनेमिज्म को बनाए रख सके और प्रोसेसर "ज्ञात" फ्रेम साइज के साथ काम कर सके। मशीन कोड / असेंबली के साथ उच्च-स्तरीय भाषाओं को भ्रमित न करें, जहां यह सामान वास्तव में हो रहा है।
टोनी आर

ठीक है, लेकिन गतिशील भाषाओं में भी उनके कॉल स्टैक होते हैं, नहीं? मेरा मतलब है, अगर, कहते हैं, पायथन कुछ प्रक्रिया को निष्पादित करना चाहता है, तो इस प्रक्रिया के बारे में डेटा कुछ पायथन इंटरप्रेटर की संरचना के अंदर संग्रहीत है, क्या मैं सही हूं? तो मेरा मतलब है कि कॉल स्टैक न केवल निम्न स्तर पर मौजूद है।
इकोस्टिया

उस विकिपीडिया लेख के एक बिट को पढ़ने के बाद, मैं सही (थोड़ा) खड़ा हूं। स्टैक फ्रेम का आकार संकलन समय पर अज्ञात रह सकता है । लेकिन जब तक प्रोसेसर स्टैक + फ्रेम पॉइंटर्स के साथ काम कर रहा है, तब तक यह जानना होगा कि आकार क्या हैं। आकार परिवर्तनशील हो सकता है लेकिन प्रोसेसर आकार जानता है, वही है जो मैं कहना चाहता था।
टोनी आर

5

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

प्रश्न के लेखक का मतलब है या नहीं, लेकिन संकलक विकल्पों के पहलू से एक स्टैक फ्रेम की अवधारणा एक बहुत महत्वपूर्ण मुद्दा है, यहां अन्य उत्तरों द्वारा कवर नहीं किया गया है।

उदाहरण के लिए, Microsoft Visual Studio 2015 C / C ++ कंपाइलर के पास निम्नलिखित विकल्प हैं stack frames:

  • / ओए (फ़्रेम-पॉइंटर प्रवेश)

GCC निम्नलिखित है:

  • -फोमिट-फ्रेम-पॉइंटर (उन कार्यों के लिए रजिस्टर में फ़्रेम पॉइंटर न रखें, जिन्हें एक की आवश्यकता नहीं है। यह फ्रेम पॉइंटर्स को बचाने, सेट अप और पुनर्स्थापित करने के निर्देशों से बचता है; यह कई कार्यों में एक अतिरिक्त रजिस्टर भी उपलब्ध कराता है; )

Intel C ++ कंपाइलर में निम्नलिखित हैं:

  • -फोमिट-फ्रेम-पॉइंटर (यह निर्धारित करता है कि ईबीपी का उपयोग अनुकूलन में सामान्य प्रयोजन रजिस्टर के रूप में किया जाता है)

जिसका निम्नलिखित उपनाम है:

  • / ओए

डेल्फी में निम्नलिखित कमांड-लाइन विकल्प है:

  • - $ W + (जनरेट स्टैक फ्रेम्स)

उस विशिष्ट अर्थ में, संकलक के दृष्टिकोण से, एक स्टैक फ्रेम रूटीन के लिए केवल प्रविष्टि और निकास कोड है , जो एक एंकर को स्टैक में धकेलता है - जिसका उपयोग डिबगिंग के लिए और अपवाद हैंडलिंग के लिए भी किया जा सकता है। डिबगिंग टूल स्टैक डेटा को स्कैन कर सकते हैं और इन एंकर्स का उपयोग बैकट्रॉस्टिंग के लिए करते हैं, जबकि call sitesस्टैक में पता लगाने के लिए, अर्थात् कार्यों के नामों को प्रदर्शित करने के लिए उन्हें पदानुक्रम कहा जाता है। इंटेल वास्तुकला के लिए, यह है push ebp; mov ebp, espया enterप्रवेश और के लिए mov esp, ebp; pop ebpया leaveबाहर निकलने के लिए।

इसीलिए प्रोग्रामर के लिए यह समझना बहुत जरूरी है कि कंपाइलर ऑप्शन में स्टैक फ्रेम क्या होता है - क्योंकि कंपाइलर इस कोड को जेनरेट करने के लिए कंट्रोल कर सकता है या नहीं।

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

  • फ़ंक्शन एक पत्ती फ़ंक्शन (यानी एक अंत-इकाई जो अन्य कार्यों को कॉल नहीं करता है);
  • कोई प्रयास नहीं है / अंत में या कोशिश / छोड़कर या इसी तरह के निर्माण, यानी कोई अपवाद उपयोग नहीं किया जाता है;
  • स्टैक पर आउटगोइंग मापदंडों के साथ कोई रूटीन नहीं कहा जाता है;
  • फ़ंक्शन का कोई पैरामीटर नहीं है;
  • फ़ंक्शन में कोई इनलाइन असेंबली कोड नहीं है;
  • आदि...

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


-1

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.