Text
Text segment(혹은 Code segment)는 실행가능한 명령어를 포함하고 있는 메모리 영역이다. 이 영역은 Heap이나 Stack 영역보다 아래에 위치하는데, 이는 두 영역으로부터 덮어씌어지는 것을 방지하기 위함이다. 텍스트 영역은 공유가능하기 때문에 메모리에 한번의 복사로 프로세스를 동작시킬 수 있다. 이 역역은 read-only로 프로그램에 의해 명령어가 변경되지 않는다.
Data
Data segment는 초기화 된 data segment로서, 프로그래머에 의해 초기화된 전역(global)변수와 정적(static)변수를 포함하고 있다. 이 공간은 런타임에 변경이 가능하므로 not read-only이지만, 정확히 말하면 read-only 공간과 read-write 공간이 분리되어 있다.
다음과 같이 함수 밖에서 선언된 전역 변수는 초기화된 read-write 공간에 저장된다.
char str[] = "Hello World!";
int num = 5;
static char c = 'a'
하지만 다음과 같이 선언된 경우는 조금 다르다. str은 char형 포인터로 "Hello World!" 문자열을 가리킨다. str이 가리키는 내용은 상수형태로 변경할 수 없으므로 해당 문자열은 초기화된 read-only 영역에, str 변수는 초기화된 read-write 영역에 할당된다.
const char *str = "Hello World!"
BSS
BSS(Block Started by Symbol) segment는 초기화되지 않은 data segment로서, read-write으로 해당 영역의 데이터는 프로그램 실행 전에 OS 커널에 의해 0으로 초기화 된다. 메모리 상에서 Data segment 다음에 위치하며, 코드 상에서 명시적으로 초기화 되지 않은 전역, 정적 변수를 포함한다.
static int num;
Stack
Stack segment는 높은 주소에서 아래로 데이터가 저장되며 LIFO 구조를 따른다. 함수 호출에 필요한 데이터가 저장되고 그 데이터를 Stack frame이라고 부른다. 매 함수 호출시, Stack frame이 Stack 영역에 저장되며, Stack frame은 automatic 변수와 임시 변수, 함수 리턴시 돌아갈 주소값을 포함한다. 이와 같은 저장 데이터와 저장 방식으로 재귀 함수 구현이 가능한 것이다.
Heap
Heap segment는 메모리 상 BSS 다음에 위치하며, Stack 영역에 데이터가 저장되는 방향과 반대로 동작한다. 동적 메모리 할당이 일어나는 장소로 런타임에 크기가 결정된다.
참고자료
https://gabrieletolomei.wordpress.com/miscellanea/operating-systems/in-memory-layout/
'운영체제' 카테고리의 다른 글
Priority Inversion (0) | 2020.04.14 |
---|---|
Race Condition (0) | 2020.04.11 |
Process와 Thread의 비교 및 차이 (0) | 2020.04.07 |
WHAT HAPPENS WHEN YOU TURN A COMPUTER ON? (0) | 2020.04.06 |