(Hakuna ukaguzi ulioelezwa katika muhtasari huu na baadhi ya kesi zimeachwa kwa ufupi)
__libc_malloc inajaribu kupata kipande kutoka tcache, ikiwa sio inaita _int_malloc
_int_malloc :
Inajaribu kuunda arena ikiwa hakuna
Ikiwa kuna kipande cha haraka cha ukubwa sahihi, kitumie
Jaza tcache na vipande vingine vya haraka
Ikiwa kuna kipande kidogo cha ukubwa sahihi, kitumie
Jaza tcache na vipande vingine vya ukubwa huo
Ikiwa ukubwa uliotakiwa sio wa bins ndogo, ungana na bin haraka katika bin isiyo na mpangilio
Angalia bin isiyo na mpangilio, tumia kipande cha kwanza chenye nafasi ya kutosha
Ikiwa kipande kilichopatikana ni kikubwa, gawanya ili kurudisha sehemu na ongeza kumbukumbu nyuma kwenye bin isiyo na mpangilio
Ikiwa kipande kina ukubwa sawa na ukubwa uliotakiwa, tumia ili kujaza tcache badala ya kurudisha (hadi tcache ijazwe, kisha rudisha kipande kinachofuata)
Kwa kila kipande cha ukubwa mdogo kilichokaguliwa, weka katika bin yake ndogo au kubwa
Angalia bin kubwa katika orodha ya ukubwa uliotakiwa
Anza kutafuta kutoka kwa kipande cha kwanza ambacho ni kikubwa kuliko ukubwa uliotakiwa, ikiwa chochote kinapatikana rudisha na ongeza kumbukumbu kwenye bin ndogo
Angalia bins kubwa kutoka kwa viashiria vifuatavyo hadi mwisho
Kutoka kwa kiashiria kikubwa kinachofuata angalia kwa kipande chochote, gawanya kipande cha kwanza kilichopatikana ili kukitumia kwa ukubwa uliotakiwa na ongeza kumbukumbu kwenye bin isiyo na mpangilio
Ikiwa hakuna kitu kinachopatikana katika bins zilizopita, pata kipande kutoka kwa kipande cha juu
Ikiwa kipande cha juu hakikuwa kikubwa vya kutosha, panua kwa sysmalloc
__libc_malloc
Kazi ya malloc kwa kweli inaita __libc_malloc. Kazi hii itakagua tcache kuona ikiwa kuna kipande chochote kinachopatikana cha ukubwa unaotakiwa. Ikiwa kiko, kitatumika na ikiwa hakipo itakagua ikiwa ni nyuzi moja na katika kesi hiyo itaita _int_malloc katika arena kuu, na ikiwa sio itaita _int_malloc katika arena ya nyuzi.
__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>
Kumbuka jinsi itakavyokuwa kila wakati inachora kiashiria kilichorejeshwa na `tag_new_usable`, kutoka kwa msimbo:
```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
Hii ni kazi inayopanga kumbukumbu kwa kutumia bins nyingine na top chunk.
Anza
Inaanza kwa kufafanua baadhi ya vars na kupata ukubwa halisi wa nafasi ya kumbukumbu inayohitajika:
Fast Bin
Ikiwa saizi inayohitajika iko ndani ya saizi za Fast Bins, jaribu kutumia kipande kutoka kwa fast bin. Kimsingi, kulingana na saizi, itapata index ya fast bin ambapo vipande halali vinapaswa kuwa, na ikiwa vipo, itarudisha kimoja kati yao.
Zaidi ya hayo, ikiwa tcache imewezeshwa, itajaza tcache bin ya saizi hiyo na fast bins.
Wakati wa kutekeleza vitendo hivi, baadhi ya ukaguzi wa usalama unatekelezwa hapa:
Ikiwa kipande hakiko sawa: malloc(): unaligned fastbin chunk detected 2
Ikiwa kipande cha mbele hakiko sawa: malloc(): unaligned fastbin chunk detected
Ikiwa kipande kilichorejeshwa kina saizi ambayo si sahihi kwa sababu ya index yake katika fast bin: malloc(): memory corruption (fast)
Ikiwa haikuwa kipande kidogo, ni kipande kikubwa, na katika kesi hii malloc_consolidate inaitwa ili kuepuka upasuwaji wa kumbukumbu.
Unsorted bin
Ni wakati wa kuangalia unsorted bin kwa kipande halali kinachoweza kutumika.
Start
Hii inaanza na mzunguko mkubwa ambao utaenda kwenye unsorted bin katika mwelekeo wa bk hadi ifike mwisho (struktura ya arena) kwa while ((victim = unsorted_chunks (av)->bk) != unsorted_chunks (av))
Zaidi ya hayo, baadhi ya ukaguzi wa usalama unafanywa kila wakati kipande kipya kinapozingatiwa:
Ikiwa saizi ya kipande ni ya ajabu (ndogo sana au kubwa sana): malloc(): invalid size (unsorted)
Ikiwa saizi ya kipande kinachofuata ni ya ajabu (ndogo sana au kubwa sana): malloc(): invalid next size (unsorted)
Ikiwa saizi ya awali iliyoonyeshwa na kipande kinachofuata inatofautiana na saizi ya kipande: malloc(): mismatching next->prev_size (unsorted)
Ikiwa si victim->bck->fd == victim au si victim->fd == av (arena): malloc(): unsorted double linked list corrupted
Kwa kuwa kila wakati tunakagua ya mwisho, fd yake inapaswa kuelekeza kila wakati kwenye struktura ya arena.
Ikiwa kipande kinachofuata hakionyeshi kuwa cha awali kinatumika: malloc(): invalid next->prev_inuse (unsorted)
Ikiwa hii ilifanikiwa, rudisha kipande na imeisha, ikiwa sivyo, endelea kutekeleza kazi...
ikiwa saizi sawa
Endelea kuondoa kipande kutoka kwenye bin, ikiwa saizi iliyohitajika ni sawa na ile ya kipande:
Ikiwa tcache haijajazwa, ongeza kwenye tcache na endelea kuonyesha kwamba kuna kipande cha tcache ambacho kinaweza kutumika
Ikiwa tcache imejaa, tumia tu kurudisha
_int_malloc mipaka
Katika hatua hii, ikiwa kipande fulani kimehifadhiwa katika tcache ambacho kinaweza kutumika na mipaka imefikiwa, tu rudisha kipande cha tcache.
Zaidi ya hayo, ikiwa MAX_ITERS imefikiwa, vunja kutoka kwenye mzunguko na pata kipande kwa njia tofauti (kipande cha juu).
Ikiwa return_cached ilipangwa, rudisha tu kipande kutoka tcache ili kuepuka utafutaji mkubwa.
Ikiwa kipande hakijapatikana kinachofaa kwa hili, endelea
Large Bin (next bigger)
Ikiwa katika large bin halisi hakukuwa na kipande chochote ambacho kingeweza kutumika, anza kuzunguka kupitia large bin zote zinazofuata (kuanzia na ile kubwa zaidi mara moja) hadi kipande kimoja kipatikane (ikiwa kipo).
Kumbukumbu ya kipande kilichogawanywa inaongezwa katika unsorted bin, last_reminder inasasishwa na ukaguzi sawa wa usalama unafanywa:
bck->fd-> bk != bck: malloc(): corrupted unsorted chunks2
sysmalloc
sysmalloc kuanza
Ikiwa arena ni null au saizi iliyohitajika ni kubwa sana (na kuna mmaps zilizobaki zinazoruhusiwa) tumia sysmalloc_mmap kutenga nafasi na kuirudisha.
sysmalloc si eneo kuu
Itajaribu kwanza kupanua heap ya awali kwa ajili ya heap hii. Ikiwa haiwezekani, jaribu kugawa heap mpya na kusasisha viashiria ili uweze kuitumia.
Hatimaye, ikiwa hiyo haikufanya kazi, jaribu kuita sysmalloc_mmap.
sysmalloc main arena previous error 1
Ikiwa ilirudishwa MORECORE_FAILURE, jaribu tena kutenga kumbukumbu kwa kutumia sysmalloc_mmap_fallback
sysmalloc finale
Maliza ugawaji kwa kusasisha taarifa za arena
// 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;