WEEK01 ~ WEEK04에는 알고리즘 공부에만 집중했다. 그러다 지난주(WEEK05)에 C언어 학습 및 RB Tree 데이터 구조를 학습하게 되면서, 전에 공부했던 알고리즘과 RB TREE 과제 그리고 CS 공부까지 방대한 학습 범위에서 어떻게 공부하는 것이 좋은지에 대한 방향을 잡지 못해 힘들었다.
이런 상황을 벗어나고자 생활패턴과 공부 방식을 크게 바꿨다. 지금 상황에서 내게 가장 효율적인 공부 방식과 정신 및 육체의 상태를 찾고자 나름의 노력을 했다. 그 결과 지금은 지난 주와 비교했을 때 매우 안정된 상황이 되었다. 그리고 내 몸에 잘 맞는 생활 패턴을 찾은 거 같아 뿌듯하다.
이번 상황을 경험하면서, 문제에 부딪혔을 때 어떤 고민과 각오를 했으며 어떻게 나를 변화시켰는지에 대해 기록해야할 필요성을 느꼈다. 그래서 코치님께서 강조하신 개발일지를 부지런히 써보고자 한다. 다만 내가 쓰는 일지는 개발을 하면서 관찰한 나에 대한 내용을 주로 담는다.
정글은 20대의 추억 중에서도 강렬한 기억으로 남을 것이다. 지금부터 부지런히 기록하고 나와 함께 지금을 추억할 사람들에 대한 내용을 담겠다.
"결과적 행복이 과정의 행복을 보장하는 것은 아니다"
정글을 선택한 것은 결과적으로 행복으로 가는 길이라고 생각했다. 하지만 정글에서 제시하는 과정들을 버티는 일은 꽤 힘들었고, 지금까지도 계속 잘 버틸 수 있는 방법을 고민한다. 결과적으로 행복할거라해서 과정이 행복할거라는 건 오만이나, 지금의 과정을 잘 버티면 행복이 기다리고 있을 거라는 믿음으로 열심히 해야지라는 마음으로 살고 있다.
타협
: WEEK01을 제외하고 WEEK02~WEEK04까지 코치님이 제시해주신 모든 문제를 푼 주는 한 번도 없었다. 그리고 4주가 지난 지금, 알고리즘 스터디에서 지난 4주동안 배웠던 알고리즘 문제들을 다시 복습하고 있다. 나는 여전히 그 때 제대로 풀지 않았던 문제들에 쩔쩔 매고 있다.
RB Tree 및 Malloc 구현에서 답부터 찾아 본 것
: 조금만 디버깅이 힘들면 답지부터 찾고 그게 내 실력인양 안심했다. 그게 내 실력이 아닌 것은 이번 WEEK06 테스트에서 코드리뷰를 받으면서 밝혀졌다. 나는 리뷰이에게 해줄 코멘트가 많이 없었다. 왜냐 잘 모르니까. 그리고 리뷰어에게 받은 코멘트를 잘 이해할 수도 없었다.
우선 순위 설정을 실패해 과제를 충실히 못한 것
: Malloc 구현에서 implicit, explicit까지 구현하고 이후 seglist, buddysystem은 구현할 시간적 여유가 없었다. 참여하는 스터디가 3개가 되니 스터디 공부의 비중이 커졌다. 그러다보니 가장 중요한 과제를 성실히 수행하지 못한 점이 아쉽다.
: 정글 초입, 매일 새벽 2시 정도까지 공부하다보니 2주차가 되었을 때 완전 방전이 되었다. 그 때부터 체력 안배의 중요성을 깨닫고 취침시간과 기상시간을 조율하며 생활패턴을 바꿔보았다.
: 저번 주부터 유지하고 있는 생활패턴이 00시 30분(+- 10분) 취침// 05시 30분 기상// 점심 먹고 30분 취침// 저녁 먹고 30분 취침
이다.
: 여태까지 공부 방식은 혼자 공부하는 방식이었다. 그래서 정글에서도 여태까지 CSAPP 책을 혼자 읽으면서 공부해왔다. 날이 갈수록 공부량이 많아져 더이상 혼자 해결할 수 없을 지경이 되었다. 그러다 CSAPP 9.9. 동적할당을 같은 조였던 건엽이와 민성이에게 강의식으로 알려주게 되었다. 오히려 이해도가 더 올라가는 것을 느꼈고, 잘못 이해하고 있는 부분도 동기들을 통해서 다시 알 수 있게 되어 좋았던 경험이 있다.
: 그 날 이후에 CS 스터디를 개설해 함께 효율적인 공부방법을 고민하며 구성원들과 공부를 해오고 있다. 뿐만 아니라 CS 면접 스터디와 알고리즘 스터디도 같이 하면서 하루 중 오후 시간은 스터디를 위한 시간으로 쓰고 있다.[위의 사진] 캠퍼스 잔디 밭에 돗자리 펴고 스터디 한 날(2022.05.10)
[위의 사진] 스터디를 위해 내가 맡은 부분 정리한 것
: WEEK03이 DFS/BFS 관련 알고리즘을 학습하는 기간이었다. 이 때 재귀에 대한 개념이 잘 잡히지 않아 심적으로 많이 힘들었고 특히 BFS문제에 접근이 잘 안되었다. 시간을 투자한만큼 결과가 안나와서 잠이 오지도 않고, 그 와중에 집안일로 부산에 내려가야해서 심적으로 부담되었다.
부산으로 내려가는 길에 전날 현주 플레이리스트에 있던 "나이트 오프 - 잠"에 멜로디가 좋었던 것이 기억나 내려가는 KTX에서 이 노래를 들었다.
나 조금 누우면 안 될까
잠깐 잠들면 안 될까
라는 가사를 듣자마자 눈물이 주르륵 났었다. 스스로를 많이 몰아넣고 있었구나라고 생각했고 반성했던 순간으로 기억해 인상깊은 노래다.
1. 명시적 동적 메모리 할당(malloc) 직접 구현
: '동적 메모리 할당'이란 개념 자체가 참 개발자스럽다는 생각이 들었다. 결국 런타임 전에 미리 메모리를 할당해놓으면 진짜 필요한 데이터량과 차이가 있을 수 있으니까 싫다는 거다. 그래서 런타임 때 필요한 데이터량이 딱 정해지면 동적으로 메모리를 할당하겠다는 개념이었다.
2. 내부 단편화, 외부 단편화 문제 개선
: 동적 메모리 할당의 목표가 처리 속도를 향상 시키면서, 메모리 공간 활용도를 높이는 것이다. 이러한 목표를 저해시키는 것이 내부 단편화와 외부 단편화로 이해했다. 내부 단편화는 할당 공간보다 가용 메모리 공간이 커서 생기는 것이고, 외부 단편화는 모든 메모리 공간을 합치면 할당 공간이 마련되지만 블록 별로 메모리 공간이 잘려있어서 할당해줄 수 없는 문제를 일컫는다. 두 가지 모두 메모리 활용에서 문제가 있다는 것이다.
3. 가용 리스트 종류 선택
: 동적 메모리 할당을 하면 결국 힙이란 자료구조를 사용하게 된다. 이 때, 이 힙 리스트를 묵시적 가용 리스트로 구성할 지, 명시적 가용 리스트로 구성할 지 그것은 개발자의 몫이다. 전자는 블록 헤더에 블록 사이즈 값을 통해 순차적으로 검색하여 가용 블록을 찾아가는 방법을 채택한다. 이 때, 가용 블록을 찾는 방식에도 first-fit, next-fit, best-fit으로 방식이 나뉜다.
명시적 리스트는 할당 블록은 묵시적 리스트와 같은 모습이지만 가용 블록에 한해서 pred 포인터와 succ 포인터가 해당 블록 기준 앞에 있는 가용 블록과 뒤에 있는 가용 블록의 주소를 가리키게 된다. 따라서 묵시적 리스트보다 가용 블록 검색이 빠르다.
4. 디버깅
: next-fit을 구현할 때, segmetation error가 발생했다. implicit 리스트에서 first-fit으로 구현했을 때는 잘 돌아갔다. next-fit으로 수정하면서 변화가 생긴 코드들도 모두 확인했음에도 segmentation error가 없어지지 않아 고생했다. 결국 오타 하나 때문에 발생한 것을 발견하고 문제를 해결할 수 있었다.
5. 구현
: 나는 implicit 리스트에서 next-fit, explicit까지 구현했다. 이는 최고 득점을 받았던 explicit 구현 코드 중 말록 부분만 따로 떼어서 나타냈다.
/*
* mm_malloc - Allocate a block by incrementing the brk pointer.
* Always allocate a block whose size is a multiple of the alignment.
*/
void *mm_malloc(size_t size)
{
size_t asize;
size_t extendsize;
char *bp;
/*Ignore spurious requests*/
if (size == 0)
{
return NULL;
}
/*Adjust block size*/
if (size <= DSIZE)
{
asize = 2 * DSIZE;
}
else
{
asize = DSIZE * ((size + (DSIZE) + (DSIZE - 1)) / DSIZE);
}
/*Search the free list for a fit*/
if ((bp = find_fit(asize)) != NULL)
{
place(bp, asize);
return bp;
}
/* No fit found. Get more memory and place the block*/
extendsize = MAX(asize, CHUNKSIZE); // minimum 16bytes
if ((bp = extend_heap(extendsize / WSIZE)) == NULL)
{
return NULL;
}
place(bp, asize);
return bp;
}
최종 82점을 받았다.