Malloc LAB - Implicit (2)

최교진·2021년 1월 20일
0

malloc LAB

목록 보기
2/3

지난 포스팅에 이어 묵시적 할당기를 마저 구현해보자.

mm_realloc

mm_realloc은 기존에 할당되어 있던 블록을 새로운 사이즈로 재할당하는 함수이다.

여기에는 2가지 경우가 고려되어야 한다.

  1. 새로 할당하려는 size가 기존 size보다 작을 때
    - 기존 정보를 일부만 복사한 뒤 새로운 포인터를 반환
  1. 새로 할당하려는 size가 기존 size보다 클 때
    - 기존 정보를 모두 복사한 뒤 새로운 포인터를 반환

  • mm_realloc
void *mm_realloc(void *ptr, size_t size)
{
    void *oldptr = ptr;
    void *newptr;
    size_t copySize;
    newptr = mm_malloc(size);
    if (newptr == NULL)
        return NULL;
    copySize = GET_SIZE(HDRP(oldptr));
    if (size < copySize)
    {
        copySize = size;
    }
    memcpy(newptr, oldptr, copySize);
    mm_free(oldptr);
    return newptr;
}

place

place 함수는 블록이 할당되거나 재할당될 때 여유 공간을 판단하여 분할해 주는 함수이다.

여기에도 2가지 경우가 있을 수 있다.

  1. 현재 블록에 size를 할당한 후에 남은 size가 최소 블록 size(headerfooter를 포함한 4워드)보다 크거나 같을 때
    - 현재 블록의 size 정보를 변경하고 남은 size를 새로운 가용 블록으로 분할한다
  1. 현재 블록에 size를 할당한 후에 남은 size가 최소 블록 size보다 작을 때
    - 현재 블록의 size 정보만 바꿔준다

  • place
static void place(void *bp, size_t asize)
{
    size_t csize = GET_SIZE(HDRP(bp));
    if ((csize - asize) >= (2 * DSIZE))
    {
        PUT(HDRP(bp), PACK(asize, 1));
        PUT(FTRP(bp), PACK(asize, 1));
        bp = NEXT_BLKP(bp);
        PUT(HDRP(bp), PACK(csize - asize, 0));
        PUT(FTRP(bp), PACK(csize - asize, 0));
    }
    else
    {
        PUT(HDRP(bp), PACK(csize, 1));
        PUT(FTRP(bp), PACK(csize, 1));
    }
}

여기까지 완성하면 Implicit malloc 프로그램을 정상적으로 구동할 수 있게 된다.

👏 TIL

컴퓨터시스템 교재의 9.9장을 참고하여 따라오면 그대로 구현할 수 있었고 책 내용을 구글링하여 찾아보고 직접 실습해본 내용을 재구성하여 정리하였다.

malloc을 함수로만 사용해 보다가 할당기를 직접 구현하여 보니 시스템의 밑단에서 상당히 복잡한 작업이 이루어지고 있다는 점을 배우게 되었다.

first fit 방식으로 구현하였는데 이를 next fit이나 best fit으로 최적화하는 방법도 있고, 묵시적 할당기가 아닌 명시적 할당기 (Explicit) 방법도 이후에 구현해볼 것이다.

profile
코딩 벌레가 되어보자

0개의 댓글