본문 바로가기

빅데이터/개념 정리

메모리 구조에 대하여, 코드는 어떻게 실행되는걸까?

 

 

 

프로그램 실행(로드)


 

① 프로그램 실행을 요청(request)한다.

② 프로그램의 정보를 읽어 메모리에 로드(load)한다.

③ CPU는 프로그램 코드를 가져와 메모리를 관리하고 명령문(function, method)을 실행한다.

④ Heap: 동적 메모리가 할당되면 FreeStore 영역을 사용한다. (low memory -> high memory)

⑤ Stack: 동적 메모리가 할당되면 FreeStore 영역을 사용한다. (high memory -> low memory)

 

 

 

 

 

메모리 구조




프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드(load)되어야 한다.
또한, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요하다.

따라서 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 있다.
프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 다음과 같다.
 
 
1. 코드(code) 영역
2. 데이터(data) 영역
3. 스택(stack) 영역
4. 힙(heap) 영역

 

 

 

 

 





코드(code) 영역


실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code) 영역이라고도 부른다.
CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리한다.
실행파일을 구성하는 명령어들이 올라가는 메모리 영역 => 기계어로 제어한다.
hex, bin 파일

 

 

 


데이터(data) 영역



프로그램의 시작과 동시에 할당되며, 프로그램이 종료되면 소멸한다. 
전역변수(global), static 변수, array, 구조체(structure) 등 저장되는 영역이다. 
초기화 된 데이터는 data영역에 저장, otherwise 는 BSS(Blocked Stated Symbol)로 간다.
여기서 BSS 영역은 Data 영역과 비슷하지만 초기화되지 않은 전역변수, 즉 static 변수만 저장한다.
함수 내부에 선언된 static 변수는 프로그램이 실행될 때 공간만 할당되고, 함수가 실행되어야 초기화된다.

 

 

 


힙(heap) 영역



사용자가 직접 관리할 수 있는 메모리 영역이다.

메모리 주소 값에 의해서만 참조되고 사용되며, 참조타입(Reference Type)에 대한 저장 공간이다.
힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
더 이상 해당 힙 영역을 참조하는 변수가 없을 경우 소멸되며, free() 함수로 나중에 할당했던 영역을 반납해야 한다.


 

 

 

 

 

스택(stack) 영역


 

함수의 호출과 관계되는 지역 변수와 매개변수, return 값 등이 저장되는 영역이다. 
스택 영역은 프로그램이 자동으로 사용하는 임시 메모리 영역이기 때문에 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다. 
이렇게 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 한다. 

스택 사이즈는 각 프로세스마다 할당한다. 
하지만 프로세스가 메모리에 로드될 때 사이즈가 고정되어 있어 런타임 시 변경은 불가능하다. 
Heap과 Stack은 사실 같은 공간을 공유하지만 시작지점이 다르다. 

 

 

(출처: http://goo.gl/56LNV9)

 


Heap은 메모리 위쪽 주소부터 할당(낮은 주소 -> 높은 주소)한다. 
Stack은 아래쪽부터 할당(높은 주소 -> 낮은 주소)한다. 

이렇게 할당되다가 서로 겹치는 것을 Stack/Heap Overflow라고 한다. 

스택 영역은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출한다. 
이러한 스택은 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출된다.