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 : 각 타입별로 지정된 크기만큼 메모리 블락을 할당 받고 연장 및 축소가 가능한 객체

+ Recent posts