프로그래밍 언어를 이해하던, 운영체제나 컴퓨터 구조와 같은 CS지식을 공부하던 메모리 구조에 관한 이해는 필수불가결하다.
앞으로도 자주 언급할 것 같아 미리 정리해 둔다.
잘못된 정보가 있다면 언제나 날카로운 지적 부탁드립니다!
컴퓨터의 메모리는 사용에 따라 4개 이상의 영역으로 구분된다.
위 그림은 컴퓨터 메모리 내부에 프로그램이 어떻게 저장되는지를 나타낸 그림이다.
보는 것과 같이 메모리 저장은 크게 Instructions(code)영역, Literals 영역, Static Data 영역, Heap 영역, Stack 영역으로 구분된다.
프로그램의 동작을 위해서는 CPU가 각각의 프로그램 코드, 즉 명령어를 읽어와 해당 명령을 실행하여야 한다. 이 때 프로그램의 코드가 저장되어 있는 공간이 Instructions 영역이다.
운영체제는 이 영역에서 PC(Program count) 값에 들어있는 주소로 이동해 실행시킬 명령어를 가지고 온다.
만약, 여러분이 다음과 같은 코드를 작성하여 실행 시킨다고 해보자.
#include <stdio.h>
int main(){
int x = 5;
printf("%d", x);
return 0;
}
당연히 결과값은 x에 들어있는 5가 출력이 될테고,,,,
그럼 x에 들어가는 5는 어디서 가져오는 걸까?
이처럼, 변하지 않는 고유의 값을 가진 데이터들이 이 Literals 영역에 저장되어 있다.
예를 들면, 숫자 1
, 알파벳 a
처럼!
이곳에서는 프로그램이 시작함과 동시에 할당되는 값들이 저장이 된다.
가장 대표적인 예는 전역변수!
전역변수는 프로그램이 실행 됨과 동시에 메모리에 값이 저장이 되며, 이 때 메모리의 static 영역에 저장이 된다.
비슷한 예가 static 변수이다.
지금 설명하는 stack 영역과 다음에 설명할 Heap 영역은 둘다 동적으로 할당되는 데이터의 영역이다.
때문에 메모리 영역의 크기가 가변적이다.
stack 영역의 데이터들은 특정 함수 안의 값이라고 생각하면 된다.
다음의 예를 보자.
#include <stdio.h>
void PrintSum(int a, int b);
int main(){
int x = 2;
int y = 3;
printf("%d", x);
return 0;
}
void PrintSum(int a, int b){
int sum = a + b;
printf("%d", sum);
}
위의 예시에서 사용된 PrintSum 내부의 sum이라는 변수는 PrintSum이라는 함수가 호출이 되었을때만 존재하는 변수이다.
이처럼 특정 함수 내부에서만 존재하는 data들이 stack 영역에 저장이 된다.
그렇다면 main 함수 내부의 x, y는 어디에 저장이 될까??
이 역시 main 함수
내부에 존재하는 값들이며, 때문에 똑같이 stack 영역에 저장이 된다!
마지막으로 설명할 Heap 영역은 개발자가 직접 동적으로 할당하는 data들이 저장이 된다.
즉, C언어에서 malloc을 사용해 값을 할당하는 변수들이 이곳에 저장이 된다.
Stack 영역과 Heap 영역은 둘다 크기가 가변적인 영역들이기에 어떤 상황에서는 Stack 영역의 크기가 훨씬 클 것이고, 또 어떤 경우에는 Heap의 크기가 훨씬 클 것이다.
때문에 이 동적인 영역들을 효율적으로 사용하기 위해 Stack 영역과 Heap 영역은 데이터가 커지는 방향이 서로 반대방향이다.