본문 바로가기
운영체제

메모리 구조 (코드, 데이터, 힙, 스택 영역)

by Deeppago 2022. 1. 26.

단순히 코딩만 하던 지난날을 반성하며, 더 좋은 엔지니어가 되기 위해 기초부터 이해하며 정리해보려고 한다.

 

-목차-

1. 메모리

2. 코드(code)영역

3. 데이터(data) 역역

4. 힙(heap) 영역

5. 스택(stack) 영역

6. 오버 플로우

7. 코드 예시

 


1. 메모리

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

프로그램의 실행은 두가지 중요한 의미를 가진다.

  • 파일 시스템에 존재하던 실행파일이 메모리에 적재된다는 의미
  • 프로그램이 CPU를 할당받고 명령을 수행하고 있는 상태

파일 시스템에 있는 실행 파일이 메모리에 적재될 때, 실행파일 전체가 메모리에 올라가지 않는다. 일부분만 메모리에 올라가고 나머지는 디스크의 특정역역인 스왑 영역에 존재한다.

참고 : 스와핑(Swapping)

 

이와 같이 실행중인 프로그램을 프로세스라고 하는데 프로세스는 메모리와 CPU의 자원을 할당받는다.

 

운영체제로부터 할당받은 프로세스의 메모리 주소 공간은 코드(code), 데이터(data), 힙(heap), 스택(stack) 영역으로 구분된다. 이러한 주소 공간을 가상 메모리 (또는 논리적 메모리 : logical memory)라고 부른다.

 


2. 코드(code) 영역

  • 코드 영역은 실행할 프로그램의 코드가 CPU에서 수행할 수 있는 기계어로 변환되어 저장되는 영역이다.
  • 컴파일(compile) 타임에 결정된다.
  • 중간에 코드를 변경할 수 없게 Read-Only인 영역이다.
  • 텍스트 영역이라고 부르기도 한다.
  • 프로그램이 시작하고 종료될 때 까지 메모리에 계속 남아있는다.

 


3. 데이터(data) 영역

  • 데이터 영역은 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역이다.
  • 프로그램의 시작과 함께 할당되며 프로그램이 종료되면 소멸한다.
  • 전역 변수 또는 static 값을 참조한 코드는 컴파일이 완료되면 data 영역의 주소값을 가리키도록 바뀐다.
  • 전역 변수가 변경 될 수도 있어 Read-Wirte가 가능하다.

 


4. 힙(heap) 영역

 

  • 힙 영역은 프로그래머가 직접 공간을 할당, 해제하는 메모리 공간이다.
  • 힙 영역에서 malloc() 또는 new 연산자를 통해 메모리를 할당하고, free() 또는 delete 연산자를 통해 메모리를 해제한다.
  • heap 영역은 런타임에 결정된다. 자바에서는 객체가 heap영역에 생성되고 GC에 의해 정리된다.
  • 이 공간에 메모리 할당하는 것을 동적 할당(Dynamic Memory Allocation)이라고도 부른다.
  • 런타임 시에 크기가 결정된다.

 


5. 스택(stack) 영역

  • 호출된 함수의 수행을 마치고 복귀할 주소 및 데이터(지역변수, 매개변수, 리턴값 등)를 임시로 저장하는 영역이다.
  • 함수 호출 시 생성되는 지역 변수와 매개변수가 저장되는 영역이므로, 함수 호출이 완료되면 사라진다.
  • 후입 선출(LIFO, Last-In First-Out) 의 방식을 따른다. (재귀 함수를 예로들면 가장 마지막에 호출된 함수가 가장 먼저 반환값을 가진다.)
  • 재귀함수가 반복해서 호출되거나 함수의 지역변수가 메모리를 초과할 정도로 너무 많아지게 되면 stack overflow가 발생한다.

 


6. 오버 플로우

  • 오버 플로우는 힙 오버 플로우와 스택 오버 플로우가 있다.
  • 힙은 메모에서 낮은 주소부터 큰 주소로 할당되고, 스택은 메모리의 큰 주소부터 낮은 주소로 할당되기 때문에 각 영역이 상대 공간을 침범하는 일이 발생할 수 있다.
  • 이때 힙이 스택을 침범하는 경우를 힙 오버 플로우라 하고, 스택이 힙을 침범하는 경우를 스택 오버 플로우라고 한다.
  • Stack 영역이 크면 클 수록 Heap 영역이 작아지고, Heap 영역이 크면 클수록 Stack 영역이 작아진다.

 


7. 코드 예시

 

위 이미지처럼 상수, 함수는 Text 영역에, 전역, 정적변수는 Data 영역에, 지역변수들은 Stack 영역에, 동적할당이 되는 변수들은 Heap영역에 위치하게 된다. (참고로 malloc 함수는 런타임(실행중)에 메모리를 동적으로 할당할 수 있는 함수이다.)

 


참고 자료

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

https://jinshine.github.io/2018/05/17/%EC%BB%B4%ED%93%A8%ED%84%B0%20%EA%B8%B0%EC%B4%88/%EB%A9%94%EB%AA%A8%EB%A6%AC%EA%B5%AC%EC%A1%B0/

https://st-lab.tistory.com/198

https://zangzangs.tistory.com/107

댓글