대범하게

[Malloc-lab] malloc, calloc, realloc, free, brk, sbrk, mmap 기본 개념 정리 본문

SW사관학교 정글/Malloc-lab

[Malloc-lab] malloc, calloc, realloc, free, brk, sbrk, mmap 기본 개념 정리

대범하게 2022. 11. 2. 03:01
반응형

💡malloc, calloc, realloc, free, brk, sbrk, mmap💡

 

1. malloc()

함수 원형 : void *malloc(size_t size)

기능: 메모리 동적 할당

헤더: <stdlib.h>

매개변수: size_t size 메모리의 크기

리턴값: 성공 => 할당한 메모리의 첫 번째 주소, 실패 => NULL

#include <stdlib.h>
void *malloc(size_t size);
// Returns: pointer to allocated block if OK, NULL on error
int *arr;
arr = (int *)malloc(sizeof(int)*5); // 배열 5개, 총 20바이트로 할당함

2. calloc()

함수 원형 : void *calloc(size_t count, size_t size)

기능: malloc과 다른 점은, 할당된 공간의 값을 모두 0으로 초기화시켜준다.

헤더: <stdlib.h>

매개변수 1: size_t count 메모리의 갯수

매개변수 2: size_t size 메모리의 크기

리턴값: 성공 => 할당한 메모리의 첫 번째 주소, 실패 => NULL

int *arr;
arr = (int *)calloc(5, sizeof(int));

3. realloc()

함수 원형 : void *realloc(void *ptr, size_t newsize)

기능: 이미 할당된 메모리의 크기를 변경함

헤더: <stdlib.h>

매개변수 1: void *ptr 이미 할당된 포인터 변수

매개변수 2: size_t newsize 바꾸고 싶은 메모리의 크기

리턴값

realloc(arr, sizeof(int) *10); // arr의 메모리를 40바이트로 재할당함

4. free()

함수 원형 : void free(void *ptr)

기능: 메모리 해제

- 메모리를 동적 할당하면 힙에 공간이 생기고, 이 공간은 프로그램이 종료될 때까지 존재한다.

- 따라서 메모리를 할당만 하고 해제를 하지 않으면 사용하지는 않는데 메모리 사용량만 계속 증가해서 메모리 누수가 발생한다.

(회수하지 않으면 프로그램이 실행되는 동안 그 공간은 계속해서 살아있고 이는 메모리의 낭비를 초래하여 성능 부하를 일으킬 수 있다. 따라서 꼭  free를 통해 회수해야한다.)

- 주소 ptr은 무조건 malloc, calloc, realloc에서 먼저 할당받은 상태여야한다. 

헤더: <stdlib.h>

매개변수: void *ptr 해제하고자 하는 메모리의 포인터

#include <stdlib.h>
void free(void *ptr);
// Returns: Nothing

 

About System call

더보기

시스템 콜(System call)

시스템 콜은 응용 프로그램이 OS(특히 커널)가 제공하는 서비스에 접근하기 위한 상호작용이다.

 

운영체제의 두 가지 모드

운영 체제, 특히 커널은 메모리나 하드웨어 등 중요한 컴퓨터 시스템 자원을 관리한다. 따라서 운영체제는 사용자가 중요 자원에 접근 할 수 없도록 두 가지 모드를 구분한다.

 

- 유저 모드

: 사용자가 응용 프로그램(사용자 코드)을 실행하는 모드

유저(사용자)가 접근할 수 있는 영역을 제한적으로 두고, 메모리나 하드웨어 등 프로그램의 자원에 함부로 침범하지 못하는 모드

 

- 커널 모드

: 운영체제 코드를 실행. 모든 컴퓨터 하드웨어 자원에 접근할 수 있다. 

컴퓨터 환경에서 치명적 영향을 끼칠 수 있는 명령을 특권 명령이라고 하는데, 특권 명령은 오로지 커널 모드에서만 실행된다. 따라서 유저 모드에서는 상대적으로 안전하게 작업할 수 있는 것이다. 이를 Dual-Mode Operation이라 한다. 

 

만약 응용 프로그램이 하드웨어 등 시스템 자원을 활용하고 싶다면, 무조건 시스템 콜을 OS에 보내 커널의 서비스를 이용해야 한다. 만약 시스템 콜이 호출되면 프로그램은 유저 모드에서 커널 모드로 전환(Context Switching)되고, 명령 수행이 끝나면 다시 유저 모드로 복귀(Context Switching)한다. 

5. brk(), sbrk(), mmap()

brk, sbrk 시스템콜은 malloc 함수와 같은 메모리 할당을 요청할 때 사용되는 시스템 콜이다. malloc 함수를 실행 후 실제 메모리를 할당받기 위해선 brk, sbrk 또는 mmap 시스템콜을 수행해야한다.

Reference 

About brk(), sbrk(), mmap()

: https://velog.io/@ngngs/%ED%95%9C-%EC%9E%A5%EC%9C%BC%EB%A1%9C-%EC%A0%95%EB%A6%AC%ED%95%98%EB%8A%94-Malloc-Lab-%EA%B8%B0%EC%B4%88-%EB%8B%A4%EC%A7%80%EA%B8%B0

Comments