BOEHM GC 원칙 및 요약

BOEHM GC 원칙

포인터 주어진 공지되어 마지막 할당 원리에서, OBJ 알 수 그의 대응 HBLKHDR의 크기에 따라 두 HBLKHDR 어레이의 설명에 따라 발견 될 수있다. 또 다른 포인터 정렬 원칙에 따라, 우리는 (OBJ 포인터 가능성이 확인해야 할 것이다, 전체를 횡단) 포인터가 OBJ에 저장되는 위치를 알고 있습니다. 이러한 레이어 후 트리를 참조 할 수 있습니다.

먼저 중단 스레드로 구현 된 모든 (일시 중단 pthread_kill은 물론,이 스레드에 자신을 넣어하거나 중단 할 수없는, 관련 매크로 #DEFINE STOP_WORLD GC_stop_world)

각 스레드 스택의 상단과 하단에 액세스 (GC베이스 포인터 신호 처리 스레드 SUSPEND 때, GC_THREAD 구조에 현재 스택 포인터를 저장하는 각 스레드가 생성 획득, 구조 GC_THREAD 각 스레드에 대응) 다음 정렬 포인터 저장의 원리에 따라, 모든 스레드에 대한 스택 메모리를 통과.

가능한 포인터 (포인터가 유효한 포인터 접근 방식인지 확인 : 포인터가 범위, 그 포인터를 수도로 간주된다 판단되는 경우 BOEHM가 가장 낮은 주소와 가장 높은 주소 HEAP 할당 된 메모리에서 자신을 저장합니다)에 의해 다음, 포인터 배열은 두 대응 HBLKHDR을 얻었다.

비정상 상황에 속하는 (찾을 수없는 경우, 비있을 수 있고,이 인용 될 수 있으며, 발견되지 BOEHM 에 대응하는 메모리에 할당 된 메모리 페이지 의 주소 BLACKLIST는 , 할당이 이용 될 수없고, 충돌 유무 달리 확률 정상적인 상황은 거의 발생하지에서 5 월,이해야 BOEHM는 ) 다음 임시 패치를 명중 초점

실측치 HBLKHDR를 검사 된 후에 PAGE 아이들 상태가있는 경우 (할당 된 ok_freelist 애프터, PAGE는 비 아이들로 설정)

유휴 상태 인 경우, 포인터, (유효한 객체로하지 점)을 무시 예 경우, 포인터 플래그 OBJ의 사용 상태 및 해당 플래그 비트가 설정되어 (각 포인터가 주어 사용할 수에 기초 할 수있다 HBLKHDR의 노하우 OBJ에 저장되어 있기 때문에 크기 hb_sz ) 필드, 다음 횡 OBJ가 가능한 포인터 플래그 (11)를 식별하기.
전체 라벨 프로세스를 시작하기 전에 GC는 모든 HBLKHDR에게 태그 필드 (다른 스레드가 일시 중지되었습니다이 시간) 웁니다 모든 HBLKHDR 큐의 머리를 가지고, 큐는 모든 HBLKHDR를 통과 할 수 있습니다. 전체 HBLKHDR 모든 플래그가 설정되지 않은 경우 다음 완료 표시 한 후, 레이블이 지정되지 않은 표시 기준의 존재를 나타내는하는 것은 ok_freelist에 발표 될 예정이다, 그것은, 자신의 주소를 기반으로 HBLKHDR도 다시 GC_hblkfreelist 될 것이다 GC_hblkfreelist에서의 저장 위치를 재조정 결합 인접한 페이지 PAGE보다 크다.

여기 방식 때문에에게 재활용에 대한 몇 가지 과정으로 나누어 연구를,보고에 초점의 그것의 실행 (메모리 관리의 세부 사항을 발표 할 때 무시하고 관리 상태를 통해 마크 스윕을 되찾기 위해, 결국 복구, 전체 프로세스는 더 애매한 코드입니다 그래서 단지)의 일부를 관리에 초점을 맞 춥니 다.

관련 스택

여기에서 우리는 스택을 참조하여 다른 글로벌 데이터 GC 모드, 유사한 원리를 공부하지.

개요

MONO 메모리의 16 바이트에 할당 된 객체가 할당 될 때마다 메모리에 정렬되고, 프로그램은 소형 메모리 객체 파일이 존재하는 경우, 이들 ok_freelist 따른 메모리 크기를 할당하려고 시도하고, 객체의 크기 및 메모리 크기 16,32,48의처럼 이러한 개체의 수가 아니라 메모리의 낭비가 발생합니다 경우, 세 ok_freelist 목록, 목록 페이지까지 각 촬영을 생성합니다.

큰 객체 정의 (16)와 32 바이트, 48 바이트, 근접 허용하여 모든 48 바이트가 아니라, 메모리 모노 (저장할 수 작은 물체 즉 즉 단지 PAGE 만나는 사람 작은 메모리 할당와 이러한 물체 할당). OBJ가 OBJ가 큰 후 GC 메모리 액세스가 더있을 것 그렇다면 때, 물론, 전체 GC를 통과하기 때문에 물체가기구의 전제하에 달성 될 수 있으므로, 느린, 가능한 한 압축에 대해 정의 된 개체 메모리 작은 더 나은.


이 모습 약간의 충돌 위의 그 표현을 의미하는 것입니다 :

작은 과립 객체가 다음 일을 낭비하는 경우 같은 작은 물체를 들어, 시도에 따라, (절약 메모리 시도 (일부 과립 객체가 많은 경우 물론, 당신은 특수 가공이 필요하지 않습니다) 과립 형 정렬을 할 수 있습니다 전체 페이지), 일부 필드는 메모리에 대한 순차 정렬 가능한 한 작게 따라서 오브젝트를 정의하는 GC 메모리를 통과하는 동안, 상기 메모리는 작은 바이트 표현 될 수있다, 그것은 오버 작게 조정 편집 가능하고, 또한있을 수있다 일부 메모리를 저장합니다.

시스템 정렬에서 자원과 메모리를 할당

모노 공식 웹 사이트  http://www.mono-project.com/docs/
BOEHM 프로젝트의 공식 웹 사이트  http://www.hboehm.info/


관련된 힙 메모리 할당 함수를 사용 는 sbrk를 도의 비 공통 기능이라고 mprotect는이 메모리 세그먼트 (디버그 보조 모드로 사용한다)의 변화 특성을 사용할 때 사전 할당 된 제 변경 로 PROT_NONE 가 국경과 기타 행위는 테스트 단계에서 발견 할 수있는 메모리 그래서 만약 실제 응용 프로그램 사용에 할당 된 경우에만, 액세스 할 수 있도록 설정되어 있습니다. GC_unix_sbrk_get_mem의 인터페이스가 호출 는 sbrk 사전 할당 된 메모리의 상위 어드레스 페이지의 정렬에 따른다 할당되도록 예정

구체적인 구현은 다음과 같습니다

할당 HBLKHDR 상술 한 블록을 설명 PAGE 때문에, 기본적인 전제는 PAGE_SIZE 따른 메모리의 정렬 블록이다.
 

CUBE라는 인터페이스 부분을 불러 오기

1. MONO GC 알고리즘을 읽어가보고 다시 인터페이스 CUBE 호출 mono_object_is_alive, 그것은 해당 hb_mark 비트 비트를 찾을 HBLKHDR를 판독함으로써 두 포인터의 대응 어레이 후의 이해하기 쉽게하는를 결정 여부 OBJ 생존,

2 큐브 개체의 생존을 결정하기 위해 그 인터페이스 UNITY 후속 업데이트 버전 모노 경우 CUBE이 기능은 (필요 새로운 방법)에 실패 할 수 mono_object_is_alive를 호출 sgen의 GC 알고리즘에서 사용되지 않으며;


3. 통화가, gc_collect에 호출하기 전에 완료된 후 Mono_object_is_alive의 필수가 (), 그렇지 않으면 그것은 단지 GC의 생존 여부를 결정하기 위해 완료하기 때문에 (올바른 정보를 얻을 수 없다, GC_malloc 호출 한 후, 적절한 HBLKHDR 마크 표시를 설정하지 마십시오 (그렇게해야해야 할 일 간략화를 위해, 단지 메모리 요구 사항이 표시되어야 GC 복구 때문에 표시되지는 GC 스테이지 마크))까지 메모리를 할당;

출시 세 원저 · 원의 찬양 3 ·은 60000 +를 볼

추천

출처blog.csdn.net/jinangl/article/details/104751338