Malloc-lab (realloc 개선)

2024. 4. 30. 15:15크래프톤 정글 5기/공부

1. Next block이 Free block, 충분한 크기를 가질 때

 

 

if (!GET_ALLOC(HDRP(NEXT_BLKP(oldptr))) && (size + DSIZE <= next_size)) 
        // 다음 블록이 Free block이고, (재할당 하려는 블록의 사이즈 + 8 bytes) <= (현재 블록 사이즈 + 다음 블록 사이즈)
        // 현재 블록과 다음 블록을 하나의 블록으로 취급해도 크기의 문제가 발생하지 않음
        // malloc을 하지 않아도 됨 -> 메모리 공간 및 시간적 이득을 얻을 수 있음
        {
            PUT(HDRP(oldptr), PACK(next_size, 1)); // 현재 블록의 Header Block에, (현재 블록 사이즈 + 다음 블록 사이즈) 크기와 Allocated 상태 기입
            PUT(FTRP(oldptr), PACK(next_size, 1)); // 현재 블록의 Footer Block에, (현재 블록 사이즈 + 다음 블록 사이즈) 크기와 Allocated 상태 기입
            lastp = oldptr; // next_fit 사용을 위한 포인터 동기화
            return oldptr;
        }

 

 

2. Next block이 Free block, 충분한 크기를 가질 때 + Prev block이 Free block, 충분한 크기를 가질 때

 

 

else if (!GET_ALLOC(HDRP(PREV_BLKP(oldptr))) && (size + DSIZE <= prev_size))
        // 이전 블록이 Free block이고, (재할당 하려는 블록의 사이즈 + 8 bytes) <= (이전 블록 사이즈 + 현재 블록 사이즈)
        // 이전 블록과 현재 블록을 하나의 블록으로 취급해도 크기의 문제가 발생하지 않음
        // malloc을 하지 않아도 됨 -> 메모리 공간 및 시간적 이득을 얻을 수 있음
        {
            void *prev_ptr = PREV_BLKP(oldptr); // 이전 블록의 bp
            
            memmove(prev_ptr, oldptr, copySize); // 이전 블록의 bp로 현재 block의 메모리 영역을 옮긴다
            PUT(HDRP(prev_ptr), PACK(prev_size, 1)); // 이전 블록의 Header Block에, (이전 블록 사이즈 + 현재 블록 사이즈) 크기와 Allocated 상태 기입
            PUT(FTRP(prev_ptr), PACK(prev_size, 1)); // 이전 블록의 Footer Block에, (이전 블록 사이즈 + 현재 블록 사이즈) 크기와 Allocated 상태 기입
            lastp = prev_ptr; // next_fit 사용을 위한 포인터 동기화
            return prev_ptr;
        }

 

 

3. Next block이 Free block, 충분한 크기를 가질 때 + Prev block이 Free block, 충분한 크기를 가질 때 + Next block, Prev block 모두 Free block이며 충분한 크기를 가질 때

 

 

 

else if (!GET_ALLOC(HDRP(NEXT_BLKP(oldptr))) && !GET_ALLOC(HDRP(PREV_BLKP(oldptr))) && (size + DSIZE <= next_size + copySize + prev_size))
        // 이전 블록과 다음 블록이 모두 Free block, (재할당 하려는 블록의 사이즈 + 8 bytes) <= (이전 블록 사이즈 + 현재 블록 사이즈 + 다음 블록 사이즈)
        // 이전 블록과 현재 블록과 다음 블록을 하나의 블록으로 취급해도 크기의 문제가 발생하지 않음
        // malloc을 하지 않아도 됨 -> 메모리 공간 및 시간적 이득을 어등ㄹ 수 있음
        {
            void *prev_ptr = PREV_BLKP(oldptr); // 이전 블록의 bp

            memmove(prev_ptr, oldptr, copySize); // 이전 블록의 bp로 현재 block의 메모리 영역을 옮긴다
            PUT(HDRP(prev_ptr), PACK(prev_size + copySize + next_size, 1)); // 이전 블록의 Header Block에, (이전 블록 사이즈 + 현재 블록 사이즈 + 다음 블록 사이즈) 크기와 Allocated 상태 기입
            PUT(FTRP(prev_ptr), PACK(prev_size + copySize + next_size, 1)); // 이전 블록의 Footer Block에, (이전 블록 사이즈 + 현재 블록 사이즈 + 다음 블록 사이즈) 크기와 Allocated 상태 기입
            lastp = prev_ptr; // next_fit 사용을 위한 포인터 동기화
            return prev_ptr;
        }

 


2개의 케이스를 추가한 이후 메모리 사용 성능은 좋아졌으나, 시간이 아주 살짝 증가했다.

 

하지만 메모리 사용 성능이 많이 좋아졌기 때문에, 만족 !


Todo :

 

1. 명시적 가용 리스트로 구현

2. 분리 가용 리스트로 구현

 

'크래프톤 정글 5기 > 공부' 카테고리의 다른 글

[Webproxy-lab] Echo server communication  (0) 2024.05.04
System Call (+ OS, Kernel)  (0) 2024.05.01
Heap Sort  (0) 2024.04.29
Malloc Lab  (0) 2024.04.28
분할정복, Divde / Conquer / Combine  (0) 2024.04.06