힙을 사용하는 이유

 

  • Heap은 결국 내부적으로 VirtualAlloc을 사용하기에 malloc, new, HeapAlloc을 통해서 Heap을 사용하는 것보다는 VirtualAlloc을 직접 사용하는 것이 성능상 이점이 있습니다.

    하지만, VirtualAlloc을 사용할 경우 사용자가 직접적으로 메모리를 free, reserve, commit 상태를 컨트롤해야 하기 때문에 사용함에 있어서 번거로움이 있고 메모리 단편화를 신경 써가며 사용해야 합니다.

    또한 Windows에서 Heap은 LFH(Low-fragmentation Heap)을 통해 메모리를 버킷 단위로 관리하기 때문에 가상 메모리 단편화를 줄일 수 있습니다.




힙을 사용함으로서의 단점

 

  • 사용자가 직접적으로 메모리를 관리할 수 없기 때문에 페이지 커밋과 디커밋을 사용자가 직접적으로 컨트롤할 수 없습니다. 즉, 반환된 메모리는 언제 디커밋되어 reserve 상태가 될지 알 수가 없습니다.




Default Heap과 Dynamic Heap이란?

 

Default Heap

 

  • Default Heap은 프로세스 생성 시에 자동적으로 생성되는 Heap으로서 WINAPI, malloc, new를 사용할 때 사용되는 힙입니다. 프로세스가 파괴될 때 자동적으로 파괴되며 사용자가 HeapDestroy를 통해 파괴할 수 없습니다.




Dynamic Heap

 

  • Dynamic Heap은 사용자가 HeapCreate를 통해서 생성한 Heap을 말합니다. 사용자가 원할 경우 언제든지 HeapDestroy를 통해서 파괴할 수 있으며, Dynamic Heap Handle을 통해서 HeapAlloc, HeapFree를 통해 Dynamic Heap으로 부터 메모리를 할당 받거나 반환할 수 있습니다.




Dynamic Heap을 사용하는 이유

 

1. 멀티 쓰레드 경합 회피

 

  • Default Heap은 WINAPI, malloc, new 등 대부분의 라이브러리에서 사용되기 때문에 멀티 쓰레드 환경에서 Default Heap을 사용하게 될 경우 동기화로 인한 쓰레드 경합이 발생되어 성능이 떨어질 수 있습니다. 그렇기 때문에 Dynamic Heap을 사용하여 Default Heap을 사용함으로서 발생되는 멀티 쓰레드 경합을 최대한 회피할 수 있습니다.




2. 메모리 최적화

 

  • 특정 라이브러리에서만 Dynamic Heap을 사용하여 해당 라이브러리에 관련된 데이터만의 밀집도를 높여서 스페이셜 로컬리티 상승 및 Page Fault 현상을 줄일 수 있습니다.




3. HeapDestroy

 

  • 특정 라이브러리에서만 Dynamic Heap을 사용하여 프로세스를 종료하는 등의 이유로 모든 메모리를 반환해야 할 때 HeapDestroy를 통해서 Dynamic Heap으로부터 할당받은 데이터를 한 번에 반환할 수 있습니다.




'운영체제 > Windows' 카테고리의 다른 글

IOCP ( Input/Output Completion Port ) 의 내부구조  (0) 2022.10.06

+ Recent posts