프로세스 주소 공간
프로세스는 자원을 할당받아 프로그램이 실행되고 있는 상태 인스턴스이다.
프로세스는 독립된 메모리 영역을 할당받고, 효율적으로 사용할 수 있도록 구조화하여 관리한다.
이를 프로세스 주소 공간 이라고 한다.
프로세스 주소 공간 구조
할당된 메모리 영역은 아래와 같이 Code , Data, Heap, Stack 영역으로 구분된다.
텍스트(Text) 영역 (코드 영역)
•
코드를 실행하기 위한 영역으로 프로그램을 실행시키기 위한 구성인 명령문들이 저장된다.
•
제어문 , 함수 , 상수 들이 포함된다.
•
CPU가 해석 가능한 기계어로 저장되고, 프로그램이 수정되면 안되므로 ReadOnly 상태로 저장되어 있다.
데이터(Data) 영역
•
코드의 전역변수, 정적변수 등이 저장되는 공간이다.
•
Stack에 저장되는 변수들과 비교하면, main 함수가 실행되는 동안 메모리 상에 남아있는 변수들을 저장한다는 차이점이 있다.
•
데이터 영역은 크게 초기화된 데이터 영역(initialized data segment) 과 초기화 되지 않은 데이터 영역(uninitialized data segment) 로 나뉜다.
힙(Heap) 영역
•
사용자에 의해 공간이 동적으로 할당 및 해제되는 동적 메모리 할당 영역이다.
•
따라서 런타임에 크기가 결정된다.
•
언어마다 차이가 있지만, 주로 참조형 데이터(Class 등)의 데이터가 할당된다.
•
낮은 주소에서 높은 주소로 적재된다.
•
Heap 메모리 영역을 넘어서 할당하면 Heap Overflow 가 발생한다.
스택(Stack) 영역
•
스레드의 함수, 지역변수, 매개변수들이 저장된다.
•
그리고 함수가 종료되면, 해당 함수에 할당된 변수들은 메모리에서 해제된다.
•
높은 주소에서 낮은 주소로 할당된다.
•
Stack 메모리 영역을 넘어서 할당하면 Stack Overflos 가 발생한다.
각 영역은 저장하는 데이터의 특성에 따라 효율적으로 관리하기 위해 구분되었음을 알 수 있다.
Code 영역의 경우 변경되지 않는 기계어 코드를 Read-Only 상태로 저장해야 한다.
Data 영역과 Stack 영역을 구분한 이유는,
Data 영역에 전역변수의 자원을 따로 저장하고, Thread들이 공유하도록하여 효율성을 높이고,
함수와 지역 변수 등은 각 스레드마다 공간을 할당한 Stack 구조로, 사용이 종료됨에 따라 해제하는 등의 제어에 용이하다.
프로세서는 Code , Data, Heap, Stack 의 메모리 영역을 독립적으로 할당 받지만, 그에 속해있는 프로세스는 Stack만을 각각 할당받고, 다른 영역은 공유한다고 했다.
그림으로 살펴보면