2017-05-27 66 views
7

यहाँ dlmalloc एल्गोरिथ्म का विस्तृत वर्णन है। दो सन्निहित मुक्त मात्रा की तरहdlmalloc coalesce chunks कैसे करता है? <a href="http://g.oswego.edu/dl/html/malloc.html" rel="noreferrer">http://g.oswego.edu/dl/html/malloc.html</a></p> <p>एक dlmalloc हिस्सा कुछ मेटाडेटा, जो हिस्सा में स्थान की मात्रा के बारे में जानकारी शामिल है द्वारा bookended है:

[metadata | X bytes free space | metadata ][metadata | X bytes free space | metadata] 
       Block A          Block B 

उस मामले हम कैसे मुक्त अंतरिक्ष से कई बाइट एक रिपोर्ट को ब्लॉक करना चाहिए अब ब्लॉक ए में ब्लॉक बी सम्मिलित करना चाहते हैं लग सकता है?

मैं, लगता है कि यह 2X + 2 size(metadata) bytes होना चाहिए, क्योंकि अब एकत्रित ब्लॉक लगता है:

[metadata | X bytes free space metadata metadata X bytes free space | metadata] 

लेकिन मैं अगर यह सही है, क्योंकि मैं एक पाठ्यपुस्तक का कहना है कि मेटाडाटा रिपोर्ट करेंगे 2X bytesहै सोच रहा हूँ मेटाडाटा पर लिखने में सक्षम होने के अतिरिक्त अतिरिक्त स्थान सहित के बिना।

उत्तर

1

आप looking at the source द्वारा स्वयं को उत्तर देख सकते हैं। अपने आरेख को सत्यापित करने के लिए line 1876 से शुरू करें। मेटाडेटा केवलहस्ताक्षरित पूर्णांक है, struct malloc_chunk (line 1847 को अलियासिंग द्वारा एक्सेस किया गया है)। फ़ील्ड prev_size पिछले खंड का आकार है, और size इसका आकार है। दोनों में struct malloc_chunk का आकार शामिल है। 32-या 64-बिट एड्रेसिंग के लिए कोड संकलित किया गया है या नहीं, इस पर निर्भर करता है कि यह लगभग सभी मशीनों पर 8 या 16 बाइट होगा।

"सामान्य मामला" कोलेसिंग कोड line 3766 पर शुरू होता है। आप देख सकते हैं कि size वैरिएबल यह ट्रैक करने के लिए उपयोग कर रहा है खंड आकार।

तो - हाँ - कोड ब्लॉकों में /* consolidate backward */ और /* consolidate forward */, चिह्नित जब वह पूर्ववर्ती और सफल होने के हिस्सा के आकार कहते हैं, वह परोक्ष struct malloc_chunk के आकार को जोड़ने के रूप में आप पर शक।

इससे पता चलता है कि आपकी व्याख्या सही है। मेरी उम्मीद यह है कि पाठ्यपुस्तक लेखक को चंक आकार (जिसमें मेटाडाटा शामिल है) और उपयोगकर्ता को आवंटित मेमोरी ब्लॉक के आकार के बीच अंतर के बारे में बेवकूफ हो गया है। संयोग से, mallocline 3397 पर इस अंतर का ख्याल रखता है।

शायद यहां बड़ा सबक यह है कि - जब आप कुछ भी सीखने की कोशिश कर रहे हैं - आपको कभी भी पहले हाथ के स्रोत पर जाने का मौका नहीं छोड़ना चाहिए और अपने लिए सामान निकालना चाहिए।

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