프로세스 메모리 구조의 Heap은 Heap 데이터 구조를 사용하는가?

FGPRJS·2021년 12월 3일
0

다음과 같은 질문을 받았을 때 어떻게 답해야 하는가?

Heap이란?

어떤 Heap을 말하는 것인가?

Data Structure에서 트리를 사용하는 Heap(최대 힙/최소 힙)을 말하는 것인가?
아니면 프로세스의 메모리 구조중의 Heap을 말하는 것인가?

그 전에, 왜 메모리 구조 중 사용자(개발자)가 동적할당하는 메모리 영역도 Heap이고 데이터구조 중의 HeapHeap으로 부르는 것인가?


Stack은 이에 대해 간편하게 답변할 수 있다.

프로세스 메모리 구조중의 Stack은 실제로 Stack 자료구조를 사용하기 때문에 Stack이기 때문이다.

이해하기도 간편하다.

함수가 호출되면 함수 스택(스택 프레임)이 쌓이고, 그곳에서 처리할 함수 스택(스택 프레임)이 또 쌓이면서, 처리 완료시 그 스택을 pop하는 방식을 사용하기 때문이다. 실제로 Stack식으로 구조를 이해하기 용이하다.

하지만 Heap의 경우 알고 있는 것은 항상 최대값/최소값을 가져올 수 있는 Heap이 전부이다.
심지어 Heap은 특성상 [0] 이외의 인덱스에 접근하면 Heap을 사용하는 의미 자체가 퇴색된다.

도대체 이런 자료구조로 사용자가 동적할당한 데이터를 어떻게 갖고 오는 것인가? 혹시 프로세스 메모리의 HeapHeap데이터 구조가 아닌 것이 아닐까?


사실, 둘은 서로 딱히 상관이 없다.

다음 링크를 참조해보자.

다음과 같이 답변한다.

둘의 공통점은 이름이 같다는게 전부입니다.

다음 링크의 코멘트에서는 다음과 같이 기술한다.

사실, Heap보다는 Pool이 더 나은 말입니다.

이것이 전부이다. HeapPool보다 더 오래된 말이며, 그 때 당시엔 Memory Pool같은 단어를 쓰지 않았기에 Heap이라는 이름을 사용했다. 라는 것이 요지이다.
다음 링크에서도 보이듯이 그냥 데이터 공간 더미이기 때문에 Heap이라고 부르는것 뿐이라고 말한다.


추가 기재

C#의 VM(CLR)을 예시로, 이 VM의 영향을 받는 Heap영역은 오래 살아남은 데이터는 다시는 안 쓸 확률이 낮고, 최신 데이터는 다시 안 쓸 확률이 높다는 점에 근거하여 제작된 GC를 위하여 다음과 같은 3개의 영역으로 구분된다.

  • 0세대
    • 가장 젊고, 수명이 짧은 세대이다. 방금 만든 새로운 개체가 이 곳에 들어간다. 임시 변수가 이 곳에 들어가는 적절한 예이다.
  • 1세대
    • 1세대는 0세대와 2세대 사이의 버퍼이며, 0세대중에서 GC를 1번 이상 수행했을 때 살아남은 개체들이 1세대로 승급한다.
  • 2세대
    • 2세대는 오래 살아남는 세대이며, 1세대 중에 GC를 1번 이상 수행했을 때 살아남은 개체들이 2세대로 승급한다.

Java의 경우는 C#이 원래 Java를 참조하여 만든 언어였으므로 GC의 구조가 비슷했지만, Java7+가 되면서 G1 GC가 되었다고 한다. 이제 Java는 위와 같은 GC를 사용하지 않는다고 한다.

profile
FGPRJS

0개의 댓글