코드/텍스트 영역
- 사용자가 작성한 프로그램이 CPU에 실행될 수 있는 기계어(or 컴파일된 명령어) 형태로 저장되는 곳
- 정적 영역: 컴파일시 결정되고 나면 바뀌지 않으며, 수정 불가능하다.
- 읽기 전용
- bin/hex 파일로 되어있다.
- PC(프로그램 카운터)가 가리키는 곳
데이터 영역
- 전역(global) 변수 / 정적(static) 변수 / 정적 배열 / 구조체가 저장된다.
- 정적 영역: 컴파일시에 결정된다. 그러나 안에 있는 데이터의 수정은 가능하다.
- 읽기/쓰기 가능
- BSS 영역: 초기화되지 않은 변수들이 저장된다
- GVAR 영역: 초기화된 변수가 저장된다
스택 영역
- 매개변수 / 지역변수 / 직전 함수의 리턴 주소 등 함수가 호출됐을 때 필요한 데이터가 임시로 저장되는 곳
- 함수가 호출될 때마다 자신을 호출한 함수 위에 스택 형태로 쌓이는 구조이고, 수행이 완료되면 데이터가 제거된다.
힙 영역
- 실행중 동적으로 할당되는 데이터(Object)가 저장되는 공간 ex) 객체, 자바의 리스트, 문자열
- 스택과 힙은 하나의 영역을 공유하며, (양 끝을 사용), 정해진 공간 안에서 데이터가 동적으로 할당되고 해제된다.
- 데이터가 계속 추가(ex: 함수 무한 호출)되면 서로 영역을 침범하는 상황이 발생하는데, 이를 stack overflow, heap overflow라고 한다.
- 참조 형태로만 접근이 가능하다
- ex) 함수에서 객체를 사용한다 -> stack의 객체 변수는 해당 객체의 주소를 갖고 있다 -> 주소로 heap 영역의 객체에 접근한다.
(출처: 야붕님 블로그)
참조
책) 쉽게 배우는 운영체제
https://yaboong.github.io/java/2018/05/26/java-memory-management/
https://zangzangs.tistory.com/107