본문 바로가기
2️⃣ 개발 지식 B+/draft (비공개 모음)

Allocator 퀴즈

by ddubbu 2024. 9. 14.

출처

  • 정글 사관학교

 

1. 다음 코드가 일으키는 문제와 관련된 키워드

A: m = malloc(5); m = NULL;
B: free(n); n->val = 5;
C: char *p; *p = 'a';
  • A - memory leak : 필요하지 않은 메모리를 계속 점유하고 있는 현상
  • B - dangling pointer (=Premature Free) : 유효한 객체를 가리키고 있지 않는 포인터
    • [이슈1] 메모리 접근 시 예측 불가능한 동작
    • [이슈2] 접근 불가 시 Segmentation Fault
    • [해결] 메모리 해제 후 포인터를 NULL 혹은 nullptr로 처
  • C - uninitialized pointer

 

2. 메모리를 할당하는데 블록단위로 할당하는 이유

  • Fragmentation 방지
  • 관리 효율성
  • 할당 속도 향상 

*오버헤드 : 어떤 작업이나 시스템에서 추가적인 비용. 성능 저하, 시간 지연, 메모리 사용 증가 등의 형태로 나타날 수 있음

 

 

3. 메모리 블럭의 크기를 고정해서 동적 메모리를 할당한다고 생각해 보자. 주어진 메모리가 제한되어 있을 경우 블럭의 크기를 크게 잡을 때와 작게 잡을때, 각각의 장단점을 논하시오. (한 블럭의 크기보다 큰 메모리를 할당하는 경우 연속적으로 할당할 필요가 없다고 가정하자.)

 

블럭의 크기가 작은 경우: internal fragmentation은 적어진다는 장점이 있으나 전체 블럭의 수가 늘어나므로 블럭을 관리하는 비용이 커짐 (header/footer 혹은 할당 정보를 관리하는 table의 크기가 큼) 할당할 메모리 크기보다 해당 블럭의 관련 정보의 크기가 큰, 소위 배보다 배꼽이 큰 경우도 생김 블럭의 크기가 큰 경우: 블럭의 크기가 작은 경우의 장단점이 반대가 됨 블럭을 관리하는 비용이 줄어들기 때문에 할당/해제 속도도 빠름

 

 

4. Garbage collection 이 무엇인지 설명하시오. 또한, 왜 C언어에서는 garbage collection을 사용할 수 없는지 (혹은 어려운지) 논하시오.

GC - free를 안 해도 쓰지 않는 memory block을 회수하는 시스템 현재 프로그램에서 사용중인 reference들의 목록을 프로그램 언어 차원에서 관리 사용중인 reference가 가리키는 구조체와 그 구조체의 reference 들이 가리키는 다른 구조체들을 graph traversal과 같은 방법으로 방문하면서 사용중임을 표시해서 사용중인 memory block들을 알 수 있도록 만드는 mark&sweep algorithm이 대표적인 방식 C 언어차원에서는 특정 시점의 사용중인 pointer와 할당된 memory block중 pointer들을 구분하도록 만드는 것이 어려우므로 GC를 구현하기 어려움. 참고: CSAPP 9.10. 참고 2: 디스크 조각모음처럼 메모리 조각모음을 하는 것은 GC가 아니라 memory compaction이라고 함. pointer의 값도 바꿔줘야 해서 자주 고려되지는 않음