[Cpp] Memory Model

Tay (Taewan) Ham·2023년 10월 27일
0

cpp

목록 보기
1/2
Hanjun, Kim (Spring 2023)

C/C++ 프로그램이 실행되기 위해서는 우선, 메모리에 load가 되어야 한다.
운영체제는 메모리의 영역을 구분하여 할당해준다. 메모리는 크게 4가지의 영역으로 구분할 수 있다. 아래의 목록은 high memory - low memory 순서로 쓴 것이다.

  • Stack
  • Heap
  • Data
  • Text / Shared Libraries

Stack

Stack에는 주로 지역변수, 매개변수 등이 저장된다. 함수가 호출되면, stack도 운영체제로부터 할당된다.

Stack이 어디까지 사용되었는지는 stack pointer가 저장하고 있다. Stack pointer는 compiler가 관리한다. 사실, stack에는 stack pointer 외에 한개의 pointer가 더 있는데, frame pointer가 그것이다.

Frame pointer는 함수가 호출되기 직전의 stack pointer의 값이다. 함수 호출이 종료되면, frame pointer의 값을 기준으로 stack pointer를 재조정한다. 이 두개의 pointer를 구별하는 이유는, stack pointer가 runtime에서 값이 변하는 경우가 많아 function frame의 위치를 찾기 힘들기 때문이다. RISC-V의 경우, stack pointer는 x2 register에 저장되고, frame pointer는 x8 register에 저장된다.

Stack이 데이터를 저장하는 방식은 LIFO(Last In First Out)이다. 즉, 가장 마지막으로 저장된 데이터가 가장 먼저 나온다. Stack에 데이터를 넣는 것은 push, 빼는 것은 pop이라고 한다.

Heap

Heap에는 user가 자신이 원하는대로 할당할 수 있는 메모리 영역이다.
User에 의해 동적(dynamically)으로 할당 및 해제할 수 있다. 다른 메모리 영역과는 다르게 runtime에서 그 크기가 정해지며, user가 heap 영역을 할당받는 것을 동적 할당(dynamic allocation)이라고 한다.

주로, C++에서는 malloc(), calloc(), new()를 통해 heap을 할당할 수 있다.
User가 직접 할당하고 해제하는 만큼, heap 영역을 사용 할 때는 주의해야 한다. 예컨대, free()를 통해서 할당받은 heap 영역을 운영체제에게 반납해야 한다.
만약, 정신차리지 않고 무분별하게 heap에 계속 할당한다면, Memory leak가 발생할 수 있다. 이런 불상사가 일어나지 않도록 동적할당을 했다면 free() 등을 통해 다시 반납할 수 있도록 습관을 들여야 한다.

Data

Data에서는 전역변수(global variable)나 정적변수(static variable)이 저장된다. 이 영역의 경우, 프로그램이 시작되면 할당이 되고, 프로그램이 종료되면 해제되다.

Text / Shared Libraries

Text/Shared Libraries 영역(때로는 Code 영역이라고도 한다)에는 프로그램의 코드가 저장된다. CPU는 여기에 저장된 코드들을 한줄씩 불러와서 실행한다. 정확히 말하자면, Machine instruction으로 전환된 코드들이 저장된다.

Example

아래와 같은 임의의 C++ 코드가 있다고 해보자.

char big_array[1L<<24]; // 16MB
char huge_array[1L<<31];  // 2GB

int global = 0;
int useless() { return 0; }

int main() {
	void *p1, *p2, *p3, *p4;
    int local = 0;
    p1 = malloc(1L << 28);
    p2 = malloc(1L << 8);
    p3 = malloc(1L << 32);
    p4 = malloc(1L << 8);
	return 0;
}

여기서 어떻게 메모리가 할당되는지 살펴본다면, 아래의 표와 같다.

Memory-
Stacklocal
Heapp1, p2, p3, p4
Databig_array, huge_array
Textmain(), useless()

Reference

  • Hanjun Kim, Data Structure and Algorithms Lecture Note, "04. A Tour of C++: Memory", Yonsei university, Spring 2023

  • William J. Song, Computer Architecture Lecture Note, "2. Instructions", Yonsei universoty, Spring 2023

0개의 댓글