다음 함수들이 어떤 동작을 하는지 argument와 return 값을 포함해서 설명하시오.
void *malloc(size_t size)
void free(void *ptr)
void *realloc(void *ptr, size_t size)
void *malloc(size_t size)
:
void free(void *ptr)
:
void *realloc(void *ptr, size_t size)
:
다음 코드들이 일으키는 문제와 가장 가까운 설명을 코드별로 하나씩 선택하시오.
implicit, explicit, segregated list 방식을 간단하게 설명하고 각각의 장단점을 논하시오.
동작: 암묵적 리스트 방식은 할당된 메모리 블록의 크기와 위치를 추적하기 위해 헤더에 메타데이터를 저장한다. 메모리 할당 요청 시 전체 메모리 블록을 순회하여 사용 가능한 첫 번째 블록을 찾는다.
장점:
단점:
동작: 명시적 리스트 방식은 사용 가능한 메모리 블록을 연결 리스트로 관리한다. 할당 및 해제 시에도 명시적으로 연결 리스트를 탐색한다.
장점:
단점:
동작: 분리된 리스트 방식은 메모리 블록을 크기별로 분류하여 여러 개의 작은 리스트를 관리한다. 메모리 할당 요청 시 적절한 크기의 리스트에서 메모리 블록을 할당한다.
장점:
단점:
가용 블럭을 할당하는 정책으로 first fit, next fit, best bit 방식을 설명하고 각각의 장단점을 논하시오.
다음과 같은 함수를 실행하면 어떤 문제가 생기는지 논하시오
(msg 로 전달되는 문자열의 길이가 64 이상인 경우를 가정하시오.)
이와 유사한 코드를 포함한 소프트웨어는 어떤 문제가 발생할 수 있을까?
아래 코드를 어떻게 수정하면 문제가 발생하지 않을 수 있을까?
void print_err(char *msg) {
char *s = (char *) malloc(10);
sprintf(s, ""%s\n"", msg);
fprintf(stderr, s);
free(s);
};
void print_err(char *msg) {
char *s = (char *) malloc(strlen(msg) + 2);
sprintf(s, "%s\n", msg);
fprintf(stderr, s);
free(s);
};
메모리를 할당하는데 왜 블럭단위로 할당하는지 설명해 보시오.
메모리를 블록 단위로 할당하면 작은 크기의 메모리 조각보다 큰 덩어리로 관리되어 오버헤드를 줄일 수 있다. 이는 작은 크기의 메모리를 여러 개 할당하거나 해제하는 것보다 효율적이다.
메모리 할당이 블록 단위로 이루어지면 외부 단편화를 방지할 수 있다. 작은 조각들이 분산되어 메모리에 할당될 경우, 연속된 큰 블록을 할당하기 어렵고 외부 단편화가 발생할 가능성이 높아진다.
각 블록은 헤더와 같은 메타데이터를 가지고 있어서 할당된 상태와 크기 등을 추적할 수 있다. 이는 메모리 누수를 방지하고 할당 및 해제를 효율적으로 관리할 수 있게 해준다.
할당하는 블럭의 크기를 고정할 경우 블럭의 크기가 클 때와 작을때, 각각의 장단점을 논하시오.
큰 블록은 외부 단편화를 감소시키고 할당 및 해제 오버헤드를 줄일 수 있지만, 내부 단편화와 메모리 낭비가 발생할 수 있다. 작은 블록은 내부 단편화를 감소시키고 메모리를 절약할 수 있지만, 외부 단편화와 할당 및 해제 오버헤드가 증가할 수 있다.
"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를 구현하기 어려움.