메모리 관리 API
핵심 질문: 어떻게 메모리를 할당하고 관리해야 하는가
UNIX/C 프로그램에서 메모리를 할당하고 관리하는 방법을 이해하는 것은 강력하고 안정적인 소프트웨어를 구축하는데 중요하다. 일반적으로 어떤 인터페이스가 사용되는가.
메모리 공간의 종류
- C 프로그램이 실행되면. 스택, 힙 메모리 공간이 할당됨
- 스택: 함수의 지역 변수, 인자 값들이 저장되고 함수가 반환되면 메모리도 반환됨
- 힙: 모든 할당과 반환이 프로그래머에의해 명시적으로 처리됨
malloc() 함수
- 힙에 요청할 공간의 크기를 넘겨주고, 성공했을 때 공간에 대한 포인터, 실패했을 때 NULL 반환
double *d = (double *) malloc(sizeof(double));
- malloc() 호출에서 정확한 크기의 공간을 요청하기 위해 sizeof() 연산자를 사용함. C 언어에서 이 sizeof() 는 통상 컴파일 연산자임. 인자의 실제크기가 컴파일 시간에 결정됨
int *x = malloc(10 * sizeof(int));
printf(“%d\n ”, sizeof(x));
// 32비트 연산자에서 4, 64비트 연산자에서 8 출력
- 문자열을 위한 공간을 선언할 때는 다음과 같은 문장을 사용함 malloc(strlen(s) + 1) 이는 strlen() 함수를 사용하여 문자열의 길이를 얻어낸뒤 문자열-끝을 나타내는 문자를 위한 공간을 확보하기 위해 1을 더 더해주는 것임
- malloc() 은 void 타입에 대한 포인트를 반환하고 해당 주소공간에 어떤 타입의 자료를 저장할 지는 프로그래머가 결정하게 함
- 캐스팅은 실제 무언가는 하지 않고, 컴파일러와 다른 프로그래머에게 알려주는 것임
free() 함수
- 메모리 할당은 해제보다 상대적으로 쉬움, 더 이상 사용되지 않는 힙 메모리를 해제하기 위해 프로그래머는 free() 를 호출함
- 많은 루틴은 자신이 호출되기 전에 필요한 메모리가 미리 할당되었다고 가정함, 예를들어 strcpy(dst, src) 루틴은 소스 포인터에서 목적 포인터로 문자열을 복사하지만 주의하지 않으면, 다음과 같이 코드를 작성할 수 있음
char *src =“hello ”;
char *dst; // ᦥᐵ ⧁ݚ ᯕᦩ ࡹᨕ ᯩօ
strcpy(dst, src); // segfault ə리Ł ᵞ۵݅
흔한 실수들
- 할당받은 메모리 초기화 하지않기
- 메모리 해제하지 않기
- 메모리 사용이 끝나기 전에 메모리 해제
- 반복적으로 메모리 헤제
'운영체제' 카테고리의 다른 글
[OSTEP-16] Segmentation (1) | 2023.12.26 |
---|---|
[OSTEP-15] Address Translation (1) | 2023.12.26 |
[OSTEP-13] Address Spaces (1) | 2023.12.26 |
[OSTEP-10] Multi-CPU Scheduling (1) | 2023.12.26 |
[OSTEP-9] Lottery Scheduling (0) | 2023.12.26 |