(57)【特許請求の範囲】
【請求項１】
分散形オブジェクト指向データベース内で作成した１つのオブジェクトに対して包括的な唯一の識別子を割り当てするためのシステムにおいて、
通信網；
少なくとも１つの顧客プロセスを実行するものを１基、ならびに包括的に唯一の識別子のサーバープロセスを実行するものを１基含めた、前記通信網に接続された少なくとも２基のプロセッサー；
を含んで成り、
前記少なくとも１つの顧客プロセスのうちの１つが、前記包括的に唯一の識別子サーバープロセスから１レンジの包括的に唯一の識別子を要求し、
前記包括的に唯一の識別子サーバープロセスは、１レンジの隣接する包括的に唯一の識別子を要求する前記少なくとも１つの顧客プロセスのうちの１つのために１レンジの包括的に唯一の識別子を予約し、
前記包括的に唯一の識別子サーバープロセスが、前記１レンジの包括的に唯一の識別子を予約した後この１レンジの識別子を要求する前記少なくとも１つの顧客プロセスのうちの１つに対して、このレンジからの第一の包括的に唯一の識別子及び最後の包括的に唯一の識別子を伝送し、
１レンジの包括的に唯一の識別子を要求する前記少なくとも１つの顧客プロセスのうちの１つは、この１つの顧客プロセスによって作成された各オブジェクトのために、前記１レンジの包括的に唯一の識別子の中からの１つの包括的に唯一の識別子を割り当て、
前記少なくとも１つの顧客プロセスのうちの１つが、包括的に唯一の識別子の前記割り当ての完了時点で前記包括的に唯一の識別子サーバープロセスに対して、前記１レンジの包括的に唯一の識別子の未使用部分を解放する、
識別子割り当てシステム。
【請求項２】
前記１レンジの包括的に唯一の識別子が、複数の包括的に唯一の識別子のレンジの中から選択される、請求の範囲第１項に記載のシステム。
【請求項３】
前記複数の包括的に唯一の識別子のレンジのうちの各々のレンジが、包括的に唯一の識別子を同数ずつ内包している、請求の範囲第２項に記載のシステム。
【請求項４】
包括的に唯一の識別子の各々のレンジが隣接している、請求の範囲第２項に記載のシステム。
【請求項５】
前記複数の包括的に唯一の識別子のレンジが、前記包括的に唯一の識別子サーバープロセスによって、OIDスペースオブジェクトの中に維持される、請求の範囲第２項に記載のシステム。
【請求項６】
前記OIDスペースオブジェクトが前記包括的に唯一の識別子サーバープロセスによって作成されている、請求の範囲第５項に記載のシステム。
【請求項７】
前記OIDスペースオブジェクトが前記少なくとも１つの顧客プロセスにより作成され、前記包括的に唯一の識別子サーバープロセスに対して転送される、請求の範囲第５項に記載のシステム。
【請求項８】
前記包括的に唯一の識別子サーバープロセスからの前記１レンジの包括的に唯一の識別子を要求する前記少なくとも１つの顧客プロセスが、予約すべき一定数の包括的に唯一の識別子を特定する、請求の範囲第１項に記載のシステム。
【請求項９】
分散形オブジェクト指向データーベースの中で作成された１つのオブジェクトに対し包括的に唯一の識別子を割り当てるためのシステムにおいて、
通信網、及び
少なくとも１つの顧客プロセスを実行するもの１基と、包括的に唯一の識別子サーバープロセスを実行するもの１基を含めた、前記通信網に接続された少なくとも２つのプロセッサー、
を含んで成り、
前記少なくとも１つの顧客プロセスのうち１つが、前記包括的に唯一の識別子サーバープロセスからの１レンジの包括的に唯一の識別子を要求し、
前記包括的に唯一の識別子サーバープロセスが、前記１レンジの包括的に唯一の識別子を要求する少なくとも１つの顧客プロセスのうち１つに対して、複数の包括的に唯一の識別子のレンジを有するオブジェクト識別子スペースオブジェクトを伝送し、
前記１レンジの包括的に唯一の識別子を要求する少なくとも１つの顧客プロセスのうちの１つが、前記オブジェクト識別子スペースオブジェクトの中の、１レンジの包括的に唯一の識別子を予約し、
前記１レンジの包括的に唯一の識別子を要求する少なくとも１つの顧客プロセスのうちの１つが、この１つの顧客プロセスによって作成された各々のオブジェクトに対し予約された前記包括的に唯一の識別子の予約済みレンジからの１つの包括的に唯一の識別子を割り当てし
前記１レンジの包括的に唯一の識別子を要求する少なくとも１つの顧客プロセスのうちの１つが、前記包括的に唯一の識別子の予約済みレンジの未使用部分を解放し、
前記１レンジの包括的に唯一の識別子を要求する少なくとも１つの顧客プロセスのうちの１つが、前記包括的に唯一の識別子サーバープロセスに対して、前記オブジェクト識別子スペースオブジェクトを伝送する、割り当て用システム。
【請求項１０】
前記オブジェクト識別子スペースオブジェクトが前記少なくとも１つの顧客プロセスによって作成され前記包括的に唯一の識別子サーバープロセスに対し転送される、請求の範囲第９項に記載のシステム。
【請求項１１】
前記包括的に唯一の識別子サーバープロセスが、前記１レンジの包括的に唯一の識別子を要求する少なくとも１つの顧客プロセスのうちの１つに対して、前記複数の包括的に唯一の識別子のレンジをもつ前記オブジェクト識別子スペースオブジェクトを伝送する前に前記オブジェクト識別子スペースオブジェクトをロックする施錠装置を内含する、請求の範囲第９項に記載のシステム。
【請求項１２】
前記１レンジの包括的に唯一の識別子を要求する少なくとも１つの顧客プロセスのうちの１つが、各オブジェクトに対して前記包括的に唯一の識別子の予約済みレンジからの前記包括的に唯一の識別子を割り当てる前に、前記オブジェクト識別子スペースオブジェクトのロックを解除して戻す、請求の範囲第９項に記載のシステム。
【請求項１３】
少なくとも１つの顧客プロセスにより、分散形オブジェクト指向データベースの中で作成された１つのオブジェクトに対して包括的に唯一の識別子を１つ割り当てるための方法において、
１つのサーバープロセスから、前記少なくとも１つの顧客プロセスにより、１レンジの包括的に唯一のオブジェクト識別子を要求する段階；
前記サーバプロセスにより、前記少なくとも一つの顧客プロセスに対して１レンジの隣接するオブジェクト識別子を予約する段階、
前記サーバープロセスにより、前記包括的に唯一の識別子の予約済みレンジから、最初の包括的に唯一の識別子と最後の包括的に唯一の識別子を前記少なくとも１つの顧客プロセスに伝送する段階、
前記少なくとも１つの顧客プロセスにより、前記オブジェクト識別子の伝送済みレンジから前記少なくとも１つの顧客プロセスが生成した各々のオブジェクトに対して包括的に唯一のオブジェクト識別子を１つ割り当てる段階；
前記少なくとも１つの顧客プロセスにより、前記サーバープロセスに対して、前記包括的に唯一のオブジェクト識別子の割り当てが完了した時点で前記オブジェクト識別子のレンジの未使用部分を解放する段階；
を含んで成る方法。
【請求項１４】
１つの通信網を有する分散形オブジェクト指向データベースの中で、前記少なくとも１つの顧客プロセスにより作成された１つのオブジェクトに対して包括的に唯一の識別子を１つ割り当てるための方法において、
前記少なくとも１つの顧客プロセスにより、１つのサーバープロセスから、１レンジの包括的に唯一の識別子を要求する段階；
前記要求に応えて、前記サーバープロセスにより、前記少なくとも１つの顧客プロセスに対して、複数の包括的に唯一の識別子のレンジを持つオブジェクト識別子スペースオブジェクトを伝送する段階；
前記少なくとも１つの顧客プロセスにより、前記少なくとも１つの顧客プロセスに対して、前記オブジェクト識別子スペースオブジェクトの中で１レンジの包括的に唯一の識別子を予約する段階；
前記少なくとも１つの顧客プロセスにより、１レンジの包括的に唯一の識別子を要求する前記少なくとも１つの顧客プロセスによって作成された各オブジェクトに対し予約された包括的に唯一の識別子の前記予約済みレンジから包括的に唯一の識別子を１つ割り当てる段階；
前記少なくとも１つの顧客プロセスにより、前記包括的に唯一の識別子の予約済みレンジの未使用部分を開放する段階；及び
前記少なくとも１つの顧客プロセスにより、前記サーバープロセスに対して、前記オブジェクト識別子スペースオブジェクトを戻す段階、
を含んで成る方法。
【発明の詳細な説明】
発明の分野
本発明は、オブジェクト指向データベースの分野、より特定的に言うと、分散形オブジェクト指向データベースシステムのための包括的に唯一のオブジェクト識別子の生成に関する。
発明の背景
あらゆるオブジェクト指向データベース（ODB）にとって重要なのは、持続的オブジェクトアイデンティティという概念である。最も一般的な意味では、オブジェクトアイデンティティというのは、その他のオブジェクトが他の点では類似したものである場合でさえ、１つのオブジェクトをその他すべてのオブジェクトから区別するため、及びそのオブジェクトを磁気ディスクといったような持続的記憶装置から検索しそれをコンピューターメモリーの中に移送するために使用できるオブジェクトの譲りがたい特性のことである。
理論的には、いかなるビット・パターンでも、それがその他のいずれかのオブジェクトのアイデンティティを実行するのに使用されたことがない限りにおいて、オブジェクト識別子（OID）を実行するために利用することができる。従って、唯一のビット・パターンを生成する機械またはシステムは、同じビット・パターンが２度生成されたことがないということを条件として、持続的OIDを提供するのに充分なものとなる。実際には、性能を考慮して出来る限り小さく、かつできる限り迅速にOIDを生成するシステムが好まれる。
多くの顧客プロセスを実行し１つの通信網によって相互接続された多数プロセッサーから成る分散形計算システムにおいては、各々の顧客プロセスが、すべての顧客プロセスを横断して包括的に唯一のものであるOIDを確実に局所的に指定できるようにする上で特別な挑戦がなされている。この挑戦に対する具体的なアプローチとして、標準的に３つのものが試みられてきた。
第１のアプローチでは、各々の顧客プロセスは独立して包括的に唯一のOIDを生成する。１つの標準的な技術は、日付け−時刻スタンプとプロセッサー識別子を連結することによってOIDを形成することである。通信網上の各々プロセッサーは、（ネットワーク通信を目的とする）唯一の識別子を有しており、日付け−時刻スタンプは、単調に増加することから、作成された各々のOIDには、唯一のものであるという保証がある。もう１つのアプローチでは、各々の顧客プロセスは独立して局所的に唯一のOIDを生成し、これらのOIDは次に、中央サーバーといった独立した機関によって（必要とあらば）包括的に唯一のOIDへと変更される。この問題に対する第３のアプローチにおいては、各々の顧客プロセスは、１つのオブジェクトを作成する必要がある毎に包括的に唯一のOIDを生成するように中央サーバーといったような独立した機関に要請する。
これらのアプローチの各々は、性能上のトレードオフを有している。第１のアプローチは、包括的に唯一のID（GUIDS）を局所的に生成することから、その他のアプローチがもたらすサーバー又は調整機関とのネットワーク通信の費用を節約する。しかしながら、この通信の欠如によってもたらされる対価は、このアプローチにおいてOIDが大きいものとなる傾向を持つということにある。OIDが大きくなると、より大きいディスク記憶装置が必要となり、又、読みとり、書き込み及び処理に必要な時間も長くなる。
第２のアプローチは、局所的に唯一のOID（LUID）を生成し、これらのLUIDが、認知できるほどに包括的に唯一のものであった場合には、このアプローチは優れた性能を発揮する。しかしながら、LUIDをGUIDに変換または、再マッピングしなければならない場合に併発する環境における問題点が発生する。この変換のコストは、新たに作成されたオブジェクトを参照するすべてのオブジェクトが、LUIDからGUIDへと変換された参照をも有していなくてはならないことから、新たに作成されたオブジェクトの数に正比例し、しかもはるかに大きいものとなる。
第３のアプローチでは、第２のアプローチの変換費用及び第１のアプローチの大きいGUIDを両方とも回避できる。しかしながらこの方法に付随する性能上の問題点は、その他のアプローチのいずれの場合よりも頻繁であるサーバー又は調整機関との通信の結果としてもたらされる。このような頻繁な通信は大量のネットワーク・トラフィックの存在下で性能を非常に急速に劣化させる。
従って、必要とされているは、局所的に生成される識別子の大きなサイズが必要とされることなく、識別子変換により性能が劣化するこたなく、又、識別サーバーの使用に標準的に随伴する過度の通信網トラフィック無しに、包括的に唯一のオブジェクト識別子を生成するようなシステムである。
発明の要約
本発明は、分散形オブジェクト指向データーベースの中のオブジェクトのために包括的に唯一の識別子を生成するためのシステムに関する。１つの実施形態では、システムは各々単数または、複数の顧客プロセスを実行でき、かつ１つの通信網を通して通信網全体にわたるオブジェクトのための包括的に唯一の識別子を提供するサーバーに各々接続されていいる少なくとも２基のプロセッサを含んで成る。
通信網上の各々の顧客プロセスは、サーバーに対して１つの要求を伝送することができ、このサーバーは、顧客プロセスが自ら作成中のオブジェクトを識別するための包括的に唯一のオブジェクト識別子を要求した時点で、包括的に唯一の識別子を提供する。この要求に応えてサーバーは要求している顧客プロセスに対し、１レンジの包括的に唯一のオブジェクト識別子を伝送する。
要求している顧客プロセスは、次に、この包括的に唯一のオブジェクト識別子のレンジからオブジェクト識別子を割り当てる。要求している顧客プロセスは、自ら作成したオブジェクトに対する包括的に唯一のオブジェクト識別子の割り当てが完了した時点で、次に、未使用の包括的に唯一のオブジェクト識別子をサーバーまで戻し、その他の顧客プロセスのために使用できるようにする。
図面の説明
本発明は、添付のクレームの中で特定的に指摘されている。本発明の上記の及びその他の利点は、添付図面と合わせて以下の記述を参照することにより、よりよく理解できることだろう。なお、図面中、
図１は、本発明のシステムの一実施形態のブロックダイヤグラムである。
図２は、図１の本発明の包括的に唯一の識別サーバーと顧客プロセスの間の通信のブロックダイヤグラムである。
図３は、本発明のオブジェクト識別子スペースのブロックダイヤグラムである。
図４は、図２に示されているプロセス・サーバー通信の間の包括的に唯一の識別子スペースのブロックダイヤグラムである。
図５は、顧客プロセスとサーバープロセスの間の包括的に唯一のオブジェクト識別子の作成及び移送を描いた、図１のシステムの１つの実施形態の流れ図である。そして、
図６は、顧客プロセスとサーバープロセスの間のパラメータデータの移送を描いた、図１のシステムのもう１つの実施形態の流れ図である。
発明の詳細な説明
図１を参照すると、分散形オブジェクト指向データベースシステム（ODB）８は、１つの実施形態において、少なくとも３基のプロセッサーに12、14及び16を接続する通信網10を内含する。この実施形態において、プロセッサ12及び14は、各々それぞれ２つの異なる顧客プロセス18、22及び20、24を実行している。これらの顧客プロセス18、20、24は、単一のアプリケーションプログラムの異なる連結であってもよいし、或いは異なるアプリケーションプログラムであってもよい。ここで論述するにあたっては、顧客プロセス18、20、22、24は、同時に走行させており、各々がオブジェクトを生成し従って、包括的に唯一でなくてはならないOIDを使用している。
プロセッサー16は、通信網上のオブジェクトのための包括的に唯一の識別子を提供するサーバープロセス26を実行している。サーバープロセス26は、多くの機能を行うことができるが、本発明ではサーバープロセス26は少なくとも包括的に唯一のOIDの生成を援助しなくてはならない。以下ではサーバープロセス26をGUIDサーバー26とも呼んでいる。さらにGUIDサーバープロセス26を実行しているプロセッサー16は、その他の関連性の無いプロセス28を走行していってもよく、GUID生成タスク専用である必要はない。
簡単に概覧して、図２を参照すると、性能を改善するために、分散形オブジェクト指向データベースシステム８は、包括的に唯一のオブジェクト識別子が要求される毎にGUIDサーバー26と通信するのに顧客プロセス18、20、22、24を必要としない。その代わり、各々の顧客プロセス18、20、22、24は、頻繁にではなくGUIDサーバー26からの１レンジの包括的に唯一のオブジェクト識別子を要求することになる。
顧客プロセス18、20、22、24がGUIDサーバー26から１レンジの包括的に唯一のオブジェクト識別子を要求する毎に、顧客プロセス18、20、22、24は、１ブロックの包括的に唯一のオブジェクト識別子を予約する。（ステップ50）一定の与えられた顧客プロセス（例えば18）が、１レンジの予約済みOIDを有する間その他のいかなる顧客プロセス（例えば20）もそのレンジ内のOIDを使用することが出来ない。その他の顧客プロセス18、20、22、24は各々それ自身のレンジを代わりに予約しなくてはならない。こうしてどの２つの顧客プロセス18、20、22、24もそれが生成するオブジェクトに対して、同じOIDを指定できないということが保証されることになり、かくして、包括的な唯一性が確保される。
１レンジのOIDを予約の後、顧客プロセス（例えば18）は、このOIDレンジからのOIDと、自らが生成したオブジェクトに対し、局所的に割り当てることになる。（ステップ52）
ひとつの顧客プロセス18、20、22、24は、OIDが必要と成る毎にGUIDサーバー26と通信する必要がない、という事実から、このOID生成方法の性能利点は、増大する。実際、GUIDサーバー26に対する付加的な要求は、顧客プロセス18、20、22、24が自ら以前に予約したすべてのOIDを使い果たした時点で初めて発生することになる。
顧客プロセス18が、自ら生成しつつあるオブジェクトに対し、OIDを割り当てているのと同時に、もう１つの顧客プロセス20は包括的に唯一のオブジェクト識別子の異なる１ブロックを予約している（ステップ54）。顧客プロセス20がGUIDサーバー26からそのOIDブロックをひとたび受理したならば、このプロセスもまた自ら作成しつつあるオブジェクトに対して、OIDを割り当て始めることができる（ステップ56）。
顧客プロセス18は、自ら作成しつつあるオブジェクトに対するOIDの割り当てを終了した時点でGUIDサーバー26と再び通信して、予約済みのレンジからあらゆる未使用のOIDを戻す（ステップ58）。標準的には、実際に顧客プロセス18、20、22、24がオブジェクトに対し、割り当てるOIDの数は、この顧客プロセス18、20、22、24による使用のために予約された数よりもはるかに少ないものとなる。顧客プロセス18が以前に自ら予約したOIDレンジの未使用部分を戻した後、GUIDサーバー26は、自由に未使用OIDをどの顧客プロセス18、20、22、24にでも提供できる（ステップ60）。
本発明の技術は、同様に同じプロセッサ上で多くのODB顧客が実行される実施形態において、唯一のOIDを生成するためにも使用することができる。この実施形態では、顧客プロセス及びサーバープロセスは共有のメモリーを通して通信することができる。このような実施形態における本発明の方法による性能の改善は、１つの通信網を内蔵する実施形態の場合ほど大きいものではない。
さらに詳細に、図３も参照してみるとここで示されている実施形態においては、OIDスペース80と呼ばれている１つのオブジェクトを用いるGUIDサーバー26によって包括的に唯一のOIDの生成が調整されている。OIDスペースオブジェクトを用いることの利点は、このオブジェクトにより異なるプロセッサ12、14上で同時に実行中の多くの顧客プロセス18、20、22、24が、重複したOIDを生成する危険性なく新しいオブジェクト識別子をもつ新しいオブジェクトを作成できるという点にある。
１つの実施形態において、本発明は０から231−１までの順次整数をOIDを形成するビットパターン内にマッピングするのにOIDスペースオブジェクト80を使用する。従ってこのスペース内の有効なOIDの数は、そのシーケンス内の整数の数と等しい。この結果、OIDスペースオブジェクト80の濃度と呼ばれるものがもたらされる。
GUIDサーバー26は、OIDスペースオブジェクト80内の一定数のオーバーラップしないOIDレンジ（１〜ｎ）82、84、86、88、90へと全ての有効OIDのスペースを区分する。これらはオブジェクト識別子が要求された時点で顧客プロセス18、20、22、24によって予約されるレンジである。どの時点においても一定の与えられたレンジ（例えばレンジ  １  82）は、最大１つの顧客プロセス18、20、22、24によって予約可能である。このことはすなわちOIDスペースレンジ82、84、86、88、90の数がオブジェクトを生成中でありうる。従って同時にOIDを要求することになる顧客プロセス18、20、22、24の最大数に等しい、ということを意味している。
１つの顧客プロセス18、20、22、24は一般に、オブジェクトを生成中であるトランザクションの接続時間中、１つのOIDレンジを予約する。このトランザクションの終わりで顧客プロセスが、OIDの割り当てを終了した時点で顧客プロセス18、20、22、24は自ら予約した各レンジについて、自らが実際に割り当てた最高のOID92、94、96、98を記録する。かくして、予約済みレンジの未使用部分は、次にGUIDサーバー26に戻されて、その後の時点で同じまたは、その他のプロセスが使用できるようになる。顧客プロセス18、20、22、24が、自ら予約したレンジ内のいずれのOIDも使用しなかった場合この顧客プロセスは単に予約を取り消す。
OIDスペースオブジェクト80の濃度及び区分レンジの数は、両方ともOIDスペースオブジェクト80が生成された時点で特定される。濃度もパーティション数の両方ともいかなる自然数であってもよいが、（ただしパーティションの数は濃度以下であることを条件とする）、ここで示されている実施形態は両方の数を２の累乗であるよう制限している。こうして、スペースを等しいレンジに分割でき、又ビットシフトオペレーションによって各レンジの最初と最後の迅速な計算が可能となる。
図示されている実施形態において、OIDスペースオブジェクト80は、以下で記述する３つのスペースパラメータ（Number−of−OIDs,Number−of−Partitions,Number−of−Partitions−Created）、及びHigh−Water−Vector81を含むデータ構造である。OIDスペースオブジェクト80は、231という濃度と27のパーティションを持つ。かくして、ここに描かれているOIDスペースオブジェクト80は、１レンジあたり約1600万のOIDを伴う128レンジ82、84、86、88、90へと区分された約20億のOIDを割り当てることが出来る。各レンジ82、84、86、88、90は、開始OID100、102、104、106、110と最終OIDを有する、最後のものを除くすべてのレンジについて、１つのレンジの最後のOIDは、次に続くレンジの開始OID102、104、106、108、110よりも１つ少ないOIDである。図３は、各レンジ100、102、104、106、108、110の開始数値を示している。各レンジ82、84、86、88、90は、割り当てを受けているべきそのレンジ内の最後のOIDを表す高水位マークの92、94、96、98を有していてよい。
GUIDを生成するためにOIDスペースオブジェクト80を用いることの１つの複雑さはOIDスペースオブジェクト80がそれ自体包括的に唯一の識別子をもっていなければならないという点にある、ということにも留意すべきである。この問題にはいくつかの方法で対処することができる。第１の方法はOIDスペースオブジェクト80内の１つのOIDをそれ自身に指定することである。かくして、例えばOIDスペースオブジェクト80にしビット例０と指定すると、第１のパーティションは、その他のパーティションよりも１つ少ないOIDを持つことになるが、第１のOIDはOIDスペースオブジェクト80に属することが予め決定されることになる。第２の方法は単に、OIDスペースオブジェクト80を、それ自体予め予約されたOIDを持ち得るより大きなOIDオブジェクトスペース内の１つのオブジェクトとすることにある。
図４は、GUIDサーバー26と顧客プロセス18及び20（図２に示されている通り）の間に複雑化が発生するにつれてのOIDスペースオブジェクト80'内の変化を描いている。最初に（ステップ48）OIDスペースオブジェクト80'は４つのレンジ82'84'86'88'に区分される。レンジ82'84'及び86'は、各々OIDを割り当て、かくして表示されている通りの高水位マーク92'94'及び96'を有する。この例では、レンジ86'が、全レンジ86'を包括する高水位マーク96'を有し、従って、それからそれ以上のOIDを割り当てることができない、という点に留意すべきである。換言すると、レンジ88'にはいかなるOIDも割り当てられておらず、従って、その高水位マークはその開始点にある。
顧客プロセス18がひとたびGUIDサーバー26と接触し、１レンジのOIDを予約したならば、前の高水位マーク92'から、終わりまでのレンジ82'内のOID130は、予約済みとしてマーキングされる（ステップ50）。プロセス20がGUIDサーバー26と接触して１レンジのOIDを予約した時点で異なるレンジ84'内の前の高水位マーク94'から、レンジ84'の終わりまでのOID132は、予約済みとしてマーキングされる（ステップ54）。顧客プロセス18がGUIDサーバー26と接触してその予約済みレンジ130の未使用部分を戻した時点で（ステップ58）、レンジ82'内の高水位マーク92''は、最後に使用されたOIDのレベルまで上昇させられる。新しい高水位マーク92''とレンジ82'の終わりの間のOID134は、この時未予約としてマーキングされる。この時、顧客プロセス18が、新しいOIDレンジを予約すべくGUIDサーバー26に対し要求を行った場合（ステップ60）、いずれかの未予約のレンジ（この例では88'）からのOID136を割り当てることができる。
簡単に概覧して図５を参照すると、包括的に唯一の識別子を生成するためのシステムの１つの実施形態においては、顧客プロセス18が１つのOIDスペースオブジェクト80を生成し、それを一定数のレンジ82、84、86、88に区分し、次にOIDオブジェクト80をサーバープロセス26まで移送する（ステップ152）。サーバープロセス26はこのとき、OIDスペースオブジェクト80を記憶し、オブジェクトが一度に複数顧客プロセス18、20によって修正されないようにするこのオブジェクトに対するロックを制御する役目を担う。顧客プロセス18が１つのOIDレンジを予約することを望む場合、顧客プロセス18はレンジを要求し（ステップ152）、それに応えてサーバープロセス26はOIDスペースオブジェクト80に対するロックを設け、OIDスペースオブジェクト80を顧客プロセス18まで移送する（ステップ156）。
顧客プロセス18はこのときOIDのレンジ86を予約する（ステップ158）。従って顧客プロセス18は、そのレンジの開始を終わりによって区別される通り、割り当てに利用できるOIDの１つのレンジを有する。この時点で、同時に発生する他のいかなる顧客プロセスも、顧客プロセス18により予約されたレンジ内のOIDを割り当てることはできない。顧客プロセス18は次にオブジェクト80をサーバープロセス26まで移送し戻し、サーバープロセスは、ロックを解除して（ステップ160）、OIDスペースオブジェクト80に対し、顧客プロセス18、20、22、24がアクセスできるようにする。このとき、顧客プロセス18は、この予約済みOIDレンジからのOIDを、それが作成する各々のオブジェクトに対して割り当てる。
顧客プロセス18がOIDを割り当てている間、顧客プロセス20はOIDレンジを要求し（ステップ162）、サーバープロセス26は再びロックを設ける。その後、サーバープロセス26は、OIDスペースオブジェクト80を顧客プロセス20に移送する（ステップ164）。次に顧客プロセス20は、OIDレンジ82を予約し（ステップ166）、OIDスペースオブジェクト80サーバープロセス26までに戻し、これがロックを解除する（ステップ168）。
顧客プロセス18がその未使用のOIDを解除することを望む場合、このプロセスはサーバープロセス26に対して要求を送り（ステップ170）、このサーバープロセスはロックを設けて、OIDスペースオブジェクト80を顧客プロセス18へと移送する（ステップ172）。顧客プロセス18が未使用OIDを解放し高水位マーク180をリセットした時点で（ステップ174）、OIDスペースオブジェクト80は再びサーバープロセス26（ステップ176）まで移送され、これがロックを解除する。未使用のOIDの解除は、顧客がその予約済みレンジからのOIDの割り当てを完了した後に解放される。この完了は通常、顧客のトランザクションが完了した時点（ディスクにトランザクションを引き渡すか又は、放棄することによって）で、あるいは稀ではあるが顧客がその予約済みレンジを使い果たし新しいレンジを予約しなければならない時点で起こる。
予約したレンジを戻す手段としては２つある、すなわちサーバーに対して最後に使用されたOIDを伝送すること、そして予約を取り消すことである。前者はより一般的なものであり、顧客が１つのオブジェクトに対して予約済みレンジからのすくなくとも１つのOID割り当てた時点で起こる。予約取り消しオプションは顧客がそのレンジからのいかなるOIDも割り当てしなかった場合又は、そのトランザクションを放棄する意図がある場合のいずれかにおいて使用される。未使用OIDを戻す２つの手段については、以下でさらに詳しく記述する。
ここで図６を参照すると、包括的に唯一の識別子を生成するためのシステムの一変形実施形態においては、サーバープロセス26は、１つのOIDスペースオブジェクト80を作成し、それを一定数のレンジ82、84、86、88へと区別する（ステップ180）。サーバープロセス26は、OIDスペースオブジェクトを記憶し維持する責を負う。
顧客プロセス18が１つのOIDレンジを予約することを望む場合、顧客プロセス18は、１つのレンジを要求し（ステップ182）、それに応じて、サーバープロセス26は、１つのOIDレンジを予約し、（ステップ184）、予約済みレンジの下部および上部境界にあるOIDを顧客プロセス18まで移送する（ステップ186）。従って、顧客プロセス18は、レンジの開始及び終わりによって区別されている、割り当てに利用できる１つのOIDレンジを持つ。この時点で、同時に発生する、その他のいかなる顧客プロセス20も顧客プロセス18により予約されたレンジ内のOIDを割り当てることができない。
次に顧客プロセス18は、このOIDレンジからの１つのOIDを、それが作成する各々のオブジェクトに対して割り当てる。
その顧客プロセス18がオブジェクトに対しOIDを割り当てているのと同時に、プロセス20は、１つのOIDレンジを要求する（ステップ188）。サーバープロセス26は、１つのOIDレンジを予約し（ステップ190）、予約済みレンジの下部および上部境界OIDを顧客プロセス20まで移送する（ステップ192）。
顧客プロセス18がその未使用OIDを解放することを望む場合、このプロセス18は、サーバープロセス26に対して、それが使用した最後のOIDを含む要求を送る。顧客プロセスが、その予約済みレンジからのOIDの割り当てを完了した後、未使用のOIDの解放が開始される。ここでも又、この完了は、顧客のトランザクションが完了した時点か又は、希ではあるが、顧客プロセスがその完了済みレンジを使い果たし、新しいレンジを予約しなければならない時点で起こる。
ここでも又、予約済みレンジを戻す手段としては２つある。すなわち、サーバーに対して、最後に使用したOIDを伝送すること、そして予約を取り消すことである。前者はより一般的なものであり、顧客プロセスがデイスクに引き渡したいオブジェクトに対し予約済みレンジからの少なくとも１つのOIDを割り当てた場合に起こる。予約取り消しオプションは、顧客がそのレンジからのOIDを全く割り当てなかったとき又は、そのトランザクションの放棄を意図している場合のいずれかにおいて使用される。予約済みレンジがひとたび戻されたならば、サーバープロセス26は、高水位マーク180′をリセットし（ステップ196）、レンジ内の残りのOIDを使用できるように解放する。
いずれの実施形態にも共通の関数
これらの実施形態のいずれかを実施するために、下記の関数が顧客プロセス18、20、22、24（第１の実施形態用）或いはサーバープロセス26（変形形態用）のいずれかによって実行される。
OIDオブジェクトを作成し区分する
［Create_OID_Space_Object（Number_of_OID_Bits、Number_of_Partition_Bits）］という形式の、Create_OID_Space_Objectと称される関数は、一つのOIDスペースを作成して当該スペースを一定数のレンジに区分する。Number_of_OID_Bitsのパラメータは、OIDを形成するビット数を規定する。一実施形態において、一つのOID内のビット数は省略時解釈により31に設定され、従ってOIDスペースは231（−20億）のOIDを含むことになる。この省略時値は、作成されたOIDが省略時解釈によって32ビット長の単語に確実に適合するようにしている。しかしながら、OIDのサイズに関して理論的な上限は無い。OIDのサイズに関しては、より低い制限を設けることも同様に可能であることにも留意しなければならない。一つの実施形態においては、Number_of_OID_Bitsの数値で８ビット未満のものは、８ビットに切り上げられている。
Number_of_Partition_Bitsパラメータは、各々１つのOIDレンジを同時に予約できる顧客プロセスの最大数を規定し、従ってOIDスペースオブジェクト80内のパーティション数に等しい。１つの実施形態においては、省略時値は128のパーティションを許容し、従って最大で128の顧客プロセスが各々１つのOIDレンジを予約することができる。
更に、OIDスペースオブジェクト80を作成した結果として、１つのベクトルアレーであるHigh_Water_Vetorと称されるデータ構造が作成されることになる。当該ベクトルへの各入力は、１つの特定のパーティション又はOIDレンジを表している。
従って前述の省略時例では、ベクトルの長さは128のロケーション即ち;128のパーティション各々について１つのロケーションということになる。ベクトル内の一定の与えられたロケーション内に記憶された数字は、その入力ロケーションに対応するレンジから割り当てられた現行で最大のOIDである。一つの実施形態においては、ベクトル内の各ロケーションの高位で最も有意なビット（例えば31ビットのOIDについてはビット32）は、「使用中」インジケータとして解釈される。即ち、このビットが（１）に設定されると、そのロケーションによって代表されるOIDレンジは予約済みである。ビットが０であるならば、レンジは予約されるべく利用可能である。一つの変形実施形態では、OIDレンジ当たり１つのこれらのビットフラグは、別々のベクトル内に記憶される。
下記の疑似コードは、この関数の実施の一つの実施形態を実証している。
//最大及び最小値を規定する
MUXIMUM_OID_SIZEを31と定める//省略時最大OIDサイズ
MINIMUM_OID_SIZEを８と定める//省略時最小OIDサイズ
//省略時値を使用するか否か決定する
NUMBER_OF_OIDSをNumber_of_OID_Bits及びMUXIMUM_OID_SIZEの最小に設定する
NUMBER_OF_OIDSをNUMBER_OF_OID_Bits及びMINIMUM_OID_SIZEの最大に設定する
NUMBER_OF_PARTITIONSをNUMBER_OF_PERTITIONS_BITS及びMUXIMUM_OID_SIZEの最大に設定する
NUMBER_OF_PERTITIONS_CREATEDを
２NUMBER_OF_PERTITIONSに設定する
（Number_of_OIDs＋１）×（Number_of_Partitions_Created）ビットを保持するようにHigh_Water_Vectorを割り当てる
//各パーティションについて使用された最後のOIDに高水位マークを初期化し、これはHigh_Water_Vector内の各スロットについて低位ビット内で０を有することになる。
begin−for
スロットでの値をスロット＊２（NUMBER_OF_OIDS・NUMBER_OF_PERTITIONS）に設定する
end−for
パラメータ（Number_of  OIDs、Number_of_Partition、Number_of_Partition_Created）は、OIDスペースオブジェクト80のデータ構造の属性である（図３）。
パーティションを予約する
［Reserve_Partition（Beginning_OID、Ending_OID）］の形式のReserve_Partitionと称される関数は、オブジェクト識別子の１つのレンジを予約する。一つの実施形態では、この関数は、予約に成功した場合はTRUEを戻し、いずれのレンジも予約不可能であった場合はFALSEを戻すブール関数である。FALSEの戻しは、全てのパーティションが使用中の場合か、或いは使用中でないものが既に使い果たされたいた場合にのみ発生する。予約に成功した場合、この関数は、出力パラメータBeginning_OID及びEnding_OIDを、予約されたパーティション又はレンジ内の開始及び終了OIDそれぞれに設定する。この関数が顧客18、20、22、24によって実行された場合、ロックを解除してOIDスペースオブジェクト80を他のユーザーが利用できるようにするため、この関数の直後に、OIDスペースオブジェクト80はサーバープロセス26へと戻され。
下記の疑似コードはこの関数の実施の一つの形態を実証している：
各パーティションについて
begin−for
開始しない場合（パーティションが使い果たされている或いはパーテイションは予約済み）
次に
begin−then
Beginning_OIDをパーティションの高水位マーク＋１に設定する
Ending_OIDを次のパーティション開始マイナス１に設定する
パーティションを予約済みであるとしてマークする
trueを戻す
end−then
end−for
falseを戻す
予約を取り消す
［Cancel  Ｒeservation（An_OID_In  Reserved_range）］の形式のCancel  Reservationと称される関数は、An_OID_In_Reserved_Rengeパラメータ内で引用されているOIDを含むOIDのレンジについての予約を取り消す。一つの実施形態では、この関数は、取り消しに成功した場合はTRUEを戻し、An_OID_In_Reserved_Rengeパラメータ内のOIDが予約済みレンジ内に無いことが理由で取り消しに失敗した場合はFALSEを戻すブール関数である。
ここで記述する第１の実施形態では、この関数を使用することによって、顧客プロセス18、20、22、24は、顧客プロセス18、20、22、24からサーバープロセス26にOIDスペースオブジェクト80を転送するのに先立ち、An_OID_In_Reserved_Rengeを含むパーティションがもはや予約されていないことを表示するためにHigh_Water_Vector81内の高位ビットをクリアすることができる。ここで記述する第２の実施形態では、顧客プロセス18、20、22、24によっていかなるOIDも割り当てられていないことをCancel_Reservation関数が表示していることから、サーバーは高水位マークを更新する必要が無い。但し、An_OID_In_Reserved_Rengeを含むパーティションは未予約としてマークされる。
下記の疑似コードはこの関数の実施の一つの形態を実証している：
An_OID_In_Reserved_Rengeを含むパーティションを探す
（パーティションが予約済みの）場合には：
begin−then
未予約であるものとしてパーティションにマークする
trueを戻す
end−then
falseを戻す
新しい高水位マークを設定する
［Set_New_High_Water_Mark（New_High_Water_Mark）］形式の、Set_New_High_Water_Markと称される関数は、Reserve_Partition関数と共に使用することを意図されている。New_High_Water_Markパラメータは、顧客プロセス18、20、22、24によって割り当てられた最後のOIDを指定する。
かくして例えば、顧客プロセス18、20、22、24は最初に、Reserve_Partition関数でOIDの一つのレンジを予約し、次に新しいオブジェクトが作成された場合に必要に応じてそのレンジからのOIDを割り当て、そして最後に、トランザクションの最後に割り当てられた最高位のOIDを記録するためにSet_New_High_Water_Markを使用する。関数が成功裏に完了した時点で、それに続くReserve_Partitionに対する呼び出しが、前の高水位マークより１だけ大きいものである開始値を戻す。
下記の疑似コードはこの関数の一つの形態を実証している：
New_High_Water_Markを含むパーティションを探す
（パーティションが予約済みで、New_High_Water_Markが前の高水位マークより大きい）場合には：
begin−then
New_High_Water_Markを思い起こす
trueを戻す
end−then
そうでなければ
begin−otherwise
falseを戻す
end−otherwise
高水位マークを位置設定する
［Locate_High_Water_Mark（Partition_Number）］形式の、New_High_Water_Mark関数は、特定されたPartition_Number内で割り当てられた最後のOIDを戻す。この関数は、或る与えられたOIDが既に割り当て済みであるか否かを決定するためにも同様に利用することができる。ある与えられたOIDがそのそれぞれのパーティションについての高水位マークよりも上にある場合、それはまだ割り当てられていない。このOIDが高水位マークより下にある場合、オブジェクトによって現在も利用中であるという保証は無いが、それは既に割り当て済みである。
下記の疑似コードはこの関数の実施の一つの形態を実証している：
（Partition_Numberがパーティションの数より大きい）場合には：
begin−then
error
end−then
Partition_NumberについてのHigh_Water_Vectorの内容を戻す
レンジ内の最初のOID
［Get_First_OID_In_Range（Partition_Number）］形式の、Get_First_OID_In_Rangeと称される関数は、Partition_Numberによって特定されたパーティションの最初のOIDを戻す。この関数は、それが既に割り当て済みであるか否かに関わらずレンジの最初のOIDが戻されるような形で実行される。Get_First_OID_In_Rangeの一つの用途は、使用中の全てのOIDを探すことにあるが、前のパーティションの最後のOIDを探すためにも同様に利用される。
下記の疑似コードはこの関数の実施の一つの形態を実証している：
（Partition_Numberがパーティションの数より大きい）場合
次に
begin−then
error
end−then
（NUMBER_OF_OID_BITS_NUMBER_OF_PARTITION_BITS）＋１ビットによってPartition_Numberを左にシフトする
resultを戻す
第１の実施形態に必要とされる付加的関数
第１の実施形態において、顧客プロセス18、20、22、24とサーバープロセス26の間でOIDスペースオブジェクト80を移送するには、同時に複数の顧客プロセス18、20、22、24によってオブジェクト80が変更されるのを予防するために、サーバープロエス26がOIDスペースオブジェクト80上にロックを設けることができる必要がある。オブジェクト80のためのロックを提供する一つの方法は、オブジェクト80を瞬間更新オブジェクト（IUO）とすることによるものである。
瞬間更新オブジェクトは、一度に一つの顧客アプリケーションによってオブジェクトに対し変更を加えることが可能であり、これらの変更が一旦完了すると、現行のトランザクションメカニズムとは無関係に、それらが直ちに他の顧客アプリケーションに見えるようになるという特性を伴うオブジェクトである。これは変更を行う顧客のトランザクションが完全でない場合でも、或いは変更を行う顧客のトランザクションが最終的に放棄された場合でも言えることである。或るOBJECTのIUOとしての処理は、オブジェクト又はオブジェクトのタイプに固有のものである必要はないことに留意しなければならない。一つの実施形態においては、或るオブジェクトは、Instant  Update  Lock（瞬間更新ロック）と呼ばれる特別な種類のロックによって施錠されている場合、そして唯一その場合にのみIUOである。
或る顧客によって行われた更新を他の顧客に直ちに見えるようにすることにより、IUOは非常に高度の同時性を備えている。個々で記述したOID生成の方法はこの種の高い同時性を要求する。特に、或る顧客が１つのOIDのレンジを予約するためにOIDスペースオブジェクト80を修正した場合、他の顧客が修正されたOIDスペースオブジェクト80を見て同一のレンジを予約することを避けるものの、直ちに他のレンジを予約することを妨げられないようにするため、OIDスペースオブジェクト80はIUOとして処理される。
IUOは、複数の顧客が、他の顧客によって既に行われたオブジェクトに対する修正を見ることができるようにするものの、現在加えられている最終である修正を複数の顧客が見ることは予防しなければならない。従って、瞬間更新ロックによってOIDスペースオブジェクト80をロックすることには二重の目的がある。第１に、瞬間更新ロックの存在は、ロックされたオブジェクトをIUOとして処理するようにサーバープロセスに通知する。第２に、瞬間更新ロックの存在は、解除されるまで他の何れかの顧客がOIDスペースオブジェクト80を読むことをも同様に抑止する。
このようなロックの存在は、処理されなければならない付加的な問題点も発生させる。例えば、顧客アプリケーション１（CA1）及び顧客アプリケーション２（CA2）と呼ばれる２件の顧客アプリケーションが、瞬間更新ロックを伴うobj1及びobj2と呼ばれる２つのオブジェクトへのアクセスを要求していると考えてみよう。ここで、CA1がobj1をロックし、CA2がobj2をロックしていると仮定する。CA1がここでobj2のロックを試みた時点で、CA2が既にobj2をロック済みであることから、（上述の通り）これは抑止されることになる。次にCA2が、obj1をロックしようと試みた時点で、CA1が既にobj1をロック済みであることから、これは抑止されることになる。かくして両方のアプリケーションは、各々他方がその瞬間更新ロックを解除するのを待ちながら永遠に抑止される可能性がある。このような（デッドロックと呼ばれる）状況を回避するために、一つの実施形態は、或る顧客アプリケーションが一つの瞬間更新ロックを取得した時、当該アプリケーションは、それ以外のロックを取得する前に、その修正を加えロックを解除しなければならないといることを要求している。顧客アプリケーションが一つの瞬間更新ロックを保持しながらロックの取得を試みた場合には、エラー条件が発生する。
サーバープロセスは、各瞬間更新オブジェクトを、リスト中の１つの要素（IUO_List  Element）として維持する。各IUO_List要素には、一つのオブジェクト（即ち、OIDスペースオブプェクト）の包括的な唯一の識別子、当該オブジェクト（OIDスペースオブプェクト）のディスク表示に対するポインタ、OIDスペースオブジェクトが修正されたか否かの表示、そしてロックされた場合には下にあるOIDスペースオブジェクトをロックしたトランザクションに対するポインタが含まれている。各IUO_List要素には、リスト中の次のIUO_List要素の引用が含まれている。リストのスタートへの静的ポインタが存在する。
サーバーの機能
以下のサーバーは、読出し、書込み、コミットおよびアボート、操作による参照を永久記憶装置のデータに対して行う。
サーバー読出し処理
形式［Server_Read_Procedure（OID,Lock_Type）］の関数であるServer_Read_Procedureは、パラメータOIDに指示されるOIDを有するOIDスペースオブジェクト80を読出し、OIDスペースオブジェクト80をパラメータLock_Typeを用いて、指定タイプのロックでロックする。
以下の疑似コードは、この関数の実現の一実施例を示す。
（Lock_TypeがInstant_Update_Lock）であるならば、
その時は、
以下を開始する。
必要なOIDを含むIUO_List_Elementを探索し、（IUO_List_Elementを検出した）場合には、
その時は、
以下を開始する。
（IUO_List_Elementが別の処理でロックされている）のであれば、
その時は、
以下を開始する。
顧客の処理を待機させるように指示し、この状態を、ロックが解除されるまで続ける。
以上を終了する。
IUO_LIST_Element_lockerを要求中の処理にセットする。
以上を終了する。
以上を終了する。
（IUO_List_Elementを）検出しなければ、
以下を開始する。
IUO_List_Elementを作成する。
新規のIUO_LIST_ElementをOID_Space_Objectの各パーティションに対するIUO_Listに挿入する。
パーティションを確保していないものとして標識を付ける
以上を終了する。
（IUOがメモリにない）場合には、
その時は、
以下を開始する。
最新のIUOの状態をディスクから読出す。
以上を終了する。
以上を終了する。
OIDスペースオブジェクトを顧客に戻す。
サーバー書込み手続き
形式［Server_Weite_Procedure（OID_Space_object）］の関数Server_Write_Procedureは、パラメータOID_Space_objectによって指定されたオブジェクトをディスクに書込み、OIDスペースオブジェクト80をアンロックする。
以下の手続き、この関数の実現の一実施例である。
（現在のトランザクションがIUOをロックしている）ならば、
その時は、
以下を開始する。
IUO_List_Elementオブジェクトの古いバージョンを削除する。
IUO_List_Elementオブジェクトを（OID_Space_Object）にセットする。
IUO_List_Element_modified_indicatorを真にセットする。
IUO_List_Element_transaction_lockerを０にセットする。
現在のトランザクションがIUOをロックしていないことを指示する。
以上を終了する。
サーバーコミット手続き
形式［Severver_Commit_Procedure（）］の関数Server_Commit_Procedureは、顧客のトランザクションがコミットされる場合に、IUO_List_Elementを変更する。コミット時に、サーバーリストのIUOに保持された変更OIDスペースオブジェクト80は、ディスクに書込まれる。
以下の手続きは、この関数の実現の一実施例である。
各IUO_List_Elementに対して
以下を繰り返す。
（次のIUO_List_Element_modified_indicatorが真である）ならば、
その時は、
以下を開始する。
IUO_List_Elementオブジェクトをディスクに書き込み、
IUO_List_Element_modified_indicatorを
偽にセットする。
以上を終了する。
繰り返しを終了する。
正規のコミット手続きを続ける。
サーバーアボート手続き
この関数、Server_Abort_Procedure（）は、顧客のトランザクションが中止された場合に、IUO_List_Elementを変更する。トランザクションが中止されると、サーバーは、それが（OIDスペースオブジェクトの）瞬間更新ロックを保持しているか否かをチェックし判定し、保持している場合には、それらのロックを解除し、他の顧客がこれらのオブジェクトにアクセスできるようにする。
以下の疑似コードは、この関数の実現の一実施例を示す。
（現のトランザクションがIUOをロックしている）ならば、
その時は、
以下を開始する。
IUO_LIST_Element_Lockerを０にセットする。
現在のトランザクションがIUOをロックしていないことを指示する。
以上を終了する。
正規のアボート手続きを続ける。
サーバーのエラー回復検出および訂正
顧客のアプリケーションを確保する場合、後で、その確保を戻したりキャンセルしたりする前に、顧客のアプリケーションまたはサーバーの処理が異常に終了し、OIDの領域が確保されているのであれば、OIDスペースオブジェクト80の確保を訂正するステップを踏まなければならないことに留意されたい。ある態様では、OIDスペースオブジェクトは、すべての明らかな確保をキャンセルすることによって回復される。
要求されるOIDスペースオブジェクト80がすでにメモリに存在しないとき、OIDスペースオブジェクト80はディスクから読出され、変数Need_Recoveryが真にセットされる。この回復関数はもOIDスペースのHIgh_Water_Markベクトルかビットフラグを反復適用し、億パーティションに対し、OIDの対応範囲が確保されることを指示するために使用されるビットをクリアする。OIDスペースオブジェクト80は、メモリに読出されたばかりなので、確保される領域がないため、異常終了した以前のセッションから確保を残してから、この確保されたビットをクリアできるようにしなければならない。
種々の機能
上述の機能に加え、本発明に係るシステムの一実施例では、以下の機能も実現し機能性を向上させたが、これらの機能を実現し本発明に利用する必要はない。
使用領域
形式［Ranges_In_Use］の関数Ranges_In_Useは、現在使用中の領域数に等しい値を戻す。この数は、このOIDスペースオブジェクト80を用いてOIDを現在割り当て中の顧客のアプリケーション数に等しい。
以下の疑似コードは、この関数の実現の一実施例を示す。
Range_Countにゼロに初期化する。
各パーティションについて、
以下を繰り返す。
（パーティションが使用中に標識される）ならば、
その時は、
以下を繰り返す。
Range_Countをインクリメントする。
以上を終了する。
Range_Countを戻す。
使用される最高領域
形式［Highest_Range_Used］の関数Highest_Range_Usedは、OID割当のために使用される最大領域に等しい値に戻す。戻された領域よりも大きい領域は、割り当てられたOIDを含まないが、その逆は必ずしも正しくはないことに留意されたい。最高領域よりも低い未使用領域があることも考えられる。例えば、Ｎの顧客が領域を確保しており、その顧客のうちＫがそれぞれの確保をキャンセルし、Ｎ番目の顧客はキャンセルしなかった場合には、未使用のＫの領域が残り得る。
以下の疑似コードは、この関数の実現の一実施例を示す。
結果を０に初期化する
各パーティションについて、
以下を繰り返す。
パーティションに対するhigh  water  markを検出する。
（high  water  mark＞Start_For_Given_Range（Partition））である
ならば、
以下を行う。
結果＝パーティション。
以下を終了する。
繰り返しを終了する。
結果に戻る。
OIDサイズ
形式［Get_OID_Size］の関数Get_OID_Sizeは、OIDのビット数であり、Create_OID_Space_Object関数に対するNumber_Of_OID_Bits入力パラメータ値に等しい値を戻す。
パーティション
形式［Get_Number_Of_Partitions］の関数Get_Number_Of_Partitionsは、OIDスペースオブジェクトが作成されたパーティション数である値を戻す。この値は、Create_OID_Space_Object関数に対するNumber_Of_Partition_Bits入力パラメータに等しくなる。
OID生成の例
一意のOIDを大域的に割り当てる際に必要な処理の全体的な流れを以下の疑似コードに示す。この例のために、サーバーの処理で、OIDスペースオブジェクトを作成し、そのオブジェクトをディスクに書き込む。後になって、顧客の処理で、OIDスペースオブジェクトを要求し、サーバー処理で、OIDスペースオブジェクトをディスクから読み出し、そのオブジェクトをロックする。次に、顧客の処理はOIDの領域を確保し、OIDを確保された領域から割り当て、未使用のOIDを戻す。その後、サーバー処理で、OIDスペースオブジェクトをアンロックし、OIDスペースオブジェクトをディスクに書き込む。
／32ビットOIDと128パーティションを有するOIDスペースオブジェクトを作成する
／OIDスペースオブジェクトをディスクに書き込む
／
Create_OID_Space_Object（32,7）
Server_Write_Procedure（OID_Space_Object）
／
／サーバーはOIDスペースオブジェクトを読み出しロックする。
／
Server_Read_Procedure（OID_Space_Object,IUO_Lock）
／
／OIDスペースオブジェクトのOIDの領域を確保する。
／
Reserve_Pertition（Beginning_OID,Endin_OID）
Beginning_OIDおよびEnding_OIDを記憶する。
Number_Of_Allicated_OIDを０にセットする。
／
／サーバーは、確保された領域を用いてOIDオブジェクトを書き込み、アンロックし、／他の顧客が他の領域を確保できるようにする。
Server_Write_Procedure（OID_Space_Object）
／
／OIDを確保された領域から割り当てる。
／
割り当てられた各OIDに対するNumber_Of_Allocated_OIDsをインクリメントする。
New_High_Water_Mark＝Beginning_OID＋Number_Of_Allocated_OIDs
／
／確保された領域を戻す。
／    OIDスペースオブジェクトを読み出す
／    新規のhigh  water  markをセットする。
／          OIdスペースオブジェクトを書き込む。
／
Server_Read_Procedure（OID_Space_Object,IUO_Lock）
Set_New_High_Water_Mark（New_High_Water_Mark）
Server_Write_Procedure（OID_Space_Object）
上述の実施例は、OIDスペースオブジェクト80を無限数の等しいパーティションに区分するが、そのようなことは必ずしも必要ないことに留意されたい。OIDスペースオブジェクト80を作成し、そのオブジェクトスペースを区分する関数は、大した手間をかけずに、アルゴリズムを利用してそのスペースを不平等なパーティションに区分することができる。したがって、相当数の大きなパーティションを有して多数のオブジェクトを作成する顧客のプログラムのニーズを満たし、より少数のパーティションを有して少数のオブジェクトを作成する顧客のプログラムのニーズを満たすことができるであろう。
さらに、顧客の処理が現在ある領域を要求してはいるが、顧客の処理が限定数のOIDを（例えば、200OID）、あるいは、OIDの領域のセット（例えば200乃至400までと800乃至1200までのOID）を要求することもできる。これらの変更は、本文に記載した本発明の概要から逸脱することはない。
好ましい実施例を示してきたが、当業者らには特許請求の範囲および精神の範囲内で、多くの変更が可能であることは理解できよう。従って、本発明は、特許請求の範囲によって指示された如き以外で制限する意図はない。
【図１】
0003689713.tif 000002
【図２】
0003689713.tif 000003
【図３】
0003689713.tif 000004
【図４】
0003689713.tif 000005
【図５】
0003689713.tif 000006
【図６】
0003689713.tif 000007