जब एक कचरा संग्रहकर्ता ढेर में वस्तुओं को जमा करता है, तो क्या यह स्टैक पर संदर्भ बदलता है?


18

यह एक साधारण प्रश्न की तरह लगता है, लेकिन इस विषय पर बहुत अधिक पढ़ने के बाद, मुझे अभी भी एक निश्चित उत्तर नहीं मिला है (शायद इसलिए कि यह इतना सरल है)।

मेरा सवाल यह है: जब एक कचरा संग्रहकर्ता ढेर में वस्तुओं को जमा करता है, तो स्टैक में उन वस्तुओं का संदर्भ कैसे अपडेट किया जाता है? मैं दो संभावित समाधानों के बारे में सोच सकता हूं:

  1. स्टैक के माध्यम से जाएं (और ढेर में संदर्भ) और ऑब्जेक्ट के नए स्थान पर इंगित करने के लिए संदर्भ को अपडेट करें। स्थानांतरित करने के लिए एक सादृश्य में, यह आपके पते वाले किसी भी व्यक्ति को एक पत्र भेजने और उन्हें अपने नए पते के साथ अपनी पता पुस्तिका को अपडेट करने के लिए कहने जैसा होगा।
  2. किसी प्रकार की तालिका देखें। यह स्थानीय डाकघर के साथ एक अग्रेषण पता छोड़ने जैसा होगा।

क्या कचरा संग्रहकर्ता मुख्य रूप से इन दो तरीकों में से एक का उपयोग करते हैं? कोई और तरीका? दोनों?



@StevenBurnap मुझे सही कर रहा है अगर मैं गलत हूं, लेकिन मेरा मानना ​​है कि आपके द्वारा जुड़े धागे का कोई निश्चित जवाब नहीं है। वे इस सटीक सवाल पर भी अटकलें लगा रहे थे। मुझे गलतफहमी हो सकती है। यदि उन्होंने प्रश्न का उत्तर प्रदान किया है, यदि आप बुरा नहीं
मानेंगे

जिस चीज के बारे में आप बात कर रहे हैं, उसका शब्द "मूविंग कचरा कलेक्टर" है। मैं स्पष्ट रूप से नहीं जानता कि वे कितने सामान्य रूप से उपयोग किए जाते हैं।
रोबोट

जवाबों:


9

मुझे इस पर कोई विशेष विशेषज्ञता नहीं है, लेकिन मेरी समझ यह है कि पहली विधि आमतौर पर उपयोग की जाती है।

कचरे के संग्रहकर्ता को ढेर के किसी भी रास्ते का पता लगाने के लिए ढेर से विश्लेषण करना होता है। एक बार जब वह किसी चीज को स्थानांतरित करने का निर्णय लेता है, तो उसे वैसे भी संदर्भों को सही करना होगा, और उस बिंदु पर ढेर और स्टैक के बीच अंतर करने का कोई कारण नहीं है।

सिद्धांत रूप में लुकअप तालिका दृष्टिकोण काम कर सकता है। हालाँकि, इससे सभी पॉइंटर एक्सेस को 2 कदम उठाने की आवश्यकता होगी। यह सामान्य समय पर एक बड़ा प्रदर्शन प्रभाव होगा। विशेष रूप से कई छोटी वस्तुओं के उपयोग के मामले के लिए। (यह एक ऐसा मामला है जहां अत्याधुनिक जीसी कार्यक्रमों में आमतौर पर संदर्भ गिनती को हराया जाता है।)


3
मुझे लगता है कि मुझे लगता है कि जीसी शायद उन ढेर पर चीजों को स्थानांतरित करने की कोशिश नहीं करते हैं जब तक कि उन्हें नहीं करना है। आज के मल्टी-प्रोसेसर की दुनिया में यह एक सिंक्रनाइज़ेशन दुःस्वप्न होना चाहिए, जब उन्हें ढेर पर किसी चीज के सभी संदर्भों को अपडेट करने की आवश्यकता होती है, जबकि उन संदर्भों का उपयोग करने वाला एक प्रोग्राम चल रहा होता है। लुकअप तालिका इसे सरल बनाएगी, लेकिन मुझे लगता है कि यह मानदंड के बजाय अपवाद है, इसलिए अधिकांश GC को संभवतः कुछ संदर्भों को लॉक करना होगा, मेमोरी को स्थानांतरित करना होगा, फिर संदर्भों को अपडेट करना होगा। +1 दिलचस्प सवाल, +1 अच्छा जवाब।
GlenPeterson

3
@GlenPeterson कई जीसी वास्तव में ढेर पर चीजों को स्थानांतरित नहीं करते हैं, और इस समस्या का सामना नहीं करते हैं। लेकिन परिभाषा के द्वारा एक कॉम्पैक्टिंग जीसी, ऑब्जेक्ट्स को डीफ़्रैग्मेन्ट मेमोरी के चारों ओर ले जाता है।
btilly

@GlenPeterson यह एक अच्छा अवलोकन है कि ढेर पर सामान ले जाना एक बहुत बड़ा तुल्यकालन दर्द है, यह अक्सर अनदेखा होता है हालांकि जीसी संघनन के कारण चलने वाली प्रक्रिया पर भारी लहर प्रभाव पड़ता है। यह एकमात्र सबसे बड़ा कारण है कि लोगों से कहा जाता है कि वे उन सभी चीज़ों को करें जो वस्तुओं को कम से कम समय तक जीवित रखने के लिए कर सकते हैं, बड़े ढेर अपडेट से बचने के लिए जो एक लंबे म्यूटेक्स को धारण करने के लिए संघनन का कारण बनता है। जिस तरह से यह सामान व्यवहार करता है उससे अनभिज्ञता हो सकती है जिसे प्यार से जीसी फ्रीकौट मोड के रूप में संदर्भित किया जाता है।
जिमी हॉफ

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