sbrk
सिस्टम कॉल डेटा सेगमेंट की "सीमा" को स्थानांतरित करता है। इसका अर्थ यह है कि यह उस क्षेत्र की सीमा को स्थानांतरित करता है जिसमें एक प्रोग्राम डेटा को पढ़/लिख सकता है (इसे बढ़ने या घटाने देना, हालांकि AFAIK no malloc
वास्तव में उस विधि के साथ कर्नेल को मेमोरी सेगमेंट देता है)। इसके अलावा, mmap
भी है जो फ़ाइलों को स्मृति में मैप करने के लिए उपयोग किया जाता है लेकिन स्मृति को आवंटित करने के लिए भी उपयोग किया जाता है (यदि आपको साझा मेमोरी आवंटित करने की आवश्यकता है, तो mmap
यह है कि आप इसे कैसे करते हैं)।
तो आपके पास कर्नेल से अधिक मेमोरी प्राप्त करने के दो तरीके हैं: sbrk
और mmap
। कर्नेल से मिली मेमोरी को व्यवस्थित करने के तरीके पर विभिन्न रणनीतियां हैं।
एक बेवकूफ तरीका इसे ज़ोन में विभाजित करना है, जिसे अक्सर "बाल्टी" कहा जाता है, जो कुछ संरचना आकारों के लिए समर्पित होते हैं। उदाहरण के लिए, malloc
कार्यान्वयन 16, 64, 256 और 1024 बाइट संरचनाओं के लिए बाल्टी बना सकता है। यदि आप किसी दिए गए आकार की स्मृति देने के लिए malloc
पूछते हैं तो यह उस नंबर को अगले बाल्टी आकार तक ले जाता है और फिर आपको उस बाल्टी से एक तत्व देता है। यदि आपको कर्नेल के साथ आवंटित करने के लिए mmap
का उपयोग करने के लिए एक बड़े क्षेत्र की आवश्यकता है। यदि एक निश्चित आकार की बाल्टी खाली है malloc
नई बाल्टी के लिए अधिक जगह पाने के लिए sbrk
का उपयोग कर सकती है।
विभिन्न malloc
डिज़ाइन हैं और malloc
को लागू करने का कोई भी सही तरीका नहीं है क्योंकि आपको गति, ओवरहेड और विखंडन/अंतरिक्ष प्रभावशीलता से परहेज करने की आवश्यकता है। उदाहरण के लिए, यदि बाल्टी तत्वों से बाहर निकलती है तो कार्यान्वयन को एक बड़ी बाल्टी से तत्व मिल सकता है, इसे विभाजित कर दें और इसे तत्वों से बाहर निकलने वाली बाल्टी में जोड़ें। यह काफी जगह कुशल होगा लेकिन हर डिजाइन के साथ संभव नहीं होगा। यदि आपको sbrk
/mmap
के माध्यम से बस एक और बाल्टी मिलती है जो कि तेज और आसान हो सकती है, लेकिन अंतरिक्ष कुशल नहीं है। साथ ही, डिज़ाइन को निश्चित रूप से ध्यान में रखना चाहिए कि "मुक्त" को किसी भी तरह malloc
पर स्थान उपलब्ध कराने की आवश्यकता है। आप इसका पुन: उपयोग किए बिना स्मृति को हाथ से नहीं निकालते हैं।
यदि आप रुचि रखते हैं, तो OpenSER/Kamailio SIP प्रॉक्सी में दो malloc
कार्यान्वयन हैं (उन्हें स्वयं की आवश्यकता है क्योंकि वे साझा स्मृति का भारी उपयोग करते हैं और सिस्टम malloc
साझा स्मृति का समर्थन नहीं करता है)। देखें: https://github.com/OpenSIPS/opensips/tree/master/mem
फिर आप GNU libc malloc
implementation पर भी देख सकते हैं, लेकिन यह बहुत जटिल है, आईआईआरसी।
स्रोत, बोडा साइडो का उपयोग करें। http://ftp.gnu.org/gnu/glibc/ – msw
मैं इस लिंक को कुछ हद तक आपके प्रश्न के उत्तर लगता है http://stackoverflow.com/questions/1119134/how-malloc-and-free-work – Rishabh