본문 바로가기

진리는어디에

Generation reference counting

GRC(Generation reference counting)에 대해서 설명하기 전에 분산 시스템에서의 객체는 레퍼런스를 통해 접근되며, 객체쪽에는 객체를 대신하는 스켈레톤이, 레퍼런스 쪽에는 프록시가 있으며, 이 둘은 항상(proxy, skeleton) 짝을 이룬다는 것을 기억해 보자.

GRC에서 프록시는 그 자신이 몇 번이나 복사 되었는지에 대한 카피 카운터(이하 count)와 몇 번째 세대인지(몇 번째로 복사 된 레퍼런스 인지)를 나타내는 generation number(이하 generation)을 가지고 있다. 스켈레톤은 추후 generation과 count에 대한 정보를 유지할 테이블 G를 가지고 있다.

1. Initialze
객체 o가 프로세스 P에 생성 되면, o의 레퍼런스 p는 :
    p.genration := 0
    p.count := 0
으로, o에서 유지하는 테이블 G는 :
    o.G[0] := 1
    o.G[i] := 0, for all i >= 1
로 초기화 된다. 이 때 테이블 G는 레퍼런스의 복사에는 관여하지 않고, 레퍼런스의 삭제시에만 테이블을 조절하므로써 증가 오퍼레이션과 감소 오퍼레이션에 대한 레이스컨디션을 방지 할 수 있다.
 
2. Copy
레퍼런스 p가 q로 복사 되는 경우, q는 아래와 같이 초기화 된다 :
    q.generation := p.generation + I
    q.count := 0
그리고 p.count는 증기 한다 :
    p. count := p.count + 1

3. Delete
레퍼런스 p가 제거되는 경우, p는 객체 o의 스켈레톤에게 p.generation과 p.count를 담은 delete 메시지를 전송한다. 스켈레톤에서 삭제 메지시를 받으면 :
    o.G[p.generation] := o.G[p.generation] - 1
    o.G[p.generation + 1] := o.G[p.generation + 1] + p.count
가 되며 테이블 G의 모든 엘리먼트가 0이 되면(for all i >= 0, o.ledger[i] = 0) 객체 o는 삭제 된다.

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!