프로세스가 운영체제로부터 메모리를 할당받게 되면 위와 같은 구조로 생성된다. 각 계층별 데이터를 주소가 낮은 순서대로 코드와 함께 보면서 살펴보자
Text section(.code)
- 코스 코드를 실행 가능한 기계어 코드로 변환되어 저장돼 있는 영역. 함수나 명령문이 기계어로 변환되어 저장된다.
- CPU는 이 부분에 있는 명령들을 하나씩 가져가서 처리한다.
- 흔히 코드영역(Code Segment)라고도 한다.
Data section
데이터 섹션은 전역변수와 정적변수(static)가 할당되는 공간이다. 또한 Data section은 초기화 된 변수(.data)와 초기화 되지 않은 변수(.bss) 영역으로 나뉜다. 초기화된 변수는 다시 상수를 보관하는 rodata부분과 초기화 된 전역변수를 저장하는 .data부분으로 나뉜다.
1) Initialize Data Segment(초기화된 변수)
- .rodata : ReadOnly Data로 읽기 전용인 data들이 저장된다. 상수(static), cout << "Hello, world!"; 의 문자열 부분이 rodata에 해당된다. 컴파일 시점에서 결정된 값이 변하면 안되는 값들.
- .data : 초기화 된 전역 변수들이 저장된다.
2)Uninitialized Data Segment(초기화 되지 않은 변수) - bss(Block Started by Symbol)
- 전역 변수 중 초기화가 되지 않은 전역 변수를 저장한다.
Initialize와 Uninitialized를 나눠서 저장하는 이유는? 어짜피 전역으로 설정한 데이터는 0으로 초기화 되는데??
data section에 있는 초기화 된 data들은 초깃값을 ROM메모리에 저장하여 사용한다, 그래서 변수의 갯수 만큼 ROM 용량을 차지한다. 하지만 bss section에 있는 초기화 되지 않은 data는 어짜피 0으로 초기화 될 변수들이기 때문에 data section과 같이 ROM 넣어 용량을 차지할 필요 없이 단지 RAM에 이런애들이 있다 라는것만 알려주고, 프로그램이 실행될 때 0으로 초기화 되어 ROM으로 이동되어 사용한다.
그래서 최종적으로 data section을 나눈 이유는 용량이 충분한 PC에서는 상관 없지만 임베디스 프로그램 같은 경우 ROM용량이 작기 때문에 용량을 효율적으로 사용하기 위해 나눠놓은 것이다..!
Heap section
- 프로그래머가 동적으로 할당한 데이터들이 위치하는 영역이다. C-malloc(), free() / cpp-new(), delete
- 런 타임에 크기가 결정된다.
Stack section
- 함수 안에서 선언한 지역변수와 매개 변수가 저장된 영역이다.
- 함수 호출시 할당되고 호출 종료 시(return)반환된다.
- 컴파일 타임에 크기가 결정된다.
Heap과 Stack section은 서로 반대 방향으로 데이터를 저장한다. 즉 Stack은 높은 주소 > 낮은 주소로 Heap은 낮은 주소 > 높은 주소로 할당하며 점점 모이는 형태로 데이터를 저장한다. 결국 stack pointer와 Heap pointer가 가리키는 주소가 같아지면 사용가능한 메모리가 모두 소진되었다는 의미이다.
Stack overflow : Heap pointer가 Stack section을 침범한 경우
Heap overflow : Stack pointer가 Heap section을 침범한 경우
CS 지식을 공부하고 기록하는 개인 공부 블로그입니다.
내용 중 틀린 부분 피드백 혹은 궁금한 점이 있으면 댓글로 남겨주시면 참고 및 답변 달아드리겠습니다🧐
'Computer Science > 운영체제' 카테고리의 다른 글
[OS/운영체제] Thread / 스레드 (1) | 2023.12.22 |
---|---|
[OS/운영체제] 동기 & 비동기 VS 블로킹 & 논블로킹 (1) | 2023.12.18 |
[OS/운영체제] IPC / Inter Process Communication (1) | 2023.12.18 |
[OS/운영체제] 프로세스 / Process (0) | 2023.12.13 |
[운영체제] Interrupt란? (1) | 2023.11.12 |