6주차는 Malloc기능을 직접 만들어보는 과제를 수행하였다.
Implicit - 구현 코드 보기 : (util: 44, thru 12점)
implicit 까지는 CSAPP 교재 자체에 코드가 존재한다.
그냥 무작정 보고 하기엔 감이 오지 않아서 해당 코드를 보고 따라해보았다 (그 이후로 모든 코드를 베끼게 되는데..)
Malloc을 구현하기 위해서, 다음의 이슈들을 코드로 풀어내야 한다.
아이디어 자체는 간단했지만, 이것을 코드로 풀어내는 과정이 어려웠다.
할당할 블록을 찾기위해서 가용 블록을 검색하는 선형시간이 걸리고, 이때, 가용 블록만이 아닌 모든 블록을 탐색하기에, 효율적인 방법은 아니다.
실제로 util점수는 44점으로 그렇게 낮지 않은 데 비해서, 시간당 처리율을 나타내는 thru 점수가 18점으로 낮게 나왔다.
explicit - 구현 코드 보기(util 42, thru 40 점)
next-fit에 대한 이해도 없이, explicit을 next-fit 으로 구현해보려고 애를 썼으나, segfault를 극복하지 못했다.
그냥 next-fit 한번 해봐야지 ~ 하고 시작한 일이 잘 마무리가 되지 않아서 힘들었다.
Segregated free list - 구현 코드보기 : util 54, thru 40점
Explicit과 비슷하나, 연결리스트가 여러개 있고, 이 여러개 연결리스트의 배열을 추가적으로 관리해주면 된다
해당 코드에서는 2의 n제곱을 기준으로 연결리스트에 담을 사이즈를 구분해주었다.
예를 들면, 2^4 ~ 2^5 -1 바이트 까지 특정 연결리스트에서 관리해주는 식이다
그래서 malloc, 연결리스트에서 노드를 삽입 /삭제할 때 2개의 과정을 거쳐야한다.
대강 이런식으로..
realloc부분도 이해하기가 쉽지 않았다.
코드에서는 해당부분인데, 어쩌다보니 주석을 잔뜩 달아놨다.
/* Check if next block is a free block or the epilogue block */
if (!GET_ALLOC(HDRP(NEXT_BLKP(ptr))) || !GET_SIZE(HDRP(NEXT_BLKP(ptr)))) { // 현재 ptr 다음 블록이 free이거나 에필로그 블록
/* 1. 다음 블록을 사용하는 경우 */
/* remainder: 현재 블록에 가용한 다음 블럭의 크기를 더한것에서, 새로 할당할 사이즈를 뺀 것 */
remainder = GET_SIZE(HDRP(ptr)) + GET_SIZE(HDRP(NEXT_BLKP(ptr))) - new_size;
if (remainder < 0) { // ,...?
extendsize = MAX(-remainder, CHUNKSIZE); // remainder의 역수와 CHUNKSIZE중 더 큰것 만큼
if (extend_heap(extendsize) == NULL) // 힙을 연장해줌
return NULL;
remainder += extendsize; // 연장한만큼 remainder에 더해준다
}
delete_node(NEXT_BLKP(ptr));
/* 경우에 따른 블럭의 크기 */
// if ptr+next 크기 >= new_size:
// ptr + next 블럭 사이즈만큼 사이즈 잡아줌
// if -remainder > CHUNK && ptr+next 크기 < new_size 크기:
// ptr + next - new + (-ptr - next + new) + new_size = new_size 만큼 사이즈 잡아줌
// elif -remainder < CHUNK && ptr+next 크기 < new_size 크기:
// ptr + next - new_size + CHUNK + new_size = ptr + next + CHUNKSIZE 만큼 사이즈 잡아줌
PUT(HDRP(ptr), PACK(new_size + remainder, 1));
PUT(FTRP(ptr), PACK(new_size + remainder, 1));
} else { // 다음 블록이 할당블록
/* 2. 다음 블록을 사용하지 않는 경우 */
new_ptr = mm_malloc(new_size - DSIZE); // 헤더,푸터만큼의 사이즈 빼고 새로 할당해줌
memcpy(new_ptr, ptr, new_size);
mm_free(ptr);
}
(밑 사진은 그냥 그린게 아까워서...)