Почему распределителю, использующему явный свободный список, нужен начальный размер кучи, равный 48 байтам? - PullRequest
0 голосов
/ 23 мая 2019

Я рассматриваю реализацию распределителя с использованием явного свободного списка и удивляюсь, почему многие люди использовали 48 байтов в качестве исходного размера.

Но большинство людей использовали 48 НЕ 24

#define PACK(size, alloc)  ((size) | (alloc))
#define PUT(p, val)  (*(size_t *)(p) = (val))  
#define WSIZE       4     
#define DSIZE       8  
#define CHUNKSIZE  (1<<12)
#define OVERHEAD 24 


static char *heap_listp;  /* pointer to first block */  
static char *mem_brk; /* pointer to last byte of heap plus 1 */

void *mem_sbrk(int incr){
    char *old_brk = mem_brk;

    mem_brk +=incr;
    return (void *)old_brk;
}


int mm_init(void)
{
    if((heap_listp = mem_sbrk(48) == NULL){                                      //Return error if unable to get heap space
        return -1;
    }

    PUT(heap_listp, 0);                                                                  
//Put the Padding at the start of heap
    PUT(heap_listp + WSIZE, PACK(OVERHEAD, 1));                                             
//Put the header block of the prologue
    PUT(heap_listp + DSIZE, 0);                                                             
//Put the previous pointer
    PUT(heap_listp + DSIZE + WSIZE, 0);                                                     
//Put the next pointer
    PUT(heap_listp + OVERHEAD, PACK(OVERHEAD, 1));                                          
//Put the footer block of the prologue
    PUT(heap_listp + WSIZE + OVERHEAD, PACK(0, 1));                                         
//Put the header block of the epilogue


    if(extend_heap(CHUNKSIZE / WSIZE) == NULL){                                             //Return error if unable to extend heap space
        return -1;
    }

    return 0;
}

Я думаю, что мыдостаточно иметь 6 слов (заполнение, блок заголовка пролога, блок нижнего колонтитула пролога, предыдущий указатель, следующий указатель и блок заголовка эпилога) Так что я думаю, что нам нужно объявить как

if((heap_listp = mem_sbrk(24)) == NULL)

Пожалуйста, не стесняйтесь указывать, чтоЯ пропал.

1 Ответ

0 голосов
/ 23 мая 2019
    PUT(heap_listp, 0); //ofset 0                                                                  
    PUT(heap_listp + WSIZE, PACK(OVERHEAD, 1));    //offset 4 - appears to contain a length (of OVERHEAD bytes)
    PUT(heap_listp + DSIZE, 0);           //offset 8                                                  
    PUT(heap_listp + DSIZE + WSIZE, 0);  //offset 8 + 4 = 12                                                   
    PUT(heap_listp + OVERHEAD, PACK(OVERHEAD, 1)); // offset 24 - another length of OVERHEAD bytes                                   
    PUT(heap_listp + WSIZE + OVERHEAD, PACK(0, 1)); //offset 24 + 4

Очевидно, что sbrk должен быть больше 24, так как вы пишете в байт 31

Таким образом, похоже, что первоначальная установка состоит из 2 блоков, оба из которых имеют длину OVERHEAD.

Использование 2 * OVERHEAD для sbrk было бы яснее.Так что будет использовать структуру для заголовка области памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...