728x90
728x90
공통 목적 : 데이터를 최대한 공유하여 메모리 중복 사용을 피하고,
Memory 사용량을 최소화한다.
프로세스 주소 공간(Process Address Space)
Code(Text) 영역
- 프로그램을 실행시키는 실행 파일 내의 명령어들이 위치하는 공간이다.
- 컴파일 시에 결정된다.
- 프로그램의 코드는 수정되면 안되므로, Read-Only 로 지정되어있다.
- 같은 프로그램으로 실행된 여러 프로세스는 동일한 코드를 가진다.
- 동일한 내용을 중복 할당하지 않고 특정 공간에 할당하여 메모리 사용량을 절약할 수 있다.
Data 영역
- 전역 변수, static(정적) 변수들이 위치하는 공간이다.
- 전역 변수, 정적 변수를 참조한 코드는 컴파일 후 Data 영역의 주소값을 가리킨다.
- 한 프로세스 내 여러 스레드가 공통으로 Data 영역을 공유한다.
- 중복된 내용을 여러 번 할당하지 않고 하나의 공간으로 구성하여 메모리 사용량을 절약할 수 있다.
- 실행 중에 변수가 수정될 수 있기에 Read-Write 로 지정되어있다.
- 프로그램 실행 시 생성되고, 프로그램 종료 시 소멸된다.
BSS 영역
- 전역으로 선언된 초기화 하지 않은 변수는 BSS(Blocked Started by Symbel) 영역에 저장된다
Heap 영역
- 동적 할당(malloc(), new 등)을 위한 메모리 영역이다.
- 런타임(동적 할당의 경우)에 크기가 정해진다.
- 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
- 주로 객체가 저장되고 Garbage Collector 에 의해 정리된다.
Stack 영역
- 함수의 실행을 마치고 복귀할 주소, 데이터(지역 변수, 매개 변수, 반환값)를 임시로 저장하는 공간이다.
- 각 함수는 LIFO 구조로 실행된다.
- 컴파일 시 크기가 결정된다.
- 재귀 함수가 여러 번 호출되거나 지역변수가 많아지면 Stack Overflow가 발생할 수 있다.
- 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
- 실행 중에 변수가 수정될 수 있기에 Read-Write 로 지정되어있다.
- 함수의 호출과 함께 할당되고, 함수 호출 완료 시 소멸된다.
스레드 주소 공간
- 멀티 스레드 상황에서 같은 프로세스 내의 모든 스레드는 Code, Data, Heap 영역을 공유한다.
- Stack 영역은 공유하지 않고 스레드별로 할당받는다.
- 자원을 공유하기에 동기화 문제가 발생할 수 있다.
+TLS(Thread Local Storage)
Process와 마찬가지로 Thread들도 각자의 고유한 전역변수가 필요한 경우가 있을 것이다. 때문에 Stack과 마찬가지로 Thread 별로 Data 영역처럼 고유의 영역을 제공하는데, 이를 Thread Local Storage(=이하 TLS)라고 부른다.
추가 질문
Q. Stack과 Heap 공간에 대해, 접근 속도가 더 빠른 공간은 어디일까요?
더보기
- 할당/해제 속도는 Stack 이 빠르다.
💡 스택에서 할당의 의미는 이미 생성되어 있는 스택에 대해 포인터의 위치만 바꿔주는 단순한 CPU Instruction(덧셈과 뺄셈 연산, 일반적으로 단일 Instruction)이다. 반면 힙에서의 할당은 요청된 chunk의 크기, 현재 메모리의 fragmentation 상황 등 다양한 요소를 고려하기 때문에 더 많은 CPU Instruction이 필요하다.
- 접근 속도는 할당/해제 속도를 빼놓고 이야기할 수 없다고 한다.
- 더 자세한 내용
728x90
728x90
'Computer Science > Operating System' 카테고리의 다른 글
Context Switching(컨텍스트 스위칭) (0) | 2023.03.07 |
---|---|
단기 스케줄러, 중기 스케줄러, 단기 스케줄러 (0) | 2023.03.07 |
Process(프로세스) (0) | 2023.03.07 |
인터럽트(Interrupt) - 내용 수정 필요 (0) | 2023.03.04 |
System Call(시스템 콜) (0) | 2023.03.03 |