프로그램이 실행되기 위해서는 운영체제(OS)가 프로그램의 정보를 메모리에 로드해야 한다. 

그리고 CPU가 프로그램 코드를 가져다가 실행시킨다. 

출처 - https://all-young.tistory.com/17

위 그림과 같이 프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은

코드, 데이터, 힙, 스택영역으로 구성되어 있다.


코드 영역

코드 영역은 말 그대로 실행할 프로그램의 코드가 저장되는 영역으로 

텍스트 영역이라고 부르기도 한다.

프로그램이 시작하고 종료될 때까지 메모리에 계속 남아있는다.

 

데이터 영역

프로그램의 전역 변수와 정적 변수가 저장되는 영역이다.

프로그램의 시작과 함께 할당되며 프로그램이 종료되면 소멸한다.

 

힙 영역

프로그래머가 직접 공간을 할당하는 동적 할당 공간이다.

특정 명령어를 통해 메모리를 할당하거나 메모리를 해제할 수 있다.

힙 영역은 선입선출(FIFO, First-In First-Out) 방식으로, 가장 먼저 들어온 데이터가

가장 먼저 인출된다. 이는 힙 영역이 메모리의 낮은 주소에서 높은 주소의 방향으로

할당되기 때문이다. 즉, 낮은 주소에서 높은 주소 방향으로 데이터가 쌓인다.

힙 영역에서 malloc() 또는 new 연산자를 통해 메모리를 할당하고 free() 또는 

delete 연산자를 통해 메모리를 해제한다.

 

스택 영역

스택 영역은 프로그램이 자동으로 사용하는 임시 메모리 영역이다.

함수 호출 시 생성되는 지역변수와 매개 변수가 저장되는 영역이고 

함수 호출이 완료되면 사라진다.

이때 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 한다.

스택 영역에서 push로 데이터를 저장하고, pop으로 데이터를 가져온다.

스택 영역은 후입 선출(LIFO, Last-int First-Out) 방식으로, 가장 나중에 들어온 데이터가

가장 먼저 인출된다. 이는 스택 영역이 메모리의 높은 주소에서 낮은 주소 방향으로

할당되기 때문이다. 즉, 높은 주소에서 낮은 주소 방향으로 데이터가 쌓인다.


명령어 레지스터에는 

cpu가 처리하는 데이터를 임시로 저장하는 데이터 레지스터

기억장치를 액세스할 주소를 저장하는 주소 레지스터

주소 레지스터 혹은 데이터 레지스터로 사용될 수 있는 범용 레지스터가 있다.

 

그중에서 주소 레지스터는 포인터 레지스터라고도 불린다.

주소 레지스터는 스택 포인터(sp, Stack Pointer), 베이스 포인터(bp, Base Pointer)

인스트럭션 포인터(ip, Instruction Pointer)가 있다.

 

메모리 구조 중 스택은 레지스터의 데이터를 임시로 저장하기에 아주 적합한 구조를 가지고 있다. 

 

sp는 스택의 데이터가 채워진 마지막 위치를 가리킨다.

스택이 쌓일때 마다 sp의 값이 1씩 증가한다.

스택이 사용하지 않는 공간에는 쓰레기 값(Grabage)으로 채워진다.

 

bp는 sp의 기준점을 저장하는 레지스터이다. 

 

ip는 다음 명령어의 위치를 저장하는 레지스터이다. 

pc(Program Counter)라고도 불린다.

 

+ Recent posts