2010-07-09 14 views
5

मैं Xara Xtreme, ओपन सोर्स एसवीजी ग्राफिक्स एप्लिकेशन बनाने के लिए किए गए कुछ निर्णयों से गुज़र रहा था। उनका स्मृति प्रबंधन निर्णय मेरे लिए काफी दिलचस्प था क्योंकि मैंने इसे निष्पक्ष रूप से स्वीकार किया था कि ऑब्जेक्ट उन्मुख आवेदन लिखने के तरीके के रूप में मांग पर गतिशील आवंटन।किस स्थिति में स्थिर आवंटन किराया गतिशील आवंटन से बेहतर है?

प्रलेखन से स्पष्टीकरण

है कैसे पृथ्वी पर स्थिर कर सकते हैं आवंटन कुशल हो सकता है?

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

हम तथ्य यह है कि जब भी हम इस तरह से स्मृति को आबंटित है, हम के बारे में कोई स्मृति स्थानांतरित करने के लिए नहीं है से काफी लाभ। यह आर्टवर्क्स में एक बाधा साबित हुआ जो में समवर्ती रूप से उपयोग किए जाने वाले कई छोटे आवंटन थे। more

संक्षेप में, छोटी वस्तुओं और स्मृति कदम को रोकने के लिए की जरूरत के बहुत सारे की उपस्थिति स्थिर आवंटन को चुनने के लिए दिए गए कारण हैं। मुझे उल्लिखित कारणों के बारे में स्पष्ट समझ नहीं है।

हालांकि स्थिर आवंटन के बारे में यह वार्ता, कोड पर कर्सर देखने से मैं जो देखता हूं वह यह है कि आवेदन शुरू होने पर स्मृति की एक ब्लॉक गतिशील रूप से आवंटित की जाती है और आवेदन समाप्त होने तक जीवित रखा जाता है, लगभग स्थिर आवंटन को अनुकरण करता है।

क्या आप परिस्थितियों में बता सकते हैं कि स्थैतिक आवंटन किराया ऑन-डिमांड गतिशील आवंटन से बेहतर है ताकि इसे गंभीर अनुप्रयोगों में आवंटन का मुख्य माध्यम माना जा सके?

उत्तर

2

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

+0

धन्यवाद। अब मैं देखता हूं कि ऑब्जेक्ट पूल पैटर्न Xara Xtreme में उपयोग की जाने वाली तकनीक है। http://en.wikipedia.org/wiki/Object_pool_pattern – rpattabi

1

संक्षेप में, वास्तव में ऐसी कोई चीज नहीं है जो आपके कार्यों के लिए आवंटित स्थान के अलावा स्थिर आवंटन और अन्य पढ़ने-योग्य प्रकार की स्मृति के समान नहीं है। (यदि आप रुचि रखते हैं तो केवल एक इकट्ठा करें "gcc -S" और सभी मेमोरी ब्लॉक देखें।) यदि आप ऑब्जेक्ट्स बना रहे हैं और तोड़ रहे हैं, तो आप गतिशील रूप से आवंटित कर रहे हैं। ऐसा कहा जा रहा है कि आवंटन तंत्र को कड़ाई से नियंत्रित करने से रोकने के लिए कुछ भी नहीं है।

यह है कि mallinfo() और mallopt() जैसे कार्यों को नियंत्रित करने के लिए malloc() अपने जादू को कैसे नियंत्रित करता है। हालांकि, यह आपके लिए भी पर्याप्त नहीं हो सकता है। यदि आप जानते हैं कि आपके सभी भाग एक ही आकार के होने जा रहे हैं, तो आप अधिक कुशलतापूर्वक आवंटित और निर्वासित कर सकते हैं। और यदि आपको पता है कि आपके पास 3 आकार की सामग्री है, तो आप प्रत्येक के अपने आवंटक के साथ स्मृति के 3 क्षेत्र रख सकते हैं।

इसके ऊपर, आपके पास रनटाइम की स्थिति है जहां प्रक्रिया में पर्याप्त जगह नहीं है और ओएस से अधिक पूछने की आवश्यकता है - जिसमें एक सिस्टम कॉल शामिल है जो केवल सरणी अनुक्रमणिका को बढ़ाने से अधिक महंगा है। यूनिक्स पर, यह आमतौर पर ब्रैक() या sbrk() या पसंद है। और वह मूल्यवान समय ले सकता है।

एक और, दुर्लभ स्थिति, यदि आपको चीजों को गुणा करने की आवश्यकता है तो होगा। 3 धागे की तरह जानकारी साझा करने की आवश्यकता होती है और केवल तभी जब सभी 3 रिलीज इसे मुक्त कर देते हैं। यह कुछ गैर मानक है और आमतौर पर ठेठ मॉलोपेट() या यहां तक ​​कि पठ्रेड-विशिष्ट स्मृति या म्यूटेक्स/सेमफोर-लॉक किए गए हिस्सों द्वारा कवर नहीं किया जाता है।

तो यदि आपके पास उच्च गति अनुकूलन समस्याएं हैं या आप एक एम्बेडेड सिस्टम पर चल रहे हैं, जहां आपको उपलब्ध स्मृति से बाहर निकलने की आवश्यकता है, तो "स्थिर आवंटन", या कम से कम आवंटन तंत्र को नियंत्रित करना, हो सकता है जाने का रास्ता।

+0

विवरण के लिए धन्यवाद। – rpattabi

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