동적 메모리 할당의 개념을 학습하고, 가상의 환경에서 동적 메모리 할당을 직접 해보는 프로젝트다.
프로젝트 키워드 🤔
시스템 콜, 데이터 세그먼트, 메모리 단편화, sbrk/mmap
22.12.04
팀원들과 동적 메모리 할당에 대한 팀 스터디 진행.
22.12.05
CS:APP 챕터9에 나와있는 C언어 코드를 공부하면서 코드 작성.
1. 기본 상수와 매크로 선언
- 1word 2word 규격 설정
- 자주 사용되는 함수 선언
2. static void *extend_heap(size_t words) 함수 작성
heap 영역 확장하는 함수 선언
3. static void *coalesce(void *bp) 함수 작성
ptr 포인터에 위치한 할당된 블럭 반환(가용 블럭으로 만들기) case 2, PUT(FTRP(bp), PACK(size, 0)); 이 가능한 이유 : 바로 직전 코드에서 헤드의 정보를 바꿨기 때문에, 옳게 설정될 수 있다.
4. void *mm_malloc(size_t size) 함수 작성
기존의 mm_malloc 함수는 여러 조건을 필터링 할 수 없었다. 수정 및 hand-out에 맞게 작성
5. static void *find_fit(size_t asize) 함수 작성
first-fit 방식으로 find_fit 함수 작성
6. static void place(void *bp, size_t asize) 함수 작성
가용 블럭에 데이터를 할당할 때,가용 블럭을 나눠주는 함수 작성
7. void *mm_realloc(void *ptr, size_t size) 함수 작성
블럭의 메모리를 변경하는 reaaloc 함수 작성
22.12.06
명시적 가용 리스트 만들기 = mm.c 기존 묵시적 가용 리스트 코드 = mm_implicit.c
- root_free 선언
1. static void *extend_heap(size_t words) 수정
- 가용 블럭의 prev, next 값 갱신하는 코드 작성
2. void mm_free(void *ptr) 수정
- 새로 생기는 가용 블럭으로의 root_free 값 수정
3. static void *coalesce(void *bp) 수정
- case에 따라서 두 블럭의 prev, next 값 갱신하는 코드 작성
4. static void place(void *bp, size_t asize) 수정
- 가용 블럭의 최소 단위는 4*DSIZE로 변경
5. 작업 도중에 root_free가 NULL값이 된다면? (가용블럭이 하나도 없는 상태)
- free와 extend_heap 함수에서 조건문으로 검사해야한다.
- free : if (root_free != NULL) 를 통해서 root_free값이 존재할 때만 새로운 가용 블럭과 연결한다.
- extend_heap : init을 고려하여 미리 설정한 조건문이 확인해준다.
6. static void *find_fit(size_t asize) 수정
- for문의 조건을 수정하여 root_free부터 탐색하도록 했다.
7. segmentation fault 발생 (오마이갓 비상사태 큰일이다)
- 형식자 지정을 옳게 지정하지 못해 발생하는 것으로 가정
22.12.07
1. 익일 발생한 오류로 인해 다시 작업 시작
- 익일 place 함수 수정중에 root_free가 없어지는 상황을 어떻게 처리할 것인지
- case로 나누어 작동
2. static void *find_fit(size_t asize) 수정
- [1] 1658 segmentation fault ./mdriver 발생
3. root_free 를 char* 로 지정하여 다시 작업 시작
- NULL 포인터와 int 0 은 서로 형 변환이 가능하다!!! (세상에;)
4. 발견 허점들
- coalesce 함수에서 합쳐지는 블럭이 마지막 가용블럭이었을 경우 계산을 놓침.
- place 함수에서 최소 가용블럭 크기는 이전과 동일하게 2*DSIZE 이다. 왜냐하면, 헤더(1word) + 풋터(1word) + 후임자(1word) + 선임자(1word) = 4*word = 2*double word 이기 떄문이다.
- free에서 root_free 최신화를 안했다.
- find_fit 함수에서 for문이 아닌 while문으로 마지막 블럭 검색도 포함시킨다.
- [1] 5360 segmentation fault ./mdriver 발생
- coalesce case3에서 에러가 발생하는 것으로 예상됨
- if ( (unsigned int)(GET(PREV_BLKP(bp)+WSIZE)) == 0 ) unsigned int로 형변환을 해야한다.
개발을 마치며,
이번 프로젝트에서는 묵시적 가용 리스트를 기반으로 한 동적 메모리할당 프로그램을 작성했다.
추가적으로 명시적 가용 리스트를 진행했으나 실패했다.
포인터의 활용에서 부족한 점이 많았던 것 같다.
결국 오류를 해결하지 못했기 때문에 정확한 오류의 근원지를 찾지 못했다.
하지만, 매번 처음부터 다시 작성할 때마다 잘못된 부분이 발견됐다.
'TIL (Today I Learned) > 개발일지' 카테고리의 다른 글
[개발일지] WebServer 만들기 (0) | 2022.12.14 |
---|
댓글