Memory 관리 방법
보다 효율적인 Memory 관리 방법이 필요하기에 진행함
연속 메모리 할당
- 가장 일반적인 방법으로, 동일한 타입의 데이터들을 연속된 메모리 상에 할당시키는 방법
- Vector와 Array가 대표적인 예이다.
- 다른 타입 간의 메모리 관계를 구축할 수 없다는 단점이 존재
- 내부 단편화 : 없음
- 외부 단편화 : 있음
페이징 기법 ( Paging )
- 고정된 크기의 메모리 블락을 할당시키는 방법
- 일정한 크기의 메모리 블락을 제공해주고, 해당 메모리 블락 안에서 객체들을 생성하는 방법
- 내부 단편화 : 해당 메모리 블락을 전부 사용하지 못할 경우, 내부 단편화 발생 가능
- 외부 단편화 : 없음
세그먼테이션 기법 ( Segmentation )
- 서로 다른 크기의 메모리 블락을 할당하는 방법
- 요구되거나 혹은 필요로 되어지는 메모리 블락만큼 할당시키는 방법
- 내부 단편화 : 요구되어지는 전체 블락을 사용하기에 내부 단편화 발생하지 않음
- 외부 단편화 : 해당 메모리 사용이 끝나고 해제되었을 때, 해당 메모리 블락을 다시 알맞은 크기로 사용 못할 가능성이 다분함
현재 Memory Project 내부 메모리 관리 방법
페이징 기법 ( Paging )
- 해당 타입에 대해서 일정한 크기의 메모리 블락을 제공함
- 해당 메모리 블락이 가득 찼을 시, 새로운 메모리 블락을 생성
- 이때, 연속된 메모리 블락의 위치가 아닌 임의의 위치로 메모리 블락이 생성
- 또한, 서로 다른 타입의 메모리 블락 크기가 일정치 않을 수 있음
- 이로 인한, 외부 단편화 발생 가능
개선 방안
L1 캐시 메모리만큼 할당
- 결국엔 메모리 블락만큼 할당해서 사용한 이유가 캐시 히트 확률을 높이기 위함임
- 제공 되어질 메모리 블락의 최대치에 한계를 두어야 함
- L1 캐시 메모리 사이즈를 넘어갈 시에는, 랜덤된 위치에 할당되어질 수 있음
메모리 주소 직접 관리
- 자체적으로 메모리 주소를 관리해줘야 함
- 서로 다른 객체들의 할당이 이루어졌을 때, 해당 타입의 메모리 블락을 할당하려고 하는데 이미 그곳에 다른 객체의 메모리 블락이 위치할 수도 있음
- 그럴 경우, 직접 주소들을 확인할 수 있는 내부 구성이 필요함
- 또한 이 과정에서 오버헤드가 많이 발생할 것으로 보임
- 직접 주소를 관리하게 된다면
- 해당 메모리 블락이 가득 찼을 시, 다음을 검사함
- 현재 해당 연속 메모리 블락의 사이즈가 L1 캐시 사이즈를 넘었는지 확인
- 다음 연속 메모리 블락을 생성할 위치가 다른 메모리가 사용 중이지 않거나 유효한지 확인
- 위의 검사를 통과한 후에 해당 타입의 메모리 블락을 생성하여서 사용
- 해당 메모리 블락이 가득 찼을 시, 다음을 검사함
Memory Pool과 연속 Memory Pool 객체가 필요
- 메모리 풀과 그러한 메모리 풀들을 묶어서 타입별로 관리하는 객체가 필요함
- 현재 Memory Pool 객체는 존재하지만, 해당 Memory Pool 내에서 연장할 수 있는 기능을 추가해야 함
- 또한, 해당 Memory Pool들을 묶어서 타입 별로 관리할 수 있는 객체가 필요
- 그러한 객체를 Memory Manager에서 최종 관리하는 방식으로 진행 필요
최종안
graph TB
A(Send Message for Creating Instance) --> B[MemoryManager]
B --> C{ Check the MemoryAddress existed }
C -- Yes --> D{ Check the MemoryPool }
C -- No --> E[ Create MemoryAddress for Instance ]
E --> D
D -- No Full --> F[ Create Instance ] --> DONE( DONE )
D -- Full --> G{ Check the adding MemoryPool' Size }
G -- Bigger than L1 Cache --> H{ Check the adding address is valid }
G -- Smaller than L1 Cache --> I
H -- Alreay used --> J( Find new address )
J ----> H
H -- No used --> K( Create new MemoryPool ) --> I
I( Input address for MemoryPool ) --> F
- MemoryManager : MemoryAddress를 관리, 인스턴스 생성 및 소멸 명령을 유저에게 받는 객체
- MemoryAddress : 각 타입별로 MemoryPool들을 관리하는 역할
- MemoryPool : 각 타입별로 지정된 크기만큼 메모리 블락을 할당 받고 연장 및 축소가 가능한 객체