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 |