운영체제는 프로그램의 실행을 위해 다양한 메모리 영역을 제공한다. 코드 영역
, 데이터 영역
, 스택 영역
, 힙 영역
이다. 코드 영역과 데이터 영역을 정적 세그먼트
, 스택 영역과 힙 영역을 동적 세그먼트
로 분류한다.
정적 세그먼트(Static Segment)
코드(Code) 영역
실행할 프로그램의 코드가 저장되는 부분이다.
- Read Only 영역이다.
- 텍스트 영역이라고도 부른다고 한다.
- 프로세스가 종료될 때까지 계속 유지되는 영역이다.
- 컴파일 시 크기가 결정된다.
데이터(Data) 영역
전역변수(global), 정적변수(static), 배열(array), 구조체(structure) 등이 저장되는 부분이다.
- 런타임 시 크기가 결정된다.
스택(Stack) 영역
지역변수, 매개변수, 리턴 값 등 임시로 사용하는 것들을 저장하는 영역이다.
- 함수 호출 시 생성되고, 함수 종료시 반환된다.
- 이름 값 한다. LIFO(Last In First Out)이다.
- 컴파일 시 크기가 결정된다.
- 코드, 데이터, 힙과 다르게, 스택은 쓰레드마다 구분되어 존재한다. (참고: [프로세스와 쓰레드])
- Stack 메모리는 액세스(생성과 삭제 등)가 모두 매우 빠르다는 장점이 있다.
- CPU에 의해 영역이 효율적으로 관리되며, 개발자가 변수를 명시적으로 할당/해제할 필요가 없다.
- 크기가 비교적 제한된다.
동적 세그먼트(Dynamic Segment)
힙(Heap) 영역
개발자가 동적으로 사용하는 영역이다. 객체 타입의 변수를 할당하는데 사용한다.
- malloc, free 또는 new, delete 에 의하여 할당/반환되는 영역이다.
- 기본적으로 “사용할 때마다” OS에게 메모리를 새로 빌려와서 할당하는 방식이다. 즉, 변수를 할당하고 해제하는 책임이 있다.
-
메모리를 제대로 관리하지 않으면 메모리가 조각화되는데 이를 메모리 누수(Memory Leak)라고 한다.
- Java와 C++과 같이
garbage collector
가 존재하는 경우 자동으로 관리(반환)된다. - 참고: [garbage collection]
- Java와 C++과 같이
- 런타임 시 크기가 결정된다.
- 스택과 다르게, 쓰레드가 아닌 프로세스 단위로 존재하는 영역이다.
- 스택 대비 상대적으로 액세스(생성과 삭제 등)가 느리다.
- 스택 대비 더 큰 메모리를 사용할 수 있다.
Buffer Overflow
할당된 메모리 영역 이상으로 사용하여 넘쳐버리는 걸 Buffer Overflow라고 한다. Heap 영역이 커지면 Stack 영역이 작아지게 되고, Stack 영역이 커지면 Heap 영역이 작아지게 된다.
Heap Overflow
heap에 할당된 메모리의 범위를 넘어버려서 stack 영역을 침범하는 것
Stack Overflow
stack에 할당된 메모리의 범위를 넘어버려서 heap 영역을 침범하는 것
[참고자료]
https://courses.engr.illinois.edu/cs225/sp2022/resources/stack-heap/
인프런