동적 메모리 할당(Dynamic Memory Allocation)란?

프로그램 실행 중에 필요한 크기의 메모리를 확보하고, 다 쓰면 해제하는 것. C 언어에서는 malloc(크기)으로 확보하여 첫 주소를 받고, free(주소)로 해제한다. calloc은 0으로 초기화한 영역을, realloc은 크기를 바꾼 영역을 반환한다. 확보에 실패하면 NULL이 반환되므로 확인해야 한다. 영역은 힙에 놓이며, 해제할 때까지 함수에서 돌아가도 남는다. 작은 마이컴에서는 단편화나 확보에 걸리는 시간을 예측하기 어렵기 때문에 피하는 경우가 많다.

일본어 명칭: 動的メモリ確保

동적 메모리 할당(Dynamic Memory Allocation)은(는) C 언어 기초, 링커, 로더, 실행 파일, 임베디드 시스템과 펌웨어 등 4개 분야의 연습 문제 7개에 나와요.

분야: C 언어 기초

도전해 보기: 동적 메모리 할당(Dynamic Memory Allocation) 관련 문제

C 언어의 malloc으로 확보한 메모리는 일반적으로 프로세스의 어느 영역에서 가져옵니까?

  1. A.text 섹션
  2. B힙
  3. C.rodata 섹션
정답과 해설 보기

정답: B. 힙

힙은 프로그램 실행 중에 필요한 크기의 메모리를 확보하고, 필요 없어지면 free로 반환하는 영역입니다. 확보하는 크기나 수명을 실행 시에 정할 수 있는 것이 특징입니다. malloc은 스스로 빈 영역을 관리하고, 부족해지면 OS에 요청하여 영역을 넓힙니다(Linux에서는 brk나 mmap 시스템 콜). free를 잊으면 쓰지 않는 메모리가 계속 남는 메모리 누수가 됩니다.

malloc과 free를 반복하는 동안, 빈 메모리의 합계는 충분한데도 큰 영역을 한꺼번에 확보할 수 없게 되는 경우가 있습니다. 이 현상을 무엇이라고 합니까?

  1. A메모리 누수
  2. B단편화(프래그멘테이션)
  3. C스택 오버플로
정답과 해설 보기

정답: B. 단편화(프래그멘테이션)

크기가 다른 영역의 확보와 해제를 반복하면 사용 중인 영역 사이에 작은 빈 공간이 흩어집니다. 빈 공간의 합계가 크더라도 이어진 큰 빈 공간이 없으면 큰 확보에 실패합니다. 이를 단편화라고 부릅니다. 메모리 할당기는 크기별로 나누어 관리하거나 이웃한 빈 공간을 합쳐 단편화를 줄입니다. 오래 계속 동작하는 임베디드 기기에서는 특히 주의가 필요합니다.

해설 속 동적 메모리 할당(Dynamic Memory Allocation)

동적 메모리 할당(Dynamic Memory Allocation)이(가) 나오는 문제 (7)

  1. C 언어의 malloc으로 확보한 메모리는 일반적으로 프로세스의 어느 영역에서 가져옵니까?
  2. malloc과 free를 반복하는 동안, 빈 메모리의 합계는 충분한데도 큰 영역을 한꺼번에 확보할 수 없게 되는 경우가 있습니다. 이 현상을 무엇이라고 합니까?
  3. 작은 마이크로컨트롤러의 펌웨어에서 malloc 등의 동적 메모리 할당을 피하는 경우가 많은 이유로 올바른 것은 무엇입니까?
  4. C 언어에서 (1) 함수 안에서 static을 붙이지 않고 선언한 지역 변수, (2) malloc으로 확보한 영역, (3) 함수 밖에서 선언한 변수가 각각 존재하는 기간(수명)의 조합으로 올바른 것은?
  5. Linux의 NUMA 시스템에서 흔히 쓰이는 퍼스트 터치 정책(처음 페이지에 쓴 스레드가 실행 중인 노드의 메모리에 그 페이지를 배치)에서 주의할 점으로 올바른 것은 무엇입니까?
  6. fill과 use는 따로 정의된 함수로 한다. 위의 함수의 문제점으로 올바른 것은?
  7. 위의 함수 make가 반환하는 포인터에 대해 올바른 것은?

관련 용어

메모리 누수(Memory Leak) 변수(Variable) 스택(Stack) 포인터(Pointer) 시스템 콜(system call) 단편화(Fragmentation) 마이컴(마이크로컨트롤러) 힙(Heap) NUMA 페이지 폴트(page fault)

용어집으로 돌아가기