5

मैं वर्तमान में विंडोज के तहत malloc() कार्यान्वयन में देख रहा हूं। लेकिन मेरे शोध में मैंने उन चीजों पर ठोकर खाई है जो मुझे परेशान करते हैं:विंडोज मेमोरी आवंटन प्रश्न

सबसे पहले, मुझे पता है कि एपीआई स्तर पर, विंडोज़ ज्यादातर HeapAlloc() और VirtualAlloc() कॉल को आवंटित करने के लिए कॉल का उपयोग करती है। मैं here से इकट्ठा करता हूं कि माइक्रोसॉफ्ट कार्यान्वयन malloc() (जिसे सीआरटी - सी रनटाइम में शामिल किया गया है) मूल रूप से ब्लॉक> 480 बाइट्स के लिए HeapAlloc() पर कॉल करता है और अन्यथा विखंडन को रोकने के लिए छोटे आवंटन के लिए VirtualAlloc() के साथ आवंटित एक विशेष क्षेत्र का प्रबंधन करता है।

ठीक है कि यह सब अच्छा और अच्छा है। लेकिन फिर malloc() के अन्य कार्यान्वयन हैं, उदाहरण के लिए nedmalloc, जो माइक्रोसॉफ्ट के malloc से 125% तेज होने का दावा करता है।

  1. क्यों नहीं हम सिर्फ छोटे ब्लॉकों के लिए HeapAlloc() कॉल कर सकते हैं:

    सभी यह मेरे लिए कुछ चीजें आश्चर्य बनाता है? विखंडन के संबंध में खराब प्रदर्शन करता है (उदाहरण के लिए "सर्वश्रेष्ठ-फिट" के बजाय "प्रथम-फिट" करके)?

    • वास्तव में, किसी भी तरह से पता है कि विभिन्न एपीआई आवंटन कॉल की हुड के नीचे जा रहा है है? यह काफी उपयोगी होगा।
  2. क्या है माइक्रोसॉफ्ट के malloc से nedmalloc तो बहुत तेजी से?

  3. ऊपर से, मैं धारणा है कि HeapAlloc()/VirtualAlloc() इतनी धीमी गति से है कि यह बहुत malloc() के लिए तेजी से होता है एक समय में केवल एक बार उन्हें फोन करने के लिए और उसके बाद आबंटित स्मृति में ही प्रबंधन करने के लिए कर रहे हैं मिला है। क्या यह धारणा सच है? या malloc() "रैपर" सिर्फ विखंडन के कारण आवश्यक है? कोई ऐसा सोचता है कि इस तरह की प्रणाली कॉल जल्दी होगी - या कम से कम कुछ विचार उन्हें कुशल बनाने के लिए रखे गए होंगे।

    • यदि यह सच है, तो ऐसा क्यों है?
  4. औसत पर, कितने स्मृति (परिमाण के एक आदेश) पढ़ता है/लिखने एक ठेठ malloc कॉल (शायद पहले से ही आवंटित खंडों की संख्या के एक समारोह) द्वारा किया जाता है? मैं सहजता से कहता हूं कि यह औसत कार्यक्रम के लिए दसियों में है, क्या मैं सही हूँ?

+0

एक तरफ, "dlmalloc" पर पढ़ना malloc रणनीतियों के बारे में बहुत जानकारीपूर्ण है – Will

उत्तर

5
  1. कॉलिंग HeapAlloc नहीं लग पार मंच। जब चाहें एमएस उनके कार्यान्वयन को बदलने के लिए स्वतंत्र है; दूर रहने की सलाह देते हैं। :)
  2. यह शायद मेमोरी पूल का अधिक प्रभावी ढंग से उपयोग कर रहा है, जैसे लोकी लाइब्रेरी अपने "छोटे ऑब्जेक्ट आवंटक"
  3. स्वैप आवंटन, जो प्रकृति द्वारा सामान्य उद्देश्य हैं, किसी भी कार्यान्वयन के माध्यम से हमेशा धीमे होते हैं। जितना अधिक "विशेष" आवंटक, तेज़ी से होगा। यह हमें # 2 पर इंगित करता है, जो मेमोरी पूल से संबंधित है (और आवंटन आकार जो आपके आवेदन के लिए विशिष्ट हैं)।
  4. पता नहीं।
+0

माइक्रोसॉफ्ट सबकुछ बेहतर बनाने के लिए चीजों को बदलने के लिए भी स्वतंत्र है। कम Fragmentation ढेर में संक्रमण देखें। – MSN

+0

1. मुझे यह भी उम्मीद नहीं थी, क्योंकि मैं विंडोज़ में मॉलोक कार्यान्वयन लक्ष्य का प्रयास कर रहा हूं। लेकिन सवाल बनी हुई है: क्या यह अप्रभावी है, विखंडन-वार? 2. इसका मतलब यह है कि यह पॉइंटर्स को अधिक कुशलता से मुक्त स्थान पर प्रबंधित करता है, ताकि स्मृति में उचित ब्लॉक आवंटित करना तेज हो? क्या आप जानते हैं कि मैं मेमोरी पूल के बारे में कहां पढ़ सकता हूं? जैसा कि उपयोगकर्ता द्वारा सुझाया गया है ऊपर दिया गया है, मैं dlmalloc पर शुरू हुआ (मैंने पहले इसे स्किम किया था, लेकिन यह यूनिक्स-उन्मुख ध्वनि था, जिसमें यूनिक्स कॉल को अनुकरण करने के रूप में इसकी विंडोज कार्यक्षमता का वर्णन किया गया था)। – Norswap

1

ऊपर से, मैं धारणा है कि HeapAlloc()/VirtualAlloc() इतनी धीमी गति से है कि यह बहुत तेजी से malloc के लिए है() उन्हें एक समय में केवल एक बार फोन करने के लिए और उसके बाद आवंटित प्रबंधन करने के लिए स्मृति खुद क्या यह धारणा सच है?

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

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