2010-05-19 15 views
5

मैं malloc_stats() का उपयोग malloc से संबंधित आंकड़ों को मुद्रित करने के लिए कर रहा हूं जिसमें मुझे कुछ कार्यक्रमों के लिए "एरिना 0" और कुछ अन्य कार्यक्रमों के लिए "एरिना 0 और एरिना 1" मिल रहा है।मॉलोक फ़ंक्शन में एरिना

ये क्षेत्र क्या प्रतिनिधित्व करते हैं?

उत्तर

2

link text देखें। ऐसा लगता है कि ढेर कई धागे के बीच मेमोरी आवंटन को संभालने के लिए एरिना ("उप-ढेर") का संग्रह है, इस प्रकार विवाद को कम करता है।

+0

लिंक अब और काम नहीं करता है;/ – kokosing

2

कुछ मॉलोक कार्यान्वयन में, एक "क्षेत्र" स्मृति का एक पूल है जिसमें से व्यक्तिगत आवंटन किए जाते हैं। यह निर्धारित करने के लिए एल्गोरिदम का उपयोग किस क्षेत्र में किया जाता है, कार्यान्वयन के बीच अलग होगा, इसलिए हमारे लिए यह समझना संभव नहीं है कि आप एक अंतर क्यों देखते हैं। एक आम कारक आवंटन आकार है।

+0

क्या आप समझा सकते हैं कि जीएनयू सी पुस्तकालय के मॉलोक कार्यान्वयन का उपयोग करते समय क्या होता है? – Vaibhav

5

ढेर कोड glibc घटक के अंदर रहता है, और libc.so.x साझा लाइब्रेरी में पैक किया जाता है। ढेर का वर्तमान कार्यान्वयन एरेना नामक कई स्वतंत्र उप-ढेर का उपयोग करता है। समेकन संरक्षण के लिए प्रत्येक क्षेत्र में अपना स्वयं का म्यूटेक्स होता है। इस प्रकार यदि एक प्रक्रिया के भीतर पर्याप्त क्षेत्र हैं, ढेर, और धागे को वितरित करने के लिए एक तंत्र 'ढेर उनके बीच समान रूप से पहुंचता है, तो म्यूटेक्स के लिए विवाद की संभावना न्यूनतम होनी चाहिए। यह पता चला है कि यह आवंटन के लिए अच्छी तरह से काम करता है। Malloc() में, यह देखने के लिए एक परीक्षण किया जाता है कि वर्तमान थ्रेड के लिए वर्तमान लक्ष्य क्षेत्र के लिए mutex मुक्त है (trylock)। यदि ऐसा है तो क्षेत्र अब लॉक हो गया है और आवंटन राशि बढ़ जाती है। यदि म्यूटेक्स व्यस्त है तो प्रत्येक शेष क्षेत्र बदले में कोशिश की जाती है और अगर म्यूटेक्स व्यस्त नहीं होता है। अगर किसी क्षेत्र को अवरुद्ध किए बिना लॉक किया जा सकता है, तो एक नया नया क्षेत्र बनाया जाता है। परिभाषा के अनुसार यह क्षेत्र पहले ही लॉक नहीं है, इसलिए आवंटन अब अवरुद्ध किए बिना आगे बढ़ सकता है। आखिरकार, धागे द्वारा उपयोग किए जाने वाले क्षेत्र की आईडी थ्रेड स्थानीय भंडारण में बरकरार रखी जाती है, और इसके बाद बाद में पहले क्षेत्र के रूप में उपयोग किया जाता है जब malloc() को उस थ्रेड द्वारा अगली बार बुलाया जाता है। इसलिए malloc() के लिए सभी कॉल अवरुद्ध किए बिना आगे बढ़ेगा।

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