프로그램은 실행되면 메모리(작업공간)에 올려져서 프로세스가 됩니다. C언어는 이 때 프로그램에게 5가지 구간으로 나누어 메모리 공간을 활용하도록 합니다. 각각 공간은 코드, 데이터, BSS(Block Started with Symbol), 힙(Heap), 스택으로 구분됩니다.
코드 영역 Code Area
프로그램의 로직이 저장됩니다. CPU는 이 코드 영역에 저장된 명령어를 순차적으로 실행합니다.
데이터 영역 Data Area
전역(Global) 변수와 정적(Static) 변수가 저장되는 곳입니다. 프로그램의 종료와 함께 해제되는 변수들이 이 영역에 저장됩니다.
BSS, Block Started with Symbol
전역 변수와 정적 변수 중 할당되지 않거나, Null(또는 0)로 할당된 변수가 저장되는 공간입니다. 프로그램이 할당되는 영역을 줄이기 위해 사용되며 해당 변수가 존재하다는 것만을 알리고 변수의 값을 할당하지 않을 수 있습니다.
힙 영역 Heap Area
프로그래머가 동적으로 할당하고 해제하는 영역입니다. 스택 영역과 서로 반대의 영역으로 확장됩니다.
스택 영역 Stack Area
프로그램에서 정적으로 할당되고 해제되는 영역입니다. 대표적으로 함수의 매개변수와 스코프 내부의 지역변수가 이 영역에 해당합니다. 힙 영역과 서로 반대의 영역으로 확장됩니다.
힙 오버플로우, 스택 오버플로우
Overflow는 넘쳐흐르는 현상을 의미합니다. 흔하게 알려진 개념으로는 변수의 크기를 초과하였을 때, 예기치 못하는 값으로 변하게 되는 현상을 버퍼 오버플로우라고 합니다. 예를 들어 C언어의 unsigned short 변수의 경우, 65,535에 1을 더하면 버퍼 오버플로우가 발생하여 0이 되는 현상이 일어납니다.
힙 오버플로우와 스택 오버플로우는 메모리 영역에서 다른 영역을 초과하게 되는 현상을 말합니다. 힙과 스택 두 영역은 서로 반대의 영역으로 확장됩니다. 동적 할당이 해제없이 계속해서 반복된다면 스택의 영역까지 침범하게 되는 힙 오버플로우가 발생하고, 재귀 함수가 종료 조건없이 계속해서 반복된다면 힙의 영역까지 힙범하게 되는 스택 오버플로우가 발생하게 됩니다.
'Study About Computing > Stub' 카테고리의 다른 글
왜 생명체는 망각을 하는가? (0) | 2022.04.10 |
---|---|
오픈소스 정의_The OpenSource Definition (0) | 2022.03.19 |
Oracle JDK와 Open JDK의 차이 (0) | 2021.09.14 |
Docker Tomcat (0) | 2021.09.03 |
용어 정리 (0) | 2021.05.04 |
댓글