여부

2014-06-16 4 views
1

Chapter 21, Real World OCaml, 그것은 말한다 : 당신의 수명이 짧은 값의 대부분이 열리는 곳여부

마이너 힙입니다. 은 개의 OCaml 블록 시퀀스를 포함하는 연속적인 가상 메모리 청크로 구성됩니다. 공백이 있으면 새 블록을 할당하면 CPU가 몇 개만 필요한 빠른 정수 시간 작업을 수행 할 수 있습니다.

마이너 힙을 가비지 수집하려면 OCaml은 복사 컬렉션을 사용하여 마이너 힙의 모든 라이브 블록을 주요 힙으로 옮깁니다. 이것은 보조 힙의 라이브 블록 수에 비례하여 작업을 취하고, 세대 가설에 따라 일반적으로 작은 입니다. 마이너 콜렉션은 실행 중에 세계를 멈추게합니다 (응용 프로그램을 중단시킵니다). 은 매우 짧은 시간에 응용 프로그램을 다시 시작할 수 있도록 을 빨리 완료하는 것이 중요합니다.

나는 분명히 말하듯이 작은 힙에서 라이브 메모리는 주요 힙으로 이동한다는 것을 알고 있습니다.

그러나 Gc가 마이너 힙에서 라이브 메모리를 결정하는 방법은 무엇입니까?

큰 힙을위한 마크와 스윕 프로세스가 동일합니까?

기본적으로, gc에서 주요한 힙, 스택에서 일부 뿌리를 시작하고 아무것도 도달 할 수 있습니다.

minor에 대한 gc도이 경우 OCaml은 마이너 힙 메모리로 연결되는 루트를 빠르게 알 수 있습니까? 또는 어떤 루트가 주요 메모리로 이어지는 지 빠르게 알 수 있습니까?


내 혼란 OCaml의 주요에로 작은에서 동일한 GC 작업을 수행하는 경우, 어떻게 OCaml의 구별 할 수 있다는 사실입니까? 둘 다 스택에서 시작한다면 GC가 메이저를 포함하지 않고 미성년자 만 수집하는 방법은 무엇입니까?


편집

은의이 작은 힙 크기는 4킬로바이트 가정하자.

let f = 
    let a1 = Array.make (4 * 1024) 1 in 
    let a2 = Array.make (4 * 1024) 2 in 
    let a3 = Array.make (4 * 1024) 3 in 
    ... 

위의 코드에서

  1. a1의 주소가 스택에 넣어되며, 실제 배열이 작은 힙에있을 것입니다 : 여기에 몇 가지 코드입니다. 스택 모양은 [a1]입니다.
  2. a2을 생성 중입니다. 사소한 힙이 가득 찼기 때문에 사소한 힙을 발견 할 것입니다. gc는 스택을 살펴본 후 a1을 따르고 a1이 라이브인지 결정한 다음 a1's array이 주요 힙에 복사되고 a1의 포인터가 major의 새 주소로 변경됩니까? 스택은 이제 [a2;a1]처럼 보입니다.
  3. a3을 생성 중입니다. 2와 마찬가지로, 그것은 사소한 gc를 수행해야합니다.gc는 a2와 a1을 모두 통과합니까? 특히 a1은 메이저에 있더라도?
+0

당신은 윌슨의 http://www3.nd.edu/~dthain/courses/cse40243/spring2006/gc-survey.pdf을 읽어야합니다. StackOverflow 질문에서 알아낼 필요가 없습니다. –

답변

2

주요 힙의 값이 오래 되었기 때문에 주요 힙에서 작은 힙으로의 포인터가 비교적 적습니다. OCaml이 순전히 기능적인 것이라면, major에서 minor 힙으로의 포인터는 없을 것입니다.

사실 OCaml이 순수하게 기능하지 않고, 주요 힙에있는 오래 된 값은 작은 힙에 새 값에 대한 포인터로 업데이트 할 수 있습니다. 그러한 기록은 다음 작은 힙 수집의 관점에서 루트로 주요 힙 값을 기록하는 쓰기 장벽 통해 간다. 나머지 주요 힙은 마이너 컬렉션을 검색 할 필요가 없습니다. 쓰기 장벽 구현의 간단한 개요에 대한 the book your are currently reading 섹션 "세대 간 포인터"를

사전. 귀하의 예를 소개

:

예, GC 방문 스택은 작은 힙 값을 유지해야하지만 무엇을 결정하기 위해 GC가 보는 지점 3에서 그 외부 a1 포인트를 가리키는 스택 포인터 마이너 힙은 무시하고 즉시 a2으로 계속 진행할 수 있습니다. 주요 힙에서 작은 힙으로의 모든 참조는 참조 테이블에 쓰기 장벽에 의해 수집되었습니다. 주요 힙의 다른 위치는 방문 할 필요가 없으며 스택에서 참조 된 위치도 방문 할 필요가 없습니다.

A2 및 A1 모두 통과 GC 것인가?

아니요, 오직 a2입니다. a1은 보조 힙 외부에 있으므로 방문 할 이유가 없으므로 수정되지 않은 경우 보조 테이블에 별도로 등록됩니다.

+0

제 편집을 좀보세요. –

+0

'a1을 가벼운 힙 외부로 방문 할 이유가 없습니다. 'OCaml은'a1 '이 미성년자가 아닌 것을 어떻게 알 수 있습니까? OCaml 런타임은 이러한 테이블을 유지합니까? –

+0

@ JacksonTale 만약 블록을 2 분 동안 생각한다면, 블록이 마이너 힙에 있는지 테스트 할 수 있을까요? –