2012-02-28 10 views
5

मेरे पास एक प्रोग्रामिंग प्रोजेक्ट है जिसमें मॉलोक/फ्री फ़ंक्शंस का अत्यधिक गहन उपयोग है। इसमें तीन प्रकार की संरचनाएं हैं जिनमें बहुत अधिक गतिशीलता और बड़ी संख्याएं हैं। इस तरह, मॉलोक और फ्री का भारी उपयोग किया जाता है, जिसे प्रति सेकंड हजारों बार कहा जाता है। एसएलबी के उपयोगकर्ता-अंतरिक्ष संस्करण द्वारा मानक स्मृति आवंटन के प्रतिस्थापन इस समस्या को हल कर सकते हैं? क्या इस तरह के एल्गोरिदम का कोई कार्यान्वयन है?एसएलबी जैसी प्रौद्योगिकियों के साथ सी प्रोग्राम का अनुकूलन

पीएस

  1. सिस्टम लिनक्स उन्मुख है।
  2. संरचनाओं का आकार 100 बाइट से कम है।
  3. अंत में, मैं तैयार कार्यान्वयन का उपयोग करना पसंद करूंगा क्योंकि स्मृति प्रबंधन वास्तव में कठिन विषय है।
+0

मेरा पता लगाएं: https://github.com/bbu/Userland-slab-allocator :-) –

+0

@BlagovestBuyukliev: धन्यवाद, अगर मैं अपना स्वयं का एसएलबी लागू करूंगा तो यह बहुत उपयोगी होगा। कुछ विचार घुसपैठ कर रहे हैं, और मैं स्मृति प्रबंधन में इतना मजबूत नहीं हूं इसलिए यह सहायक होगा। स्मृति प्रबंधन को पहचानने के लिए –

+0

+1 कठिन है और मौजूदा कार्यान्वयन के लिए पूछ रहा है। –

उत्तर

8

यदि आपके पास केवल तीन अलग हैं तो आप पूल आवंटक (या तो कस्टम बनाया या boost::pool जैसे कुछ) के उपयोग से बहुत लाभ प्राप्त करेंगे। Doug Lea's binning based malloc पूल आवंटक (इसका उपयोग ग्लिब में उपयोग किया जाता है) के लिए बहुत अच्छा आधार के रूप में कार्य करेगा।

हालांकि, आपको अन्य कारकों को ध्यान में रखना होगा, जैसे कि बहु-थ्रेडिंग और मेमोरी पुन: उपयोग (वस्तुओं को आवंटित किया जाएगा, तब फिर से आवंटित किया जाएगा या फिर आवंटित किया जाएगा?)। इस कोण से आप tcmalloc में चेक कर सकते हैं (जिसे चरम आवंटन, मात्रा और स्मृति उपयोग दोनों के लिए डिज़ाइन किया गया है), nedmalloc या होर्ड। ये सभी आवंटक खुले स्रोत हैं और इस प्रकार आपके द्वारा आवंटित वस्तुओं के आकार को सूट करने के लिए आसानी से बदला जा सकता है।

+0

प्रश्न 'सी' के रूप में चिह्नित किया गया है। संभवतः बढ़ावा उपलब्ध नहीं है। (ओह, आपने कहा 'बूस्ट :: पूल', क्षमा करें।) बीटीडब्ल्यू, महान लिंक। – Kaganar

+0

@ कगनार: यही कारण है कि मैंने 'पसंद' कहा, दुर्भाग्यवश मुझे 'बूस्ट :: पूल' के अलावा मेरे सिर के शीर्ष से किसी भी पूल आवंटकों को नहीं पता। लेकिन मैं इसे संशोधित करूंगा। – Necrolis

+0

@ नेक्रोलिस: धन्यवाद, मुझे अपने स्वयं के कार्यान्वयन के बारे में सोचा गया है, जो मेरे लक्ष्य के लिए अनुकूलित है, स्मृति पुन: उपयोग और बड़े अनाज आवंटन के साथ। लेकिन ऐसा लगता है कि साइकिल की पुनर्वितरण। –

1

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

जब विंडोज़ में प्रोग्रामिंग मुझे लगता है कि कॉलिंग मॉलोक/फ्री प्रदर्शन के लिए मौत की तरह है - लगभग किसी भी इन-एप मेमोरी आवंटन जो बैचिंग द्वारा मेमोरी आवंटन को कम करता है, आपको आवंटित/मुक्त करने पर प्रोसेसर समय के gobs को बचाएगा, इसलिए जब तक आप डिफ़ॉल्ट आवंटन नहीं कह रहे हैं, तब तक यह आपके लिए उपयोग करने के लिए इतना महत्वपूर्ण नहीं हो सकता है।

कहा जा रहा है, यहाँ कुछ साधारण बहु सूत्रण अनुभवहीन विचारों है:

This सख्ती से एक स्लैब प्रबंधक नहीं है, लेकिन यह एक अच्छा संतुलन हासिल करने लगता है और आमतौर पर इस्तेमाल किया जाता है।

मुझे व्यक्तिगत रूप से लगता है कि मैं अक्सर एक ही आकार के मेमोरी ब्लॉक के लिए एक साधारण सरल-से-लागू स्मृति-पुन: उपयोग प्रबंधक का उपयोग करके समाप्त होता हूं - यह एक निश्चित आकार की अप्रयुक्त स्मृति की एक लिंक की गई सूची बनाए रखता है और एक नया ब्लॉक आवंटित करता है मेमोरी जब इसकी जरूरत है। चाल यहां अप्रयुक्त स्मृति ब्लॉक में लिंक्ड सूची के लिए पॉइंटर्स को स्टोर करना है - इस तरह चार बाइट्स का एक बहुत छोटा ओवरहेड है। पूरी प्रक्रिया ओ (1) है जब भी यह स्मृति का पुन: उपयोग कर रहा है। जब इसे स्मृति आवंटित करना होता है तो यह एक स्लैब आवंटक (जो स्वयं छोटा होता है) कहते हैं।

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

इन दृष्टिकोणों को चेन करने में समस्या? आपका एप्लिकेशन कभी भी किसी भी मेमोरी को मुक्त नहीं करेगा, लेकिन प्रदर्शन-महत्वपूर्ण अनुप्रयोग अक्सर एक-शॉट प्रसंस्करण अनुप्रयोग होते हैं या एक ही आकार की कई वस्तुएं बनाते हैं और फिर उनका उपयोग बंद कर देते हैं।

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

1

मैं हाल ही में मेरे अपने यूज़रस्पेस स्लैब संभाजक लागू किया है, और यह बहुत अधिक कुशल साबित हुई (speedwise और स्मृति वार) malloc/free से निश्चित-आकार आवंटन की एक बड़ी राशि के लिए। आप इसे here पा सकते हैं।

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

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