프로세스가 메모리를 할당 받으면, 자신만의 방법으로 메모리를 관리하기 위해 공간을 특정 구조로 관리하는데, 이를 프로세스 주소 공간이라 함
한정된 메모리가 주어지기 때문에 프로세스가 메모리를 절약하려고 시도함.
간략히 Code 부분은 프로그램 소스 코드 저장/Data는 전역 변수 저장/Stack은 함수와 지역변수를 저장함
함수의 호출과 관계되는 지역변수
와 매개변수
가 저장되는 영역
런타임의 크기가 결정되는 영역
전역 변수
나 Static 변수
등 프로그램이 사용할 수 있는 데이터를 저장하는 영역
프로그램이 실행될 수 있도록 CPU가 해석 가능한 기계어 코드가 저장되어 있는 공간
프로그램이 수정되면 안되기 때문에 ReadOnly 상태로 저장되어 있음
속도는 Stack > Data > Code > Heap
최대한 데이터를 공유하여 메모리 사용량을 줄이기 위해
Code는 같은 프로그램 자체에서는 모두 같은 내용이기 때문에 따로 관리하여 공유함.
Stack과 data를 나눈 이유는, 스택 구조의 특성과 전역 변수의 활용성을 위한 것임. 함수호출과 관련이 있는데, 함수가 실행되면 관련 데이터와 지역 변수들이 스택에 저장되고 끝날시 위 정보들이 제거됨.
이렇게 프로그램의 함수와 지역 변수는, LIFO(가장 나중에 들어간게 먼저 나옴)특성을 가진 스택에서 실행됨. 따라서 이 함수들 안에서 공통으로 사용하는 '전역 변수'는 따로 데이터 영역에 저장되며 공유되어 함수 간 데이터 공유가 용이해지고 메모리를 절약할 수 있음.
Stack과 Heap의 경우, 실제 객체는 Heap 영역에서 관리되고, Stack에 등장하는 각 변수들은 Heap 영역에 위치한 실제 Object의 참조를 가지고 있음. 즉, Stack의 크기가 생각보다 클 필요가 없음.
Stack은 생성과 동시에 크기가 정해지고 변화가 없으므로 Heap과 다르게 크기의 제한을 받음. Stack Overflow와 같은 문제도 힙 영역을 침입해서가 아닌 정해진 Stack영역의 크기를 초과해서 발생한 문제
참고
https://devsin88.tistory.com/100
https://gyoogle.dev/blog/computer-science/operating-system/Process%20Address%20Space.html