프로그램이 실행되면 프로세스 주소 공간이 Memory에 할당되어진다. 할당된 프로세스를 CPU가 실행시킨다.
프로세스는 4가지의 메모리 영역으로 구성되어 할당받는다.
1. 코드 영역 (TEXT)
프로그램 함수들의 코드를 CPU가 해석 가능한 기계어로 저장되어있다. 우리가 작성한 소스코드가 들어가는 부분이다.
코드 영역은 실행 파일을 구성하는 명령어들이 올라가는 메모리 영역으로 함수, 제어문, 상수 등이 여기에 지정된다. 컴파일 타임에 결정되고 중간에 코드를 바꿀 수 없게Read-Only
로 지정되어있다.
2. 데이터 영역 (DATA)
코드의 전역 변수나, 각종 데이터들이 모여있다. 프로그램이 구동되는 동안 항상 접근 가능한 변수가 저장되는 영역이다. 전역변수, static 값을 참조한 코드는 컴파일 하고 나면 Data 영역의 주소값을 가르키도록 바뀐다. 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다. 실행 중도에 전역변수가 변경 될 수도 있으니 이 영역은Read-Write
로 지정되어있다.
3. 스택영역 (STACK)
지역 변수와 같은 호출한 함수가 종료되면 되돌아올 임시적인 자료를 저장하는 독립적 공간이다. Stack은 함수의 호출과 함께 할당되고 완료되면 소멸한다. 컴파일 타임에 크기가 결정되기 때문에 무한히 할당 할 수 없다. 재귀함수가 너무 깊게 호출되거나 함수가 지역변수를 너무 많이 가지고 있어 stack 영역을 초과하면stack overflow
에러가 발생한다.
4. 힙 영역 (HEAP)
런타임에 크기가 결정되는 메모리 영역이다.
사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다. 참조형의 데이터의 값이 저장된다.
예를 들어 클래스, 클로저가 이 부분에 해당 된다.
Heap은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
최대한 데이터를 공유하여 메모리 사용량을 줄이기 위해
나눈다.
Code는 같은 프로그램 자체에서는 모두 같은 내용이기 때문에 따로 관리하여 공유한다.
예를들면 같은 프로그램을 여러개 띄울때 Code영역을 공유할 수 있다.
Stack과 데이터는 스택 구조의 특성과 전역 변수의 활용성을 이용하기 위해 나눈다.
위와 같은 내용이지만 자세히 설명하면, Program의 Code는 Program이 만들어지고(컴파일되고) 나서는 바뀔 일이 전혀 없다.
따라서 읽기만 가능한 Read Only
부분으로 인식한다. 그렇기 때문에 같은 프로그램을 실행시켜 몇 개의 Process가 실행되더라도 같은 프로그램이라면 Code 부분은 다 똑같은 내용을 가지고 있게 된다.
따라서 같은 Program의 Process일 경우 Code 부분을 공유(Share)하여 메모리 사용량을 줄이는 목적
이다.
Stack의 구조는 위의 사진과 같이 이루어져있다. 하단이 막혀있고 상단만 뚫려있어, 한 쪽으로만 데이터를 넣고 꺼낼 수 있다. 꺼낼때는 최근의 데이터부터 꺼낼 수 밖에 없는 구조이다.
c언어의 함수 호출을 예시로 들면
main > printf("\n I") > func1 > printf("like") > func1종료
main > printf("C") > func2 > printf(program) > func3
func3 > printf("!!!!") > func3종료 > func2종료
의 순서로 Stack 구조로 함수가 호출되게 된다.
이러한 함수의 Stack 구조로 인해 Data 부분과 Stack 부분을 따로 나누게되었다. 전역 변수(global variables)는 어떤 함수에서도 접근 할 수 있기 때문에 Data로 따로 관리를 해준다. 따라서 함수 외부(Outside function)와 함수(Inside function, 지역 변수 포함)에 따라서 Stack구조 활용을 위해 나눈것이다.
함수 호출에 따른 스택 할당 과정이 한 눈에 들어오네요. 감사합니다.