[C] week7 발표자료

고민지·2025년 7월 2일

크래프톤 정글 9기

목록 보기
17/29

크래프톤 정글 53일차

malloc()에서 (DSIZE-1)을 더하는 이유

void *mm_malloc(size_t size)
{
   size_t asize; 
   size_t extendsize; 
   char *bp; 

   if (size == 0)
       return NULL;
       
   if (size <= DSIZE) 
       asize = 2*DSIZE;
   else
       asize = DSIZE * ((size + (DSIZE) + (DSIZE - 1)) / DSIZE); 

   if ((bp = find_fit(asize)) != NULL){
       place(bp, asize);
       return bp;
   }

   extendsize = MAX(asize, CHUNKSIZE);

   if ((bp = extend_heap (extendsize/WSIZE)) == NULL)
       return NULL;

   place(bp, asize);
   return bp;
}

asize = DSIZE * ((size + (DSIZE) + (DSIZE - 1)) / DSIZE);에서 (DSIZE - 1)을 더하는 이유는 뭘까?

  • 현대 시스템은 더블워드인 8bytes로 정렬하는 것이 일반적임으로, 할당할 때는 무조건 8의 배수로 할당해야한다.

❓ (DSIZE - 1)을 더해주지 않아도 8의 배수로 정렬된다.

  • size(요청크기) : 13
  • 헤더 : 8
  • 합 : 21
8*((13+8)/8) = 16

16 bytes 할당된다면, 8의 배수는 맞지만, 21bytes는 담지못해 오버플로우가 발생한다.

asize = payload+header

❓DSIZE가 아닌 (DSIZE-1)을 더해주는 이유는 뭘까?

  • 요청 크기 : 13
  • 헤더 : 8
  • 합 : 21

DSIZE을 더해주는 경우

8*((13+8+8)/8) = 24

(DSIZE - 1)을 더해주는 경우

8*((13+8+7)/8) = 24

13으로 했을 경우, DSIZE를 더해주는 경우와 (DSIZE - 1)을 더해주는 경우 모두 할당 블럭의 크기는 24로 같다.

✅ 요청 크기가 8의 배수라면??

  • 요청 크기 : 16
  • 헤더 : 8
  • 합 : 24

DSIZE을 더해주는 경우

8*((16+8+8)/8) = 32

(DSIZE - 1)을 더해주는 경우

8*((16+8+7)/8) = 24

필요한 크기는 24 bytes인데 DSIZE를 더해주면 너무 많은 크기를 할당해 메모리 낭비가 생긴다.
하지만, (DSIZE - 1)을 더해주면 딱 경계값에서만 올리기 때문에 메모리 낭비가 생기지 않는다.

🔑 (DSIZE - 1)을 더하는 이유는 그냥 8의 배수를 만들기 위한게 아니라, 요청한 크기를 딱 필요한 만큼만 8의 배수로 만들어주는 역할을 하기 위해서이다.

0개의 댓글