2011-01-25 8 views
13

मैंने बोहेम जीसी की जांच की। सी/सी ++ के लिए जीसी।बोहेम जीसी सी प्रोग्राम के लिए कैसे काम करता है?

मुझे मार्क-एंड-स्वीप एल्गोरिदम पता है। मैं उत्सुकता में हूं कि यह कैसे पूरे सी स्मृति में केवल पॉइंटर्स उठाता है। सी मेमोरी के बारे में मेरी समझ सिर्फ एक सादा बाइट सरणी है। क्या यह निर्धारित करना संभव है कि स्मृति में एक मान सूचक है या नहीं?

उत्तर

17

बोहेम जीसी एक रूढ़िवादी संग्राहक है, जिसका अर्थ यह है कि यह सब कुछ एक सूचक है मानता है। इसका मतलब है कि यह झूठी सकारात्मक संदर्भ मिल सकता है, जैसे एक पूर्णांक जो संयोग से ढेर में किसी पते का मूल्य होता है। नतीजतन, कुछ ब्लॉक गैर-रूढ़िवादी संग्राहक के मुकाबले स्मृति में लंबे समय तक रह सकते हैं।

यहाँ Boehm's page से वर्णन दिया गया है:

कचरा कलेक्टर एक संशोधित निशान स्वीप एल्गोरिथ्म का उपयोग करता।

  1. तैयारी प्रत्येक वस्तु एक संबद्ध निशान सा है: सैद्धांतिक रूप से यह चार चरणों, जो एक स्मृति आवंटन के भाग के रूप में कभी-कभी प्रदर्शन कर रहे हैं में मोटे तौर पर चल रही है। सभी निशान बिट्स साफ़ करें, यह दर्शाता है कि सभी ऑब्जेक्ट्स संभावित रूप से पहुंच योग्य नहीं हैं।
  2. मार्क चरण सभी ऑब्जेक्ट्स को चिह्नित करता है जो चर से पॉइंटर्स की श्रृंखलाओं के माध्यम से पहुंचा जा सकता है। अक्सर कलेक्टर सूचक ढेर में चर के स्थान के बारे में कोई वास्तविक जानकारी है, इसलिए यह सब स्थिर डेटा क्षेत्रों के ढेर और रजिस्टरों को सशक्त रूप से संकेत युक्त देखता है। कोई भी पैटर्न जो कलेक्टर द्वारा प्रबंधित ऑब्जेक्ट्स के अंदर पते का प्रतिनिधित्व करता है पॉइंटर्स के रूप में देखा जाता है। जब तक क्लाइंट प्रोग्राम ने जानकारी को कलेक्टर के लिए उपलब्ध जानकारी दी है, तो पर मिली किसी भी ढेर ऑब्जेक्ट्स को चर से पहुंचने योग्य समान स्कैन किया गया है।
  3. स्वीप चरण अपर्याप्त के लिए ढेर स्कैन करता है, और इसलिए ऑब्जेक्ट्स को अनमार्क किया जाता है, और उन्हें पुन: उपयोग के लिए उचित निशुल्क सूची में लौटाता है। यह वास्तव में एक अलग चरण नहीं है; गैर वृद्धिशील मोड में यह ऑपरेशन आमतौर पर पर आवंटन के दौरान किया जाता है जो आवंटन के दौरान खाली खाली सूची का पता लगाता है। इस प्रकार स्वीप चरण को एक पृष्ठ को छूने की संभावना नहीं है जो कि कभी भी इसके बाद भी स्पर्श नहीं होता।
  4. अंतिमकरण चरण अंतिमकरण के लिए पंजीकृत अप्राप्य वस्तुओं को कलेक्टर के बाहर अंतिमकरण के लिए नियुक्त किया गया है।

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


संपादित करें: टिप्पणियों में, कुछ चिंताओं को आम तौर पर रूढ़िवादी कलेक्टरों के बारे में बताया गया था।यह सच है कि कलेक्टर को ढेर पॉइंटर्स की तरह दिखने वाले पूर्णांक स्मृति को जारी नहीं कर सकते हैं। यह एक समस्या का बड़ा नहीं है जैसा कि आप सोच सकते हैं। किसी प्रोग्राम में अधिकांश स्केलर पूर्णांक गणना और आकार के लिए उपयोग किए जाते हैं और काफी छोटे होते हैं (इसलिए वे ढेर पॉइंटर्स की तरह नहीं दिखेंगे)। आप अधिकतर बिट्स, स्ट्रिंग्स, फ्लोटिंग पॉइंट डेटा या उस तरह के किसी भी प्रकार वाले सरणी वाले समस्याओं में भाग लेते हैं। बोहेम जीसी आपको GC_MALLOC_ATOMIC के साथ एक ब्लॉक आवंटित करने देता है जो संग्राहक को इंगित करता है कि ब्लॉक में कोई पॉइंटर्स नहीं होगा। यदि आप gc_typed.h में देखते हैं, तो आपको यह निर्दिष्ट करने के तरीके भी मिलेंगे कि ब्लॉक के किन हिस्सों में पॉइंटर्स हो सकते हैं।

यह कहा गया है कि एक रूढ़िवादी संग्राहक की मौलिक सीमा यह है कि यह संग्रह के दौरान स्मृति को सुरक्षित रूप से स्थानांतरित नहीं कर सकता क्योंकि सूचक पुनर्लेखन सुरक्षित नहीं है। इसका मतलब है कि आपको कमजोर विखंडन और बेहतर कैश प्रदर्शन जैसे कॉम्पैक्शन के किसी भी लाभ नहीं मिलेगा।

+1

लॉल, यदि यह सत्य है, तो यह एल्गोरिदम सादा कचरा xD – codymanix

+6

है, यह संभवतः उतना अच्छा है जितना आप कंपाइलर से कुछ सहायता के बिना प्राप्त कर सकते हैं (आपको बता रहे हैं कि पॉइंटर्स कहां हैं)। –

+0

+1। बहुत स्पष्ट जवाब। –

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