🌷 프로세스 주소 공간
프로세스 주소공간: 프로세스가 메모를 할당받으면 자신만의 방법으로 메모리를 관리하기 위해 이 공간을 어떤 구조로 관리함
- 메모리는 한정되어 있음 > 프로세스는 메모리 절약 시도
- 영역:
- Stack 영역:
- 지역변수 & 매개변수 저장
- 함수의 호출과 함께 할당 (컴파일 타임)
- 메모리의 높은 주소에서 낮은 주소의 방향으로 할당
- 재귀 함수가 너무 깊게 호출되거나 함수가 지역변수를 너무 많이 가지고 있어 stack 영역을 초과하면 stack overflow 에러 발생
- Heap 영역:
- 런타임에 크기가 결정됨
- 사용자에 의해 공간이 동적으로 할당/해제됨
- 주로 참조형 데이터 (클래스 등)이 할당됨
- 메모리의 낮은 주소에서 높은 주소의 방향으로 할당
- Data 영역:
- 전역변수나 static 변수 등 프로그램이 사용할 수 있는 데이터를 저장하는 영역
- 어떤 프로그램에 전역/static 변수를 참조하는 코드가 존재하면 이 프로그램은 컴파일된 후에 data 영역을 참조하게 됨
- 프로그램의 시작과 함께 할당.
- Text(Code) 영역:
- 프로그램이 실행될 수 있도록 CPU가 해석 가능한 기계어 코드가 저장되어 있는 공간
- ReadOnly 상태로 저장: 프로그램 수정 방지
- 최적화:
- Data 영역의 공유: 각각의 스레드는 data 영역을 공유함 > 메모리 절약
🌷 BSS 영역
초기화 되지 않은 변수는 BSS 영역에 저장됨
Block Started by Symbel (BSS) 영역: 전역으로 선언된 초기화 되지 않은 데이터 영역
🌷 Stack과 Heap의 크기
실제 객체는 Heap 영역에서 관리되기 때문에 Stack 영역의 크기는 클 필요 X
Stack 영역:
- 생성과 동시에 크기가 정해짐 & 바뀌지 않음
- Heap 영역과 상관없이 크기의 제한을 가짐
Heap 영역:
🌷 Stack과 Heap에 대한 접근
Stack 공간:
- 할당: 이미 생성되어 있는 스택에 대해 포인터의 위치만 바꿔주는 단순한 CPU instruction
Heap 공간:
- 할당: 요청된 chunk의 크기, 현재 메모리의 fragmentation 등 다양한 요소를 고려하기 때문에 더 많은 CPU instruction 필요
Stack 공간이 더 빠름
🌷 공간 분할의 목적
- 최대한 데이터를 공유하여 메모리 사용량을 줄임
- Code는 같은 프로그램에서는 모두 같은 내용 > 따로 관리하여 공유
- Stack/Data 영역 구분: 는 스택 구조의 특성과 전역변수의 활용성을 위해 나눔
- Data/BSS 영역 구분:
- 초기화되지 않은 변수: 프로그램이 실행될때 영역만 잡아주면 됨
- 초기화된 변수: 영역 & 값 모두 프로그램에 저장하고 있어야 함
- BSS 영역 변수들이 많아져도 프로그램의 실행코드 사이즈를 늘리지는 않음
🌷 스레드 주소 공간
각 스레드는 Stack 영역만 가지고 있음. 나머지 공간은 프로세스의 값과 함께 써서 다른 스레드와 공유함
참고: