Memory 관리 방법

보다 효율적인 Memory 관리 방법이 필요하기에 진행함

연속 메모리 할당

  • 가장 일반적인 방법으로, 동일한 타입의 데이터들을 연속된 메모리 상에 할당시키는 방법
  • Vector와 Array가 대표적인 예이다.
  • 다른 타입 간의 메모리 관계를 구축할 수 없다는 단점이 존재
  • 내부 단편화 : 없음
  • 외부 단편화 : 있음

페이징 기법 ( Paging )

  • 고정된 크기의 메모리 블락을 할당시키는 방법
  • 일정한 크기의 메모리 블락을 제공해주고, 해당 메모리 블락 안에서 객체들을 생성하는 방법
  • 내부 단편화 : 해당 메모리 블락을 전부 사용하지 못할 경우, 내부 단편화 발생 가능
  • 외부 단편화 : 없음

세그먼테이션 기법 ( Segmentation )

  • 서로 다른 크기의 메모리 블락을 할당하는 방법
  • 요구되거나 혹은 필요로 되어지는 메모리 블락만큼 할당시키는 방법
  • 내부 단편화 : 요구되어지는 전체 블락을 사용하기에 내부 단편화 발생하지 않음
  • 외부 단편화 : 해당 메모리 사용이 끝나고 해제되었을 때, 해당 메모리 블락을 다시 알맞은 크기로 사용 못할 가능성이 다분함

현재 Memory Project 내부 메모리 관리 방법

페이징 기법 ( Paging )

  • 해당 타입에 대해서 일정한 크기의 메모리 블락을 제공함
  • 해당 메모리 블락이 가득 찼을 시, 새로운 메모리 블락을 생성
    • 이때, 연속된 메모리 블락의 위치가 아닌 임의의 위치로 메모리 블락이 생성
  • 또한, 서로 다른 타입의 메모리 블락 크기가 일정치 않을 수 있음
    • 이로 인한, 외부 단편화 발생 가능

개선 방안

L1 캐시 메모리만큼 할당

  • 결국엔 메모리 블락만큼 할당해서 사용한 이유가 캐시 히트 확률을 높이기 위함임
  • 제공 되어질 메모리 블락의 최대치에 한계를 두어야 함
  • L1 캐시 메모리 사이즈를 넘어갈 시에는, 랜덤된 위치에 할당되어질 수 있음

메모리 주소 직접 관리

  • 자체적으로 메모리 주소를 관리해줘야 함
  • 서로 다른 객체들의 할당이 이루어졌을 때, 해당 타입의 메모리 블락을 할당하려고 하는데 이미 그곳에 다른 객체의 메모리 블락이 위치할 수도 있음
  • 그럴 경우, 직접 주소들을 확인할 수 있는 내부 구성이 필요함
  • 또한 이 과정에서 오버헤드가 많이 발생할 것으로 보임
  • 직접 주소를 관리하게 된다면
    • 해당 메모리 블락이 가득 찼을 시, 다음을 검사함
      • 현재 해당 연속 메모리 블락의 사이즈가 L1 캐시 사이즈를 넘었는지 확인
      • 다음 연속 메모리 블락을 생성할 위치가 다른 메모리가 사용 중이지 않거나 유효한지 확인
    • 위의 검사를 통과한 후에 해당 타입의 메모리 블락을 생성하여서 사용

Memory Pool과 연속 Memory Pool 객체가 필요

  • 메모리 풀과 그러한 메모리 풀들을 묶어서 타입별로 관리하는 객체가 필요함
  • 현재 Memory Pool 객체는 존재하지만, 해당 Memory Pool 내에서 연장할 수 있는 기능을 추가해야 함
  • 또한, 해당 Memory Pool들을 묶어서 타입 별로 관리할 수 있는 객체가 필요
  • 그러한 객체를 Memory Manager에서 최종 관리하는 방식으로 진행 필요

최종안

Yes
No
No Full
Full
Bigger than L1 Cache
Smaller than L1 Cache
Alreay used
No used
Send Message for Creating Instance
MemoryManager
Check the MemoryAddress existed
Check the MemoryPool
Create MemoryAddress for Instance
Create Instance
DONE
Check the adding MemoryPool' Size
Check the adding address is valid
Input address for MemoryPool
Find new address
Create new MemoryPool
  • MemoryManager : MemoryAddress를 관리, 인스턴스 생성 및 소멸 명령을 유저에게 받는 객체
  • MemoryAddress : 각 타입별로 MemoryPool들을 관리하는 역할
  • MemoryPool : 각 타입별로 지정된 크기만큼 메모리 블락을 할당 받고 연장 및 축소가 가능한 객체

+ Recent posts