(इस सारांश में कोई जांचें समझाई नहीं गई हैं और कुछ मामलों को संक्षिप्तता के लिए छोड़ दिया गया है)
__libc_malloc tcache से एक चंक प्राप्त करने की कोशिश करता है, यदि नहीं तो यह _int_malloc को कॉल करता है
_int_malloc :
यदि कोई एरेना नहीं है तो इसे उत्पन्न करने की कोशिश करता है
यदि सही आकार का कोई फास्ट बिन चंक है, तो इसका उपयोग करें
अन्य फास्ट चंक्स के साथ tcache भरें
यदि सही आकार का कोई स्मॉल बिन चंक है, तो इसका उपयोग करें
उस आकार के अन्य चंक्स के साथ tcache भरें
यदि अनुरोधित आकार स्मॉल बिन के लिए नहीं है, तो फास्ट बिन को अनसॉर्टेड बिन में समेकित करें
अनसॉर्टेड बिन की जांच करें, पर्याप्त स्थान वाले पहले चंक का उपयोग करें
यदि पाया गया चंक बड़ा है, तो इसे विभाजित करें ताकि एक भाग लौटाया जा सके और शेष को अनसॉर्टेड बिन में वापस जोड़ें
यदि एक चंक अनुरोधित आकार के समान है, तो इसे tcache भरने के लिए उपयोग करें बजाय इसके कि इसे लौटाएं (जब तक tcache भरा न हो जाए, फिर अगला लौटाएं)
छोटे आकार के प्रत्येक चंक की जांच के लिए, इसे इसके संबंधित स्मॉल या बड़े बिन में रखें
अनुरोधित आकार के इंडेक्स में बड़े बिन की जांच करें
अनुरोधित आकार से बड़े पहले चंक से देखना शुरू करें, यदि कोई पाया जाता है तो इसे लौटाएं और शेष को स्मॉल बिन में जोड़ें
अंत तक अगले इंडेक्स से बड़े बिन की जांच करें
अगले बड़े इंडेक्स से किसी चंक की जांच करें, पहले पाए गए चंक को विभाजित करें ताकि इसे अनुरोधित आकार के लिए उपयोग किया जा सके और शेष को अनसॉर्टेड बिन में जोड़ें
यदि पिछले बिन में कुछ नहीं मिला, तो शीर्ष चंक से एक चंक प्राप्त करें
यदि शीर्ष चंक पर्याप्त बड़ा नहीं था, तो इसे sysmalloc के साथ बढ़ाएं
__libc_malloc
malloc फ़ंक्शन वास्तव में __libc_malloc को कॉल करता है। यह फ़ंक्शन tcache की जांच करेगा कि क्या इच्छित आकार का कोई उपलब्ध चंक है। यदि है तो इसका उपयोग करेगा और यदि नहीं है तो यह जांचेगा कि क्या यह एकल थ्रेड है और उस मामले में यह मुख्य एरेना में _int_malloc को कॉल करेगा, और यदि नहीं है तो यह थ्रेड के एरेना में _int_malloc को कॉल करेगा।
__libc_malloc code
```c // From https://github.com/bminor/glibc/blob/master/malloc/malloc.c
victim = _int_malloc (ar_ptr, bytes); /* Retry with another arena only if we were able to find a usable arena before. */ if (!victim && ar_ptr != NULL) { LIBC_PROBE (memory_malloc_retry, 1, bytes); ar_ptr = arena_get_retry (ar_ptr, bytes); victim = _int_malloc (ar_ptr, bytes); }
if (ar_ptr != NULL) __libc_lock_unlock (ar_ptr->mutex);
</details>
ध्यान दें कि यह हमेशा लौटाए गए पॉइंटर को `tag_new_usable` के साथ टैग करेगा, कोड से:
```c
void *tag_new_usable (void *ptr)
Allocate a new random color and use it to color the user region of
a chunk; this may include data from the subsequent chunk's header
if tagging is sufficiently fine grained. Returns PTR suitably
recolored for accessing the memory there.
_int_malloc
यह वह फ़ंक्शन है जो अन्य बिन और टॉप चंक का उपयोग करके मेमोरी आवंटित करता है।
प्रारंभ
यह कुछ वेरिएबल्स को परिभाषित करना और अनुरोधित मेमोरी स्थान के लिए वास्तविक आकार प्राप्त करना शुरू करता है:
Fast Bin
यदि आवश्यक आकार Fast Bins आकारों के भीतर है, तो तेज बिन से एक चंक का उपयोग करने का प्रयास करें। मूल रूप से, आकार के आधार पर, यह तेज बिन अनुक्रमांक खोजेगा जहाँ मान्य चंक्स स्थित होने चाहिए, और यदि कोई हो, तो यह उनमें से एक लौटाएगा।
इसके अलावा, यदि tcache सक्षम है, तो यह उस आकार के tcache बिन को तेज बिन से भरेगा।
इन क्रियाओं को करते समय, कुछ सुरक्षा जांच यहाँ निष्पादित की जाती हैं:
यदि आगे का चंक गलत संरेखित है: malloc(): unaligned fastbin chunk detected
यदि लौटाया गया चंक का आकार सही नहीं है क्योंकि यह तेज बिन में इसके अनुक्रमांक के कारण है: malloc(): memory corruption (fast)
यदि tcache को भरने के लिए उपयोग किया गया कोई चंक गलत संरेखित है: malloc(): unaligned fastbin chunk detected 3
malloc_consolidate
यदि यह एक छोटा टुकड़ा नहीं था, तो यह एक बड़ा टुकड़ा है, और इस मामले में malloc_consolidate को मेमोरी फ्रैग्मेंटेशन से बचने के लिए कॉल किया जाता है।
अनसॉर्टेड बिन
यह संभावित मान्य चंक का उपयोग करने के लिए अनसॉर्टेड बिन की जांच करने का समय है।
प्रारंभ
यह एक बड़े लूप के साथ शुरू होता है जो bk दिशा में अनसॉर्टेड बिन को पार करेगा जब तक कि यह अंत (एरेना संरचना) तक नहीं पहुँचता है while ((victim = unsorted_chunks (av)->bk) != unsorted_chunks (av))
इसके अलावा, जब भी एक नया चंक विचारित किया जाता है, कुछ सुरक्षा जांच की जाती हैं:
यदि चंक का आकार अजीब है (बहुत छोटा या बहुत बड़ा): malloc(): invalid size (unsorted)
यदि अगले चंक का आकार अजीब है (बहुत छोटा या बहुत बड़ा): malloc(): invalid next size (unsorted)
यदि अगले चंक द्वारा दर्शाया गया पिछले आकार चंक के आकार से भिन्न है: malloc(): mismatching next->prev_size (unsorted)
यदि victim->bck->fd == victim या victim->fd == av (एरेना) नहीं है: malloc(): unsorted double linked list corrupted
चूंकि हम हमेशा अंतिम एक की जांच कर रहे हैं, इसका fd हमेशा एरेना संरचना की ओर इशारा करना चाहिए।
यदि अगले चंक यह नहीं दर्शा रहा है कि पिछले का उपयोग हो रहा है: malloc(): invalid next->prev_inuse (unsorted)
यदि यह सफल रहा, तो चंक को वापस करें और यह समाप्त हो गया, यदि नहीं, तो फ़ंक्शन को निष्पादित करना जारी रखें...
यदि समान आकार
बिन से चंक को हटाना जारी रखें, यदि अनुरोधित आकार ठीक उसी चंक का है:
यदि tcache भरा नहीं है, तो इसे tcache में जोड़ें और यह इंगित करना जारी रखें कि एक tcache चंक है जिसका उपयोग किया जा सकता है
यदि tcache भरा हुआ है, तो बस इसका उपयोग करें और इसे वापस करें
_int_malloc सीमाएँ
इस बिंदु पर, यदि कोई टुकड़ा tcache में संग्रहीत था जिसे उपयोग किया जा सकता है और सीमा पहुँच गई है, तो बस tcache टुकड़ा लौटाएँ।
इसके अलावा, यदि MAX_ITERS पहुँच गया है, तो लूप से बाहर निकलें और किसी अन्य तरीके से एक टुकड़ा प्राप्त करें (top chunk)।
यदि return_cached सेट किया गया था, तो बस बड़े खोजों से बचने के लिए tcache से एक टुकड़ा लौटाएँ।
यदि इस के लिए कोई टुकड़ा उपयुक्त नहीं पाया गया, तो जारी रखें
बड़े बिन (अगला बड़ा)
यदि सटीक बड़े बिन में कोई टुकड़ा नहीं था जिसका उपयोग किया जा सके, तो सभी अगले बड़े बिन (तुरंत बड़े से शुरू करते हुए) के माध्यम से लूप करना शुरू करें जब तक कि एक नहीं मिल जाता (यदि कोई हो)।
विभाजित टुकड़े का शेष अनसॉर्टेड बिन में जोड़ा जाता है, last_reminder को अपडेट किया जाता है और वही सुरक्षा जांच की जाती है:
bck->fd-> bk != bck: malloc(): corrupted unsorted chunks2
sysmalloc
sysmalloc प्रारंभ
यदि एरेना शून्य है या अनुरोधित आकार बहुत बड़ा है (और अनुमति प्राप्त mmaps शेष हैं) तो स्थान आवंटित करने और इसे लौटाने के लिए sysmalloc_mmap का उपयोग करें।
sysmalloc नॉन-मेन एरेना
यह पहले इस हीप के लिए पिछले हीप को विस्तारित करने की कोशिश करेगा। यदि यह संभव नहीं है, तो एक नया हीप आवंटित करने की कोशिश करें और इसे उपयोग करने के लिए पॉइंटर्स को अपडेट करें।
अंत में, यदि यह काम नहीं करता है, तो sysmalloc_mmap को कॉल करने की कोशिश करें।
sysmalloc मुख्य क्षेत्र पिछले त्रुटि 1
यदि पिछले में MORECORE_FAILURE वापस किया गया, तो sysmalloc_mmap_fallback का उपयोग करके मेमोरी आवंटित करने का प्रयास करें
sysmalloc finale
आवंटन को समाप्त करें और एरेना जानकारी को अपडेट करें
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L2921C3-L2943C12if ((unsignedlong) av->system_mem > (unsignedlong) (av->max_system_mem))av->max_system_mem = av->system_mem;check_malloc_state (av);/* finally, do the allocation */p = av->top;size =chunksize (p);/* check that one of the above allocation paths succeeded */if ((unsignedlong) (size) >= (unsignedlong) (nb + MINSIZE)){remainder_size = size - nb;remainder =chunk_at_offset (p, nb);av->top = remainder;set_head (p, nb | PREV_INUSE | (av !=&main_arena ? NON_MAIN_ARENA :0));set_head (remainder, remainder_size | PREV_INUSE);check_malloced_chunk (av, p, nb);returnchunk2mem (p);}/* catch all failure paths */__set_errno (ENOMEM);return0;