मैं एक स्मृति-अवरुद्ध माइक्रोकंट्रोलर के लिए सी में एक ढेर आवंटन एल्गोरिदम लागू करने के लिए देख रहा हूं। मैंने अपनी खोज को 2 विकल्पों तक सीमित कर दिया है, मुझे पता है, हालांकि मैं सुझावों के लिए बहुत खुला हूं, और मैं इसमें किसी के अनुभव से सलाह या टिप्पणियों की तलाश में हूं।फ्रैगमेंटेशन-प्रतिरोधी माइक्रोकंट्रोलर हीप एल्गोरिदम
मेरे आवश्यकताएँ:
स्पीड निश्चित रूप से मायने रखता है, लेकिन एक उच्च माध्यमिक चिंता का विषय है।
-निर्धारण निर्धारण निर्धारण महत्वपूर्ण नहीं है - कोड के किसी भी भाग को निर्धारित करने वाले सबसे बुरे मामले के समय की अपनी आवंटन विधि की आवश्यकता होती है।
- मुख्य आवश्यकता विखंडन प्रतिरक्षा है। डिवाइस एक लुआ स्क्रिप्ट इंजन चला रहा है, जिसमें आवंटन आकारों की एक श्रृंखला की आवश्यकता होगी (32 बाइट ब्लॉक पर भारी)। मुख्य आवश्यकता यह है कि इस डिवाइस के लिए एक अनुपयोगी स्थिति में अपने ढेर को मंथन किए बिना लंबे समय तक चलने के लिए।
इसके अलावा नोट:
के लिए इस संदर्भ में, हम एक कॉर्टेक्स-एम और PIC32 भागों के बारे में, 128K से लेकर स्मृति और 16MB या स्मृति (निचले सिरे पर ध्यान देने के साथ) बात कर रहे हैं।
- मैं कंपाइलर के ढेर का उपयोग नहीं करना चाहता क्योंकि 1) मैं सभी कंपाइलरों में लगातार प्रदर्शन करना चाहता हूं और 2) उनके कार्यान्वयन आमतौर पर बहुत सरल होते हैं और विखंडन के लिए समान या बदतर होते हैं।
- लूडा कोड आधार के कारण दोहरे अप्रत्यक्ष विकल्प बाहर हैं जो मैं मूल रूप से परिवर्तित और पुन: वैध नहीं करना चाहता हूं।
मेरे इष्ट दृष्टिकोण इस प्रकार अब तक:
1) एक द्विआधारी साथी संभाजक है, और (स्मृति के उपयोग दक्षता बलिदान 2 आकार के एक शक्ति से आगे निकलने)। - यह होगा (जैसा कि मैं समझता हूं) प्रत्येक ऑर्डर/बिन के लिए एक बाइनरी पेड़ की आवश्यकता होती है ताकि रीचिंग के लिए तेज़ दोस्त-ब्लॉक लुकअप के लिए मेमोरी एड्रेस द्वारा क्रमबद्ध मुक्त नोड्स को स्टोर किया जा सके।
2) मुक्त ब्लॉकों के लिए दो बाइनरी पेड़ हैं, एक आकार के अनुसार क्रमबद्ध है और एक मेमोरी एड्रेस द्वारा क्रमबद्ध है। (सभी बाइनरी पेड़ लिंक ब्लॉक में ही संग्रहीत होते हैं) - आकार के आधार पर तालिका पर एक लुकअप का उपयोग करके सबसे अच्छा फिट होगा, और फिर उस ब्लॉक को दूसरे पेड़ से पते से हटा दें - डिलीवरीेशन पते के आस-पास के ब्लॉक को देखेगा रीचिंग
-बोथ एल्गोरिदम को आवंटित ब्लॉक की शुरुआत से पहले आवंटन आकार को संग्रहित करने की भी आवश्यकता होगी, और ब्लॉकों को 2 शून्य 4 (या 8 संरेखण के आधार पर) की शक्ति के रूप में बाहर जाना होगा। (जब तक वे मेमोरी एड्रेस द्वारा क्रमबद्ध आवंटन को ट्रैक करने के लिए कहीं और एक बाइनरी पेड़ स्टोर नहीं करते हैं, जिसे मैं एक अच्छा विकल्प नहीं मानता)
-दोनों एल्गोरिदम को ऊंचाई-संतुलित बाइनरी पेड़ कोड की आवश्यकता होती है।
-Algorithm 2 में दो की शक्ति तक गोल करके स्मृति बर्बाद करने की आवश्यकता नहीं है।
- किसी भी मामले में, मेरे पास शायद इस आकार या छोटे ब्लॉक को ऑफ-लोड ब्लॉक करने के लिए नेस्टेड बिट फ़ील्ड द्वारा आवंटित 32-बाइट ब्लॉक का एक निश्चित बैंक होगा, जो बाह्य विखंडन के प्रति प्रतिरोधी होगा।
मेरे सवाल:
-Is वहाँ किसी भी कारण है कि दृष्टिकोण 1 दृष्टिकोण 2 से विखंडन के लिए और अधिक प्रतिरक्षा हो सकता है?
-क्या कोई विकल्प है कि मुझे याद आ रही है कि आवश्यकताओं को फिट कर सकते हैं?
दोस्त को इसे मुक्त करते समय ब्लॉक के संभावित दोस्त को खोजने के लिए बाइनरी पेड़ का उपयोग नहीं करना पड़ता है। आप मूल ब्लॉक के पते से एक दोस्त के पते का काम कर सकते हैं। फिर आप यह देखने के लिए थोड़ा सा जांचते हैं कि वह दोस्त मुफ्त है या इस्तेमाल किया जाता है। आप उस क्षेत्र की शुरुआत में उस बिट को डाल सकते हैं - इसलिए आपको वास्तव में 32 बाइट्स नहीं मिलेंगे, लेकिन शायद 31 प्रयोग योग्य बाइट्स। आप मुफ्त/उपयोग के लिए एक अलग बिटमैप का उपयोग करके इसे बदल सकते हैं। Knuth एक संस्करण का वर्णन करता है जो मुफ्त/प्रयुक्त – mcdowella
याहू के लिए टैग बिट्स का उपयोग करता है, मैंने बस इसके बारे में सोचा। मुझे लगता है कि 2 जीबी ब्लॉक आकार शायद काफी अच्छा है :) जो भी मुझे लगता है कि मुक्त नोड्स के लिए बाइनरी पेड़ से छुटकारा पाने के लिए काम करेगा, वह प्रत्येक बिन/ऑर्डर के फ्री नोड्स को डबल-लिंक्ड सर्कुलर सूची में स्टोर करेगा, और बस दोस्त का उपयोग करें अगले और पिछले नोड्स को चेन करने के लिए पॉइंटर (और एक नोड द्वारा सिर पीआरटी को अग्रिम करें अगर यह हटाया जा रहा नोड को इंगित कर रहा था)। इस तरह एक मुफ्त दोस्त खोजने और निकालने के लिए कोई खोज शामिल नहीं है। इस प्रकार, कोई बाइनरी पेड़ कार्यान्वयन नहीं। विचार? –
क्या आपको वास्तव में आवंटित करने की आवश्यकता है? इन जैसे एम्बेडेड सिस्टम आमतौर पर आवंटित नहीं होते हैं लेकिन निश्चित आकार संरचनाओं का उपयोग करते हैं (कोर्स स्टैक को छोड़कर, जिन्हें आपको सावधान रहना है)। चट्टान ठोस माना जाता है कि कुछ के लिए बहुत अधिक जोखिम जोड़ता है। –