[SW 사관학교 정글 8기] [Quiz] WEEK05 Malloc Lab

유선·2024년 4월 21일
0

sw사관학교 정글

목록 보기
9/21
post-thumbnail

1번

🔍 문항

다음 함수들이 어떤 동작을 하는지 argument와 return 값을 포함해서 설명하시오.

void *malloc(size_t size)
void free(void *ptr)
void *realloc(void *ptr, size_t size)

🙋‍♀️ 답안

void *malloc(size_t size):

  • 동작: 메모리를 동적으로 할당합니다. size 매개변수는 할당하려는 메모리의 바이트 수입니다.
  • Arguments: 할당하려는 메모리의 크기인 size를 받습니다.
  • Return 값: 성공적으로 할당된 메모리의 시작 주소를 반환합니다. 할당에 실패한 경우 NULL을 반환합니다.

void free(void *ptr):

  • 동작: 동적으로 할당된 메모리를 해제합니다. ptr은 해제할 메모리 블록의 시작 주소입니다.
  • Arguments: 해제할 메모리 블록의 시작 주소인 ptr을 받습니다.
  • Return 값: 반환값이 없습니다.

void *realloc(void *ptr, size_t size):

  • 동작: 이미 할당된 메모리의 크기를 변경하거나, 새로운 메모리를 할당하여 기존 메모리의 내용을 복사합니다.
  • Arguments: 크기를 조정하려는 메모리 블록의 시작 주소인 ptr과 조정하고자 하는 새로운 메모리의 크기인 size를 받습니다.
  • Return 값: 성공적으로 크기가 조정된(또는 새로 할당된) 메모리의 시작 주소를 반환합니다. 크기를 조정할 수 없거나 메모리를 재할당할 수 없는 경우 NULL을 반환합니다. 만약 새로운 메모리를 할당하는 경우, 이전 메모리 블록의 내용은 새로운 메모리 블록으로 복사됩니다.

2번

🔍 문항

다음 코드들이 일으키는 문제와 가장 가까운 설명을 코드별로 하나씩 선택하시오.

  • A: m = malloc(5); m = NULL;
  • B: free(n); n->val = 5;
  • C: char p; p = 'a';"

🙋‍♀️ 답안

  • A - memory leak
  • B - dangling pointer
  • C - uninitialized pointer

3번

🔍 문항

implicit, explicit, segregated list 방식을 간단하게 설명하고 각각의 장단점을 논하시오.

🙋‍♀️ 답안

Implicit List (암묵적 리스트)

동작: 암묵적 리스트 방식은 할당된 메모리 블록의 크기와 위치를 추적하기 위해 헤더에 메타데이터를 저장한다. 메모리 할당 요청 시 전체 메모리 블록을 순회하여 사용 가능한 첫 번째 블록을 찾는다.

장점:

  • 메모리 관리 오버헤드가 비교적 낮음

단점:

  • 할당 및 해제 시 전체 메모리를 검색해야 하므로 느린 성능을 보일 수 있다.
  • 외부 단편화(external fragmentation) 발생 가능성이 있다.

Explicit List (명시적 리스트)

동작: 명시적 리스트 방식은 사용 가능한 메모리 블록을 연결 리스트로 관리한다. 할당 및 해제 시에도 명시적으로 연결 리스트를 탐색한다.

장점:

  • 암묵적 리스트 방식보다 더 효율적인 할당 및 해제가 가능하다.
  • 외부 단편화를 줄일 수 있다.

단점:

  • 추가적인 메모리 오버헤드가 발생할 수 있다. (헤더 노드 및 포인터 등)
  • 연결 리스트를 유지해야 하므로 메모리 관리 비용이 높을 수 있다.

Segregated List (분리된 리스트)

동작: 분리된 리스트 방식은 메모리 블록을 크기별로 분류하여 여러 개의 작은 리스트를 관리한다. 메모리 할당 요청 시 적절한 크기의 리스트에서 메모리 블록을 할당한다.

장점:

  • 더 효율적인 메모리 할당 및 해제를 제공한다.
  • 외부 단편화를 줄일 수 있다.

단점:

  • 메모리 블록을 분류하고 관리하기 위한 추가적인 오버헤드가 발생할 수 있다.
  • 리스트의 크기와 개수를 조정하는 데 필요한 추가적인 관리 비용이 있다.

4번

🔍 문항

가용 블럭을 할당하는 정책으로 first fit, next fit, best bit 방식을 설명하고 각각의 장단점을 논하시오.

🙋‍♀️ 답안

  • First Fit (최초 적합):
    메모리 공간을 순차적으로 검색하여 처음으로 발견한 충분한 크기의 공간에 할당한다.
    단순하고 빠르지만, 메모리 단편화 문제가 발생할 수 있다.
  • Best Fit (최적 적합):
    사용 가능한 공간 중에서 가장 작은 크기와 요청 크기가 일치하는 공간에 할당한다.
    이 방식은 메모리 단편화 문제를 줄일 수 있지만, 할당 시간이 더 오래 걸릴 수 있다.
  • Next Fit (다음 적합):
    이전 할당 위치에서부터 검색하여 다음으로 발견한 충분한 크기의 공간에 할당한다.
    First Fit의 일종으로, 메모리 단편화 문제를 어느 정도 해결할 수 있다.

5번

🔍 문항

다음과 같은 함수를 실행하면 어떤 문제가 생기는지 논하시오
(msg 로 전달되는 문자열의 길이가 64 이상인 경우를 가정하시오.)
이와 유사한 코드를 포함한 소프트웨어는 어떤 문제가 발생할 수 있을까?
아래 코드를 어떻게 수정하면 문제가 발생하지 않을 수 있을까?

void print_err(char *msg) {
  char *s = (char *) malloc(10);
  sprintf(s, ""%s\n"", msg);
  fprintf(stderr, s);
  free(s);
};

🙋‍♀️ 답안

  • 할당된 영역보다 큰 메모리를 사용하므로 malloc이 관리하는 메모리 블럭의 정보가 파괴될 가능성이 높음
  • malloc의 관리 정보가 파괴되었으므로 추후 malloc/free call이 엉뚱한 주소를 참조할 수 있으며, 오류가 malloc/free library내에서 발생하므로 어디서 잘못했는지 찾기가 어려워짐.
void print_err(char *msg) {
  char *s = (char *) malloc(strlen(msg) + 2);
  sprintf(s, "%s\n", msg);
  fprintf(stderr, s);
  free(s);
};

extra credit

메모리를 할당하는데 왜 블럭단위로 할당하는지 설명해 보시오.

메모리를 블록 단위로 할당하면 작은 크기의 메모리 조각보다 큰 덩어리로 관리되어 오버헤드를 줄일 수 있다. 이는 작은 크기의 메모리를 여러 개 할당하거나 해제하는 것보다 효율적이다.
메모리 할당이 블록 단위로 이루어지면 외부 단편화를 방지할 수 있다. 작은 조각들이 분산되어 메모리에 할당될 경우, 연속된 큰 블록을 할당하기 어렵고 외부 단편화가 발생할 가능성이 높아진다.
각 블록은 헤더와 같은 메타데이터를 가지고 있어서 할당된 상태와 크기 등을 추적할 수 있다. 이는 메모리 누수를 방지하고 할당 및 해제를 효율적으로 관리할 수 있게 해준다.

할당하는 블럭의 크기를 고정할 경우 블럭의 크기가 클 때와 작을때, 각각의 장단점을 논하시오.

큰 블록은 외부 단편화를 감소시키고 할당 및 해제 오버헤드를 줄일 수 있지만, 내부 단편화와 메모리 낭비가 발생할 수 있다. 작은 블록은 내부 단편화를 감소시키고 메모리를 절약할 수 있지만, 외부 단편화와 할당 및 해제 오버헤드가 증가할 수 있다.

"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를 구현하기 어려움.

profile
Sunny Day!

0개의 댓글