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)은 프로세스의 상태를 저장하는 데이터 구조입니다.