반응형

프로그램이 실행되기 위해서는 프로그램이 메모리에 load 되어야 하며
프로그램에서 사용될 변수들을 저장할 메모리도 필요하다.

 

https://gabrieletolomei.wordpress.com/miscellanea/operating-systems/in-memory-layout/

  • OS Kerner Space : 드라이버 설치
  • Stack : 지역변수, 매개변수
  • Free 여유공간
  • Heap : 동적 메모리(new)
  • BSS : 초기화되지 않은 변수
  • Data : 전역 변수, static변수
  • Text : 상수, 코드

스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당,
힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.

Stack 영역과 Heap영역이 넘쳐서 서로 만나면 스택 오버플로(Stack Overflow) 현상이 발생하게 된다.

1. 스택(Stack) 영역

메모리의 스택 영역은 프로세스의 메모리 공간을 관리하기 위한 알고리즘들 중 하나이다. 이 영역은 함수 안에서 선언된 지역변수, 매개변수, 리턴 값, 돌아올 주소 등등이 저장되고 함수 호출 시 기록하고 종료되면 제거한다. 기록하고 종료하는 메커니즘은 자료구조에서 배운 후위 선출(LIFO) 방식을 따른다.

컴파일 타임에 크기가 결정되기 때문에 무한히 할당할 수 없다. 재귀 함수가 너무 깊게 호출되거나 함수가 지역변수를 너무 많이 가지고 있어 stack 영역을 초과하면 stack overflow 에러가 발생한다.

2. 힙(Heap) 영역

메모리의 힙 영역은 프로그래머가 필요할 때마다 사용하는 메모리 영역이다. Code, Data, Stack 영역과는 다르게 Heap은 런타임에 결정된다. 프로그래머는 malloc, calloc으로 Heap 영역의 메모리를 사용할 수 있다. 데이터 배열의 크기가 확실하지 않고 변동이 있을 때 Heap 영역을 활용해서 메모리를 할당한다. 즉, 힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다. 단 사용하고 난 다음에는 반드시 해제해야 하며, 그렇지 않으면 memory leak이 발생한다.

스택보다 할당할 수 있는 메모리 공간이 많다는 것이 장점이지만 포인터로 메모리 영역을 접근해야 하기 때문에 다른 자료구조에 비해서 데이터를 읽고 쓰는 게 느리다.

 

3. 데이터(Data) 영역

메모리의 데이터 영역은 프로그램의 전역(global) 변수와 정적(static) 변수가 저장되는 영역이다. 데이터 영역은 포르그램의 시작과 함께 할당되며 프로그램이 종료되면 소멸한다.

 

4. Text(Code) 영역

메모리의 텍스트 영역은 실행할 프로그램의 코드가 저장되는 영역으로 CPU에서 코드 영역에 저장된 명령어를 하나씩 가져가서 처리한다.

 

 

 

📚 참고

http://tcpschool.com/c/c_memory_structure

https://gabrieletolomei.wordpress.com/miscellanea/operating-systems/in-memory-layout/

반응형

+ Recent posts