메모리 구조

메모리 구조

당신이 프로그램을 실행하면, 그 프로그램은 메모리 위에 올려진다. 이 올리는 역할은 운영체제가 하며, 보통 ‘운영체제가 할당한다’라는 표현을 쓴다. (컴퓨터 대부분에서, 이 ‘메모리’는 램을 의미하나, swap과 같은 기술을 통해 아닌 경우도 존재한다..)
운영체제가 할당하는 메모리의 영역은 크게 다음과 같이 나눠 볼 수 있다.
  1. 코드(Code) 영역: static
  2. 데이터(Data) 영역: static
  3. 힙(Heap) 영역: dynamic
  4. 스택(Stack) 영역: dynamic
메모리에도 주소가 있는데, 위의 내용은 낮은 주소부터 높은 주소까지 순서대로 나열한 결과이다.
본격적인 설명에 들어가기에 앞서 두 가지의 카테고리를 알아두어야 할 필요가 있다. 바로 static과 dynamic이다.
static(정적)으로 분류되는 영역은 당신이 코드를 컴파일하면 그 시간에 정적으로 할당되는 영역이다. dynamic(동적)으로 분류되는 영역은 프로그램이 실행 중에 동적으로 할당되는 영역이다.

1. 코드 영역

텍스트(Text) 영역이라고도 불리는 이 영역은 실행할 프로그램의 코드가 저장되는 공간으로서, 만약 당신이 작성한 C 코드를 실행한다면 이곳에 컴파일러가 기계어로 번역해 준 당신의 코드가 있을 것이다. CPU는 이 영역에 있는 코드(명령어)를 하나씩 가져가서 처리하게 된다 Read-Only(읽음 전용) 변수 또한 저장된다.

2. 데이터 영역

영역 이름 그대로, 데이터가 저장되는 영역이다. 여기서 말하는 데이터란 전역변수, 정적변수, 배열, 구조체 등이 있겠다. 프로그램이 실행될 때 생성되며, 종료 시 시스템에 반환된다. 함수 안에 선언된 static(정적) 변수는 프로그램이 실행될 때 공간만 할당되며, 함수가 실행될 때 초기화된다. (여기에서 static은 코드 내의 정적 변수를 말하며, 메모리 위에서 말한 메모리 카테고리와는 관련이 없다)

3. 힙 영역

메모리 주소 값에 의해서만 참조되는 영역으로서, 코드 실행 중 필요 때문에 메모리를 추가로 할당하고자 할 때 사용된다. 흔히 말하는 ‘메모리 누수’가 이 힙 영역을 관리해 주지 않아서 일어나며, C언어에서 malloc() 함수를 통해 생성할 수 있다.

4. 스택 영역

프로그램이 자동으로 사용하는 임시 메모리 영역이다.
함수의 인자값, 지역변수, 반환(return) 값 등이 저장되며, 스택의 크기는 프로그램마다 할당되지만, 프로그램이 로드될 때 크기가 고정되어서 실행되고 있는 도중에 크기의 변경이 불가능하다.
이 공간에서는 push 동작으로 데이터를 저장하고 pop 동작으로 데이터를 꺼내오는데 비유하자면 다음과 같다. 당신이 설거지하고 있고, 설거지가 끝난 그릇을 한곳에 쌓는다고 가정해보자. 이때, ‘그릇을 쌓는 행위’는 push 동작이고, ‘그릇을 꺼내는 행위’는 pop 동작이다. 그렇다 보니, pop을 하게 되면 가장 최근에 push 한 데이터를 받을 것이다.
위의 push/pop과 같은 명령을 실행해야 하다 보니 자동으로 증가 / 감소 하므로 보통 메모리의 마지막 번지에 지정하곤 한다.

Comments

Popular Posts