메모리의 구조
프로그램이 실행되면, 주기억장치(Ram)에 프로그램이 올라가게 됩니다. 올라간 프로그램을 프로세스라고 합니다.
당연히 프로그램에서 사용되는 변수들을 저장할 공간도 필요한데,
이에 따라 운영체제는 프로그램에 다양한 메모리 공간을 할당합니다.
아래는 운영체제가 할당하는 메모리 공간의 영역을 크게 4가지로 나눈 것입니다.
- Code 영역
- Data 영역
- Stack 영역
- Heap 영역
일반적인 UNIX 계열의 운영체제에선 Code - Data - Heap - Stack 순으로 메모리 주소가 높아지게 배치됩니다.
또, Stack은 메모리 주소상 아래로 커지고, Heap은 위로 커져 Stack과 Heap은 거꾸로 자랍니다.
각 영역에 대한 설명을 해보면,
영역 | 설명 |
---|---|
Code 영역 | 실행되는 프로그램의 코드가 저장되는 영역. CPU가 이곳에 저장된 명령어를 가져가 처리하게 된다. 이 부분은 읽기만 가능한데, 그로인해 프로그램은 명령들을 변경할 수 없다. |
Data 영역 | 전역변수, 정적변수가 저장되는 영역. 프로그램이 시작될 때 할당되고, 프로그램이 종료되면 소멸한다. |
Stack 영역 | 지역변수, 매개변수가 저장되는 영역 복귀주소를 저장하는데에 쓰임 함수 호출 시 할당되고, 함수가 끝나면 해제됨 매우 임시적인 공간 |
Heap 영역 | 사용자가 직접 할당하고 해제할 수 있는 영역 동적할당에 사용되는 malloc, calloc, free등의 함수를 사용하면 Heap영역을 조작하게 되는 것이다 이 영역은 Data, Stack영역과 다르게 프로그래머가 명시적으로 해제하기 전까지 할당된 채 이므로, 사용 후엔 해제해주는 것이 필수적이다. |
추가로, Data영역은 Data와 Bss라는 두 영역으로 쪼개 볼 수 있는데,
Data에는 초기화 된 변수들이, BSS에는 초기화 되지 않은 변수들이 저장된다는 차이를 가지고 있습니다.
정리를 해보면,
Stack에는 지역변수, 매개변수 같은 임시적인 변수들이 저장되는 영역,
Heap은 malloc, calloc, free등의 함수를 통해 사용자가 직접 조작할 수 있는 영역,
Code는 단순히 명령들이 저장되는 영역,
Data는 전역, 정적 변수가 저장되는데
여기서 둘로 쪼개지게 되고 Data에는 초기화된 변수들, Bss에는 초기화 되지 않은 변수가 저장되는 영역
이라고 할 수 있을 것입니다.