目次 | 前の項目 | 次の項目 Java Remote Method Invocation


9.1 DGC インタフェース

DGC 抽象は、サーバ側での分散ガベージコレクタアルゴリズムとして使われます。このインタフェースは、dirtyclean という 2 つのメソッドを持っています。dirty 呼び出しは、リモート参照がクライアントにより整理されていないときに発生します。 クライアントは VMID により示されます。対する clean 呼び出しは、クライアント側にそれ以上のリモート参照が存在しなくなったときに発生します。dirty 呼び出しが失敗した場合には、「強い」clean 呼び出しをスケジュールして呼び出しの順序番号を保持し、将来分散ガベージコレクタが番号の食い違った命令を受けても、それを検出できるようにしなければなりません。

リモートオブジェクトへの参照はしばらくの間、参照を保持しているクライアントによって leased されます。lease される期間は、dirty 呼び出しが受け付けられた時点を始まりとします。自身が保持するリモート参照の lease 期間が切れないように、追加の dirty 呼び出しを発行して lease を更新するのはクライアント側の責任です。クライアントが lease が切れる前に更新しない場合、分配ガベージコレクタは、そのリモートオブジェクトはもはやクライアントから参照されていないと判断します。

package java.rmi.dgc;

import java.rmi.server.ObjID; public interface DGC extends java.rmi.Remote { Lease dirty(ObjID[] ids, long sequenceNum, Lease lease) throws java.rmi.RemoteException; void clean(ObjID[] ids, long seqNum, VMID vmid, boolean strong) throws java.rmi.RemoteException; }

dirty メソッドは、配列引数 ids に含まれるオブジェクト識別子に関連付けられたリモートオブジェクト参照の lease を要求します。lease は、クライアントの一意の Virtual Machine 識別子 (VMID) と要求された lease 期間を持っています。ローカルな Virtual Machine でエクスポートされるそれぞれのリモートオブジェクトについて、ガベージコレクタは「参照リスト」(ガベージコレクタへの参照をもつクライアントのリスト) を保持しています。lease が許可されるとガベージコレクタは、クライアントの VMID を ids に含まれるそれぞれの識別子で表されるリモートオブジェクトの参照リストに追加します。sequenceNum パラメータは、ガベージコレクタへの遅れた呼び出しを検出して除外するために使用するシーケンス番号です。シーケンス番号は、ガベージコレクタへの呼び出しが発生するたびに常に増加していきます。

クライアントの中には、一意の VMID を作れないものもあります。この理由は、VMID が真のホストアドレスつまり、セキュリティ制限で許可されないクライアントは除外したアドレスを含んでいる場合にだけ完全に一意な値を取ることができるからです。この場合クライアントは VMID として null を使うことができ、分散ガベージコレクタはそのクライアントに対して VMID を割り付けます。

dirty 呼び出しは Lease オブジェクトを返します。そのオブジェクトには使用されている VMID と、そのリモート参照に許可されている lease 期間が含まれています。サーバはクライアントが要求するよりも短い lease 期間を許可する権限があります。クライアントは、自分がリモートオブジェクト参照を取り下げたときに対応する clean 呼び出しが実行されるために、ガベージコレクタが使用する VMID を使わなければなりません。

クライアントの Virtual Machine は、そのマシン内で参照されている各リモート参照に対して最初に一回だけ dirty を行う必要があります。 たとえ同一のリモートオブジェクトに対して、複数の参照がなされていたとしても一回だけです。クライアントはまた、リモート参照への lease 期間が消滅する前に、lease 更新のために dirty 呼び出しを実行する必要があります。クライアントがもはや特定のリモートオブジェクトへの参照を持たない状態になると、その参照に関連したオブジェクト ID のための clean 呼び出しをスケジュールしなければなりません。

clean 呼び出しは、各リモートオブジェクトの参照リストから id で識別される VMID を削除します。シーケンス番号を使用して遅れた clean 呼び出しを検出することができます。引数 strongtrue の場合、その clean 呼び出しは失敗した dirty 呼び出しの結果生じたものです。 したがって、この場合にはクライアントの VMID に対応するシーケンス番号は記憶しておく必要があります。



目次 | 前の項目 | 次の項目
Copyright © 1997-1999 Sun Microsystems, Inc. All Rights Reserved.