by 꽈배기
메모리 관리는 일반적으로 다음과 같은 영역으로 나뉩니다:
Read-Only 영역
데이터(Data) 영역: 초기화가 된 전역 변수, 정적 변수가 저장되는 영역이다. 프로그램이 시작될 때 초기화된 상태로 존재하며 읽기/ 쓰기 권한이 존재한다.
BSS(Block Started by Symbol) 영역: 초기화되지 않은 전역, 정적 변수가 저장되는 영역이다. 시작 될때 해당 변수들은 0으로 초기화된다. 초기화되지 않은 데이터는 BSS에 저장되어 실행 파일에 포함되지 않는다.
힙(Heap) 영역: 동적 메모리 할당을 위해 사용되는 영역. 프로그램 실행 중에 malloc, calloc, realloc 등의 함수를 통해 메모리를 할당받고, free 함수를 통해 해제한다.
높은 주소 -> 낮은 주소 로 진행되며 이는 아래 이유가 존재한다.
malloc, calloc, realloc 등을 통해 필요할 때마다 메모리를 할당받고, free를 통해 해제한다.외부 단편화 해결 방법으로는 페이징 기법이 있다. 페이징
내부 단편화 해결 방법으로는 세그멘테이션 기법이 있다.
메모리 풀 (Memory Pool) 메모리 풀은 미리 정의된 크기의 메모리 블록을 여러 개 준비해두고, 필요할 때마다 이 블록을 할당하는 방법으로. 주로 고정 크기의 메모리 할당이 빈번한 경우에 사용됩니다. 멀티스레드 환경에서 힙에 요청하는 경우 매우 무거운 작업이 될 수 있기에 메모리 풀을 사용하기도 함.
용도에 따라 고정된 크기공간을 메모리풀로 사용할 수 도 있으며, 메모리 풀의 크기가 동적으로 바뀌는 경우도 존재한다.
내부 단편화를 줄일 수 있으며, 메모리 할당과 해제 속도가 빨라집니다.
메모리 풀 단점
| 방법 | 외부 단편화 해결 | 내부 단편화 해결 | 메모리 관리 오버헤드 | 유연성 |
|---|---|---|---|---|
| 페이징 | 완전 해결 | 부분 해결 | 높음 | 높음 |
| 세그멘테이션 | 부분 해결 | 부분 해결 | 중간 | 높음 |
| 메모리 풀 | 부분 해결 | 거의 해결 | 낮음 | 낮음 |
CPU가 프로세스를 실행할 때, 가상 주소를 물리 주소로 변환하기 위해 페이지 테이블을 사용합니다. 힙과 스택은 메모리 할당 방식과 접근 방식에서 차이가 있습니다.
페이지 테이블:
CPU 사이클:
힙은 전역적으로 관리되므로 컨텍스트 스위칭 시 힙 메모리 관리에 추가적인 오버헤드가 발생할 수 있습니다.
- **자동 메모리 관리**: 컴파일러는 함수 호출과 반환 시 스택 포인터를 적절히 조작하는 코드를 생성합니다. 이를 통해 함수의 메모리가 자동으로 할당되고 해제됩니다.
메모리 관리:
멀티태스크 환경에서 각 스레드는 독립적인 실행 흐름을 가지며, 각 스레드는 자신의 스택을 가지고 있습니다. 이는 다음과 같은 이유 때문입니다:
독립적인 함수 호출: 멀티스레드 환경에서 스레드는 독립적으로 함수 호출을 수행하므로, 각 스레드마다 독립적인 스택을 필요로한다. 스택에는 함수 호출 정보와 지역 변수가 저장되므로, 스레드간 충돌 방지를 위한 독립적인 스택이 필요하다.
메모리 보호: 스레드 간의 스택이 분리되어 있으면, 한 스레드가 다른 스레드의 스택을 침범하는 것을 방지할 수 있습니다. 이는 메모리 보호와 안정성을 높이는 데 기여합니다.
컨텍스트 스위칭: 멀티태스크 환경에서 스레드 간의 컨텍스트 스위칭이 발생할 때, 각 스레드의 스택 포인터를 저장하고 복원해야 합니다. 독립적인 스택을 사용하면, 스레드 간의 컨텍스트 스위칭이 더 효율적으로 이루어질 수 있습니다.
프로세스 제어 블록(PCB, Process Control Block)은 프로세스의 상태를 저장하는 데이터 구조입니다.