2011-03-04 10 views
5

मुझे संदर्भ काउंटर तकनीक पता है लेकिन आज तक मार्क-स्वीप तकनीक के बारे में कभी नहीं सुना है, जब "प्रोग्रामिंग भाषा की अवधारणाओं" नामक पुस्तक पढ़ते हैं।
पुस्तक के अनुसार:सी ++ में कचरा संग्रह के लिए मार्क-स्वीप (आलसी दृष्टिकोण) के संबंध में?

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

मेरी सीमित समझ से, सी ++ पुस्तकालयों में स्मार्ट पॉइंटर्स संदर्भ गणना तकनीक का उपयोग करते हैं। मुझे आश्चर्य है कि स्मार्ट पॉइंटर्स के लिए इस तरह के कार्यान्वयन का उपयोग कर सी ++ में कोई लाइब्रेरी है? और चूंकि पुस्तक पूरी तरह सैद्धांतिक है, इसलिए मैं कल्पना नहीं कर सका कि कार्यान्वयन कैसे किया जाता है। इस विचार को प्रदर्शित करने के लिए एक उदाहरण बहुत मूल्यवान होगा। कृपया मुझे सुधारें अगर मैं गलत हूं।

धन्यवाद,

उत्तर

1

सी ++ में कचरा संग्रहण का उपयोग करने में एक कठिनाई है, यह पहचानने के लिए कि पॉइंटर क्या है और क्या नहीं है।

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

अब, सी ++ 0x में मानक समिति ने कचरा संग्रह को लागू करने में मदद के लिए मानक एबीआई की शुरुआत की। एन 3225 में आप इसे 20.9.11 पॉइंटर सुरक्षा [util.dynamic.safety] पर पा सकते हैं। यह supposes कि लोग निश्चित रूप से, उनके प्रकार के लिए उन कार्यों को लागू करेगा:

void declare_reachable(void* p); // throw std::bad_alloc 
template <typename T> T* undeclare_reachable(T* p) noexcept; 

void declare_no_pointers(char* p, size_t n) noexcept; 
void undeclare_no_pointers(char* p, size_t n) noexcept; 

pointer_safety get_pointer_safety() noexcept; 

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

अंत में, कचरा संग्रह के लिए कई रणनीतियों रहे हैं: संदर्भ गिनती (साइकिल का पता लगाने एल्गोरिदम के साथ) और मार्क और स्वीप मुख्य हैं विभिन्न प्रणालियों, लेकिन वे विभिन्न स्वादों में आते हैं (पीढ़ी या नहीं, प्रतिलिपि/कॉम्पैक्टिंग या नहीं, ...)।

1

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

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

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

+0

पायथन सी कार्यान्वयन भी कचरा चक्र के लिए refcounted पॉइंटर्स + कचरा संग्रह का उपयोग करता है। – 6502

+0

एक जीसी तैयार करना संभव हो सकता है जो उन कार्यक्रमों के साथ काम करेगा जो कचरा-कलेक्टर के लिए अपने रास्ते से बाहर नहीं जाते हैं, लेकिन किसी भी भाषा में जहां एक सूचक को बाइट्स की श्रृंखला में परिवर्तित किया जा सकता है और मनमाने ढंग से बाइट्स की श्रृंखला को एक सूचक में बदल दिया जा सकता है, कचरा-संग्रह समस्या को हल करने से रोकने की समस्या को हल करने के बराबर होगा। असल में, इंटरैक्टिव प्रोग्राम्स के लिए यह बदतर होगा, क्योंकि पॉइंटर्स वाले बाइट्स कंप्यूटर के बाहर कहीं भी संग्रहीत किए जा सकते हैं। अगर कोई सूचक पुनर्निर्मित किया जा सकता है तो कोई प्रोग्राम नहीं जानता है। – supercat

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