2010-07-28 14 views
12

मैं सी ++ में मेमोरी को प्रबंधित करने में मदद करने वाली नई सुविधाओं को जोड़ने के लिए अपनी गतिशील मेमोरी प्रबंधन प्रणाली को कार्यान्वित करना चाहता हूं।मॉलोक और निःशुल्क कैसे कार्यान्वित किया जाता है?

मैं विंडोज (एक्सपी) और लिनक्स (उबंटू) का उपयोग करता हूं। 'मॉलोक' और 'फ्री' जैसे कार्यों को लागू करने के लिए क्या आवश्यक है? मुझे लगता है कि मुझे निम्नतम स्तर की सिस्टम कॉल का उपयोग करना है।

विंडोज के लिए, मुझे फ़ंक्शन मिल गए हैं: GetProcessHeap, HeapAlloc, HeapCreate, HeapDestroy और HeapFree।

लिनक्स के लिए, मुझे ढेर प्रबंधन के लिए कोई सिस्टम कॉल नहीं मिला है। लिनक्स पर, मॉलोक और फ्री सिस्टम कॉल हैं, है ना?

धन्यवाद

संपादित करें:
सी ++ कचरा कलेक्टर प्रदान नहीं करता है और कचरा कलेक्टर धीमी है। कुछ आवंटन मुफ्त में आसान होते हैं, लेकिन ऐसे आवंटन होते हैं जिन्हें कचरा कलेक्टर की आवश्यकता होती है।

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

+1

आपको बूस्ट के पूल आवंटकों को देखना चाहिए: http://www.boost.org/doc/libs/1_43_0/libs/pool/doc/index.html –

+2

क्या आप सुनिश्चित हैं कि हेपअलोक एक सिस्टम (कर्नेल) कॉल है? इन्हें उपयोगकर्ता-पक्ष को अच्छी तरह से कार्यान्वित किया जा सकता है और प्रक्रिया को और अधिक स्मृति की आवश्यकता होने पर कुछ छिपे हुए निजी कर्नेल-साइड फ़ंक्शन को ट्रिगर कर सकते हैं। – doron

+0

स्क्वाल - यह शब्द से होमवर्क प्रश्न की तरह अजीब लगता है। हाँ? नहीं? –

उत्तर

14

लिनक्स, मॉलोक और फ्री पर सिस्टम कॉल नहीं हैं। malloc/free को brk सिस्टम कॉल का उपयोग करके डेटा सेगमेंट के साथ-साथ mmap के साथ अज्ञात मेमोरी प्राप्त करने के साथ-साथ उन क्षेत्रों के भीतर स्मृति प्रबंधित करने के द्वारा कर्नेल से स्मृति को प्राप्त करने और घटाने से कर्नेल से स्मृति प्राप्त होती है। कुछ बुनियादी सूचनाएं here

+0

असल में, 'sbrk' नहीं है एक सिस्टम कॉल बल्कि एक पुस्तकालय समारोह। – Borealid

3

brk प्रणाली malloc और free लागू करने के लिए लिनक्स पर इस्तेमाल किया कॉल है। जानकारी के लिए मैन पेज आज़माएं।

आपके पास पहले से ही विंडोज़ सामान है।

अन्य उत्तरों को यहां देखकर, मैं यह ध्यान रखना चाहूंगा कि आप शायद पहिया को फिर से शुरू कर रहे हैं; वहां पहले से ही बहुत अच्छे malloc कार्यान्वयन हैं। लेकिन प्रोग्रामिंग malloc एक अच्छा विचार अभ्यास है - एक अच्छा होमवर्क असाइनमेंट (मूल रूप से सीएमयू कोड) को लागू करने के लिए here देखें। उनका खोल आपको लिनक्स ओएस की तुलना में थोड़ा अधिक देता है, हालांकि :-)।

4

यदि आप बस सिस्टम कॉल को लपेट रहे हैं तो संभवतः आप मानक मॉलोक का उपयोग करने पर कुछ भी हासिल नहीं कर रहे हैं - जो कुछ भी वे कर रहे हैं।

कार्यक्रम की शुरुआत में स्मृति के एक ब्लॉक को मॉलोक (या हीपअलोक() आदि) के लिए यह अधिक आम है और इस में आवंटन का प्रबंधन करें, यदि आप जानते हैं कि आप बनाने जा रहे हैं तो यह अधिक कुशल हो सकता है/नियमित रूप से स्मृति के बहुत से छोटे ब्लॉक को छोड़कर।

4

* nix, malloc() सी पुस्तकालय स्तर पर लागू किया गया है। यह डेटा सेगमेंट को बढ़ाने/घटाने के लिए ब्रैक()/sbrk() का उपयोग करता है, और मेमोरी मैपिंग का अनुरोध/रिलीज करने के लिए mmap/munmap का उपयोग करता है। Glibc और uClibc में उपयोग किए जाने वाले मॉलोक कार्यान्वयन के विवरण के लिए this page देखें।

+0

यह उपयोगी है। धन्यवाद। – Squall

0

कचरा कलेक्टर धीमी

है यह एक पूरी तरह अर्थहीन बयान है। कई व्यावहारिक परिस्थितियों में, कार्यक्रम कचरा कलेक्टर का उपयोग करके विशेष रूप से बहु-थ्रेडेड परिदृश्यों में एक महत्वपूर्ण प्रदर्शन बढ़ावा प्राप्त कर सकते हैं। कई अन्य परिस्थितियों में, कचरा कलेक्टरों को प्रदर्शन दंड लगाना पड़ता है।

+0

कचरा कलेक्टर के बारे में * आम तौर पर * धीमा है – Chani

0

पॉइंटर्स के लिए http://www.dent.med.uni-muenchen.de/~wmglo/malloc-slides.html आज़माएं।

यह एक अलग प्रदर्शन तुलना है, पॉइंटर्स के साथ आठ अलग-अलग मॉलोक/मुफ्त कार्यान्वयन। एक अच्छा प्रारंभिक बिंदु, क्योंकि कुछ अच्छे संदर्भ आंकड़े आपको यह निर्धारित करने में मदद करेंगे कि आपने उपलब्ध कार्यान्वयन पर सुधार किया है या नहीं।

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