프로세스 메모리 구조
오늘은 프로세스의 메모리 구조에 대해 배웠습니다. 프로세스는 아래 그림과 같이 낮은 주소값부터 TEXT 세션, GVAR 세션, BSS세션, HEAP 그리고 STACK 공간이 쌓여있는 구조로 메모리를 할당합니다.
- TEXT
프로그램의 실제 코드가 읽기 전용으로 저장되어 있는 영역
- GVAR
초기화가 되어 있어 프로그램이 시작될 때 부터 값을 가지고 있는 전역 변수들이 있는 영역
- BSS
초기화되지 않은 전역 변수가 저장되는 영역. 프로그램이 시작 될 때 이 공간은 0으로 초기화됨
- HEAP
변수의 데이터가 들어갈 동적 메모리가 할당 될 영역
- STACK
HEAP에 저장된 변수의 주소, 함수 리턴 주소 등이 저장되는 공간. LIFO방식으로 관리됨
메모리 할당 과정
function main() {
int a;
foo();
...
{
function foo() {
boolean b[4];
...
}
만일 위와 같은 코드가 프로세스에 실행이 되어 메모리에 들어가면 어떤 일이 일어나는지 순서대로 정리해보겠습니다.
1. int a;
TEXT 영역에는 프로그램 코드 자체인 int a라는 변수를 선언한다는 문장이 들어 있을 것입니다.
그럼 우선 HEAP에 int의 크기인 4바이트만큼 영역을 확보하게 됩니다.
그 다음 STACK에는 HEAP에서 할당한 영역 중 제일 앞의 주소값이 쌓이게 됩니다.
2. foo()
main 함수에서 foo() 함수를 불러오게 됩니다.
그럼 main함수에서 지금까지 진행했던 TEXT 영역의 주소값까지는 저장을 해놔야 이 이후에 이어서 실행하겠죠?
12번 주소의 코드까진 실행하고, foo()함수의 진행이 끝난 후 다시 진행해야 할 13번 주소의 값을 STACK에 저장합니다.
3. boolean b[4]
foo() 함수의 지역변수인 boolean 타입의 길이가 4인 변수 선언입니다.
HEAP에 1byte인 boolean 타입의 영역 4개를 순서대로 확보하고 해당 배열의 맨 첫번째 주소를 STACK에 저장합니다.
STACK과 HEAP의 Overflow
STACK 영역과 HEAP 영역은 서로 완전 붙어져 있지 않고 사이가 공백입니다.
거기서 STACK은 높은 주소쪽에 위치하여 점점 아래로 채워지고, HEAP은 낮은 주소쪽에 위치하여 점점 위로 채워집니다.
만약 사이의 빈 공간이 없을 만큼 양쪽의 데이터가 많이 찬 상태에서 데이터가 더 추가되어 STACK이 HEAP 영역, 혹은 HEAP이 STACK영역을 침범하는 것을 Overflow라고 합니다.
'부스트캠프 9기 > 챌린지' 카테고리의 다른 글
[부스트캠프 9기 챌린지] 학습 정리 - 06일차 (0) | 2024.07.22 |
---|---|
[부스트캠프 9기 챌린지] 회고 - 1주차 (0) | 2024.07.20 |
[부스트캠프 9기 챌린지] 학습 정리 - 03일차 (1) | 2024.07.17 |
[부스트캠프 9기 챌린지] 학습 정리 - 02일차 (0) | 2024.07.16 |
[부스트캠프 9기 챌린지] 학습 정리 - 01일차 (1) | 2024.07.15 |