(57)【要約】【課題】本発明は、非決定的選択実行を許す同期型通信サーバを用いて、タイムアウトを非決定的選択の選択肢のひとつとして実行するための技術の提供を目的とする。【解決手段】クライアントから送られてくる通信リクエストがタイムアウト選択肢を持つ場合に、その指示する時間の経過を判断して、時間経過を判断する場合に、その通信リクエストに、その旨を伝達する。そして、その通信リクエストについての同期処理の進行状況を判断して、同期処理完了を示している場合には時間経過を無視し、同期処理が始まっていないことを示している場合には同期処理を中止し、同期処理が進行中であることを示している場合には、その通信リクエストに対応付けて設けられて同期処理の際に参照されることになる領域に、タイムアウトしたことを記録することで、時間経過を無視するか時間経過をクライアントに通知する処理のいずれかが実行されるようにする。【選択図】図１２
2005250518.tif 000002
【特許請求の範囲】
【請求項１】
通信ネットワークを介して相互に接続され、複数の通信選択肢から構成されて同期処理単位を構成する通信リクエストの非決定的選択実行を許す同期型通信サーバにおいて、
クライアントから送られてくる通信リクエストがタイムアウト選択肢を持つ場合に、該タイムアウト選択肢の指示する時間の経過を判断して、その時間経過を判断する場合に、該タイムアウト選択肢を持つ通信リクエストに、その旨を伝達する手段と、
上記時間経過の伝達された通信リクエストについての同期処理の進行状況を判断する手段と、
上記進行状況が同期処理完了を示している場合には上記時間経過を無視し、同期処理が始まっていないことを示している場合には該同期処理を中止し、同期処理が進行中であることを示している場合には、上記時間経過の伝達された通信リクエストに対応付けて設けられて同期処理の際に参照されることになる領域に、タイムアウトしたことを記録することで、上記時間経過を無視するか上記時間経過をクライアントに通知する処理のいずれかが実行されるようにする手段とを備えることを、
特徴とする同期型通信サーバ。
【請求項２】
請求項１に記載の同期型通信サーバにおいて、
上記領域として、進行中の同期処理を待機する別の同期処理についての情報の記録のために用意される領域が用いられることを、
特徴とする同期型通信サーバ。
【請求項３】
請求項１又は２に記載の同期型通信サーバにおいて、
上記領域にタイムアウトが記録されることで、進行中であった上記時間経過の伝達された通信リクエストの同期処理が成功する場合には上記時間経過が無視され、該同期処理が不成功となる場合には上記時間経過がクライアントに通知されるように構成されることを、
特徴とする同期型通信サーバ。
【請求項４】
通信ネットワークを介して相互に接続され、複数の通信選択肢から構成されて同期処理単位を構成する通信リクエストの非決定的選択実行を許す同期型通信サーバで実行される同期型通信方法であって、
クライアントから送られてくる通信リクエストがタイムアウト選択肢を持つ場合に、該タイムアウト選択肢の指示する時間の経過を判断して、その時間経過を判断する場合に、該タイムアウト選択肢を持つ通信リクエストに、その旨を伝達する過程と、
上記時間経過の伝達された通信リクエストについての同期処理の進行状況を判断する過程と、
上記進行状況が同期処理完了を示している場合には上記時間経過を無視し、同期処理が始まっていないことを示している場合には該同期処理を中止し、同期処理が進行中であることを示している場合には、上記時間経過の伝達された通信リクエストに対応付けて設けられて同期処理の際に参照されることになる領域に、タイムアウトしたことを記録することで、上記時間経過を無視するか上記時間経過をクライアントに通知する処理のいずれかが実行されるようにする過程とを備えることを、
特徴とする同期型通信方法。
【請求項５】
請求項４に記載の同期型通信方法において、
上記領域として、進行中の同期処理を待機する別の同期処理についての情報の記録のために用意される領域が用いられることを、
特徴とする同期型通信方法。
【請求項６】
請求項４又は５に記載の同期型通信方法において、
上記領域にタイムアウトが記録されることで、進行中であった上記時間経過の伝達された通信リクエストの同期処理が成功する場合には上記時間経過が無視され、該同期処理が不成功となる場合には上記時間経過がクライアントに通知されるように構成されることを、
特徴とする同期型通信方法。
【請求項７】
請求項４ないし６のいずれか１項に記載の同期型通信方法の実現に用いられる処理をコンピュータに実行させるための同期型通信プログラム。
【請求項８】
請求項４ないし６のいずれか１項に記載の同期型通信方法の実現に用いられる処理をコンピュータに実行させるための同期型通信プログラムを記録した記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、通信ネットワークを介して相互に接続され、複数の通信選択肢から構成されて同期処理単位を構成する通信リクエストの非決定的選択実行を許す同期型通信サーバと、その同期型通信サーバで実行される同期型通信方法と、その同期型通信方法の実現に用いられる同期型通信プログラムと、その同期型通信プログラムを記録した記録媒体とに関する。
【背景技術】
【０００２】
本発明の背景技術の説明に入る前に、これから使用する用語について説明しておく。
【０００３】
（ｉ）チャネル
チャネルとは、通信を行う際に用いられるキーワードである。同じキーワードを持つ異なるプロセス間で、通信が行われる。
【０００４】
（ii）同期型通信
同期型通信とは、送信側と受信側とが同期する通信方式である。たとえば、チャネルｃにデータ「１２３」を送信するプロセスＡの動作と、チャネルｃからデータを受信するプロセスＢの動作とが同期することを考える。このとき、プロセスＡのデータ「１２３」の送信が完了したとき、かつ、そのときに限り、プロセスＢはデータ「１２３」の受信を完了している。送信側と受信側とが同期することで、ユーザがａｃｋメッセージなどによる同期をとる必要がない。
【０００５】
（iii)非決定的選択実行
非決定的選択実行とは、送信または受信の複数の通信選択肢（本発明のアクティブパートに相当するもの）でもって通信リクエスト（本発明のパッシブパートに相当するもの）が構成される場合にあって、通信リクエストに属する通信選択肢のうち、ただ一つの通信選択肢のみが成功し、残りの通信選択肢は失敗（通信選択肢が消去される）するような通信の実行をいう。
【０００６】
たとえば、非決定的選択実行では、図２２に示すように、
｛「チャネルｃにデータ「１２３」を送信する（通信選択肢Ａ）」，
「チャネルｄからデータを受信する（通信選択肢Ｂ）」｝
という動作を行うプロセスＸと、
｛「チャネルｃからデータを受信する（通信選択肢Ｃ）」，
「チャネルａからデータを受信する（通信選択肢Ｄ）」｝
という動作を行うプロセスＹとが並行に動作している場合に、通信選択肢（Ａ）と通信選択肢（Ｃ）とが成功して、プロセスＸからプロセスＹにデータ「１２３」が送信され、通信選択肢（Ｂ）と通信選択肢（Ｄ）とは消去されることになる。
【０００７】
次に、本発明の背景技術について説明する。
【０００８】
同期型の通信システムが知られている。このシステムでは、通信サーバをネットワーク内に配置し、各クライアントがサーバへのデータの投入および読みだしを行うことによって、クライアント間で情報を共有・交換できる利点を有する。
【０００９】
また、同期型通信システムのなかでも、非決定的選択実行を許す同期型通信サーバが知られている（例えば、非特許文献１参照）。このシステムでは、通信時における非決定的選択処理を実行できる利点を有する。
【００１０】
これらのシステムでは、いわゆる二層コミットに基づくプロトコルを用いて同期型通信を実現する。すなわち、送信の通信選択肢の親となる通信リクエストと、受信の通信選択肢の親となる通信リクエストのそれぞれに対してロックをかけ、ロックが成功した後に必要なデータを送信する。
【００１１】
なお、本発明者は、下記に示す特許文献１で、クライアントから、送信の通信選択肢と受信の通信選択肢とが混在する通信リクエストを受信すると、先ず最初に、受信の通信選択肢の親となる通信リクエストにロックをかけ、続いて、送信の通信選択肢の親となる通信リクエストにロックをかけるようにすることで、同期型通信の際に送受信される制御メッセージの数を削減するという発明を開示している。
【非特許文献１】E.Horita and K.Mano, "Nepi: A Network Programming Language Based on the π-calculus", in COORDlNATlON 96, LNCS Vol.1061, Springer, pp.424-427, 1996
【特許文献１】特開２００３−１４０９１１
【発明の開示】
【発明が解決しようとする課題】
【００１２】
通信を伴う計算機プログラムやプロトコルを簡潔に記述し実行するための方法として、非決定的選択実行を許す同期型通信サーバを利用したプログラミングシステムが知られている。このようなプログラミングシステムの処理系は、非決定的選択実行を許す同期型通信サーバを用いてユーザが記述したプログラムを実行する。
【００１３】
非決定的選択実行を許す同期型通信サーバを用いる通信処理には、複数の通信選択肢を非決定的選択実行を許す同期型通信サーバが排他的に選択し実行できる利点がある。その選択肢として、さらにタイムアウトを実行することができれば、より柔軟な入出力処理を行うことが可能となる。
【００１４】
しかしながら、従来技術では、非決定的選択実行を許す同期型通信サーバを用いる通信処理において、タイムアウトを実行する機能を提供していない。
【００１５】
このようなことを背景にして、本発明者は、「Ken Mano and Yoshinobu Kawabe : Nepi: syntax, semantics and implementation, in SCI 2001 Vol.XIV pp.326-331」で、非決定的選択実行を許す同期型通信サーバを用いたタイムアウトを排他的選択の選択肢のひとつとして実行するための計算機プログラムの命令を提案した。
【００１６】
しかしながら、本発明者の提案はここまでにとどまっており、その命令をどのように実現するのかについては開示していない。
【００１７】
本発明はかかる事情に鑑みてなされたものであって、その目的とするところは、非決定的選択実行を許す同期型通信サーバを用いて、タイムアウトを非決定的選択の選択肢のひとつとして実行するための技術を提供することである。
【課題を解決するための手段】
【００１８】
この目的を達成するために、本発明の同期型通信サーバは、通信ネットワークを介して相互に接続され、複数の通信選択肢から構成されて同期処理単位を構成する通信リクエストの非決定的選択実行を許す通信処理を行うときにあって、（１）クライアントから送られてくる通信リクエストがタイムアウト選択肢を持つ場合に、そのタイムアウト選択肢の指示する時間の経過を判断して、その時間経過を判断する場合に、そのタイムアウト選択肢を持つ通信リクエストに、その旨を伝達する第１の手段と、（２）時間経過の伝達された通信リクエストについての同期処理の進行状況を判断する第２の手段と、（３）進行状況が同期処理完了を示している場合には時間経過を無視し、同期処理が始まっていないことを示している場合には同期処理を中止し、同期処理が進行中であることを示している場合には、時間経過の伝達された通信リクエストに対応付けて設けられて同期処理の際に参照されることになる領域に、タイムアウトしたことを記録することで、時間経過を無視するか時間経過をクライアントに通知する処理のいずれかが実行されるようにする第３の手段とを備えるように構成する。
【００１９】
以上の各処理手段が動作することで実現される本発明の同期型通信方法はコンピュータプログラムで実現できるものであり、このコンピュータプログラムは、半導体メモリなどのような適当な記録媒体に記録して提供されたり、ネットワークを介して提供され、本発明を実施する際にインストールされてＣＰＵなどの制御手段上で動作することにより本発明を実現することになる。
【００２０】
このように構成される本発明の同期型通信サーバでは、クライアントから送られてくる通信リクエストがタイムアウト選択肢を持つと、そのタイムアウト選択肢の指示する時間の経過を判断して、その時間経過を判断する場合に、そのタイムアウト選択肢を持つ通信リクエストに、その旨を伝達する。
【００２１】
このようにして、タイムアウト選択肢を持つ通信リクエストがタイムアウトすると、その通信リクエストに時間経過が伝達されることになるので、通信リクエストに時間経過が伝達されると、その通信リクエストについて同期処理の進行状況を判断する。
【００２２】
この判断処理に従って、受信側の通信リクエストから同期処理のロックがかけられる場合で説明するならば、（ｉ）受信側の通信リクエストと送信側の通信リクエストのそれぞれにロックがかけられ、通信リクエストの非決定的選択実行が終了していることで同期処理が既に完了している場合と、（ii）受信側の通信リクエストにロックがかけられていないことで同期処理が始まっていない場合と、(iii）受信側の通信リクエストにはロックがかけられたものの、送信側の通信リクエストにはロックがかけられていないことで同期処理が進行中である場合、という３つの進行状況の内のいずれかを判断することになる。
【００２３】
これから、この判断処理を受けて、進行状況が同期処理の完了を示している場合には、既に通信リクエストの非決定的選択実行が終了していることに対応させて、時間経過を無視するように処理する。
【００２４】
一方、進行状況が同期処理の未開始を示している場合には、タイムアウトしたことに対応させて、同期処理を中止するように処理する。
【００２５】
一方、進行状況が同期処理の進行中であることを示している場合には、時間経過の伝達された通信リクエストに対応付けて設けられて同期処理の際に参照されることになる領域に、タイムアウトしたことを記録することで、時間経過を無視するか時間経過をクライアントに通知する処理のいずれかが実行されるように処理する。
【００２６】
このタイムアウトの記録に従って、進行中であった時間経過の伝達された通信リクエストの同期処理が成功する場合には、この記録が参照されないことで時間経過が無視されることになり、一方、進行中であった時間経過の伝達された通信リクエストの同期処理が不成功となる場合には、この記録が参照されることで、時間経過がクライアントに通知されることになる。
【００２７】
ここで、通信リクエストの非決定的選択実行を実現するにあたって、進行中の同期処理が不成功となる場合があることを考慮して、後続の同期処理を待機させる構成を採ることがあり、この構成を採る場合には、通信リクエストに対応付けて、進行中の同期処理を待機する同期処理についての情報を記録する領域を用意して、進行中の同期処理が不成功となる場合には、その領域に記録される同期処理を格上げしていくように処理することになる。
【００２８】
そこで、この待機する同期処理についての情報を記録する領域が用意される場合には、その領域にタイムアウトしたことを記録することが好ましい。
【００２９】
そのようにすると、進行中であった通信リクエストの同期処理が不成功となる場合に、その領域を参照するという本来の非決定的選択実行処理をそのまま利用する形で、その通信リクエストが既にタイムアウトしているのか否かを検出することが可能となるからである。
【発明の効果】
【００３０】
以上説明したように、本発明によれば、非決定的選択実行を許す同期型通信サーバを用いて、タイムアウトを非決定的選択の選択肢のひとつとして実行することができるようになる。
【００３１】
これにより、本発明によれば、非決定的選択実行を許す同期型通信サーバを利用したプログラミングシステムの利用価値を大きく高めることができるようになる。
【発明を実施するための最良の形態】
【００３２】
以下、実施の形態に従って本発明を詳細に説明する。
【００３３】
図１に、本発明の適用されるネットワークシステムの一例を図示する。
【００３４】
この図に示すように、本発明の適用されるネットワークシステムは、ネットワーク３により接続された非決定的選択実行を許す複数の同期型通信サーバ１-i（ｉ＝１〜Ｎ）と、同期型通信サーバ１-iに対応付けて設けられて、対となる同期型通信サーバ１-iに通信リクエストを発行するクライアント２-i（ｉ＝１〜Ｎ）とから構成される。
【００３５】
この同期型通信サーバ１-iは、図２に示すように、共有メモリ１０と、ネットワークコントローラ１１と、パッシブパート処理部１２と、タイムアウトパート処理部１３と、アクティブパート処理部１４とを備える。
【００３６】
ここで、これらの各処理部はメモリ上に展開されてＣＰＵにより実行される。ただし、共有メモリ１０についてはパッシブパート処理部１２の内部に配置されることになる。
【００３７】
〔１〕本発明の概要
次に、本発明の概要について説明する。
【００３８】
〔１−１〕ネットワークコントローラ１１の概要
ネットワークコントローラ１１は、受信バッファと呼ばれる内部記憶装置（ＦＩＦＯキュー）を持ち、ネットワーク３からデータを受信すると、受信バッファにそのデータを蓄える。
【００３９】
また、ネットワークコントローラ１１は、パッシブパート処理部１２またはアクティブパート処理部１４から受信要求を受けたときに、受信バッファからデータを取り出して返す。このとき、受信バッファにデータがない場合はｎｕｌｌを返す。
【００４０】
さらに説明するならば、ネットワークコントローラ１１は、パッシブパート処理部１２またはアクティブパート処理部１４から、
＜送信先に関する宛先情報，データ本体＞
という形式のメッセージを受け取ると、そのメッセージをいったん内部記憶に格納し、送信先に関する宛先情報とデータ本体とを取り出して内部記憶に再格納して、データ本体を宛先となる同期型通信サーバ１-iに向けてネットワーク３を通じて送信する。
【００４１】
ここで、上記の「送信先に関する宛先情報」とは、次に説明するパッシブパート処理部１２やアクティブパート処理部１４の識別子である。
【００４２】
〔１−２〕アクティブパート処理部１４の概要
アクティブパート処理部１４は、アクティブパート（図２２に示したような通信選択肢）を処理する。
【００４３】
このアクティブパート処理部１４は、図３に示すように、ＡＣＴと呼ばれる記憶領域と、ＬＫ１と呼ばれる記憶領域とを持ち、ネットワークコントローラ１１から、
<"try", a >   ：  アクティブパートａとデータの受け渡し要求が合致するアク
ティブパートがＡＣＴにあるかを調べよというメッセージ
<"fail", a >  ：  ＬＫ１からアクティブパートａを削除して、それをＡＣＴに
戻せというメッセージ
<"fin", a >   ：  ＬＫ１、ＡＣＴからアクティブパートａを削除しろというメ
ッセージ
というメッセージを受け取る。
【００４４】
さらに、データの受け渡し要求に合致するアクティブパートの組を見つけた場合には、ネットワークコントローラ１１に対して、
<"lock1", r, s >  ：  このアクティブパートの組がデータの受け渡し要求に合致
したということを通知するメッセージ（通知先は受信側の
アクティブパートｒを持つパッシブパートを処理するパッ
シブパート処理部１２
というメッセージを送る。
【００４５】
ここで、"lock1" メッセージは、受信側のアクティブパートｒを持つパッシブパートをロックしろというメッセージとして使われる。
【００４６】
ＡＣＴには、ネットワークコントローラ１１から受け取ったアクティブパートが格納されることになる。また、ＬＫ１には、データの受け渡し要求が合致したアクティブパートが格納されることになる。ここで、ＬＫ１に格納されたアクティブパートについては、ＡＣＴから削除されることになる。
【００４７】
アクティブパート処理部１４は、ネットワークコントローラ１１から受け取ったアクティブパートをＡＣＴに格納するとともに、ネットワークコントローラ１１から受け取ったアクティブパートとデータの受け渡し要求が合致するアクティブパートがＡＣＴにあるのかを調べて、データの受け渡し要求が合致するアクティブパートの組が見つかると、受信側のアクティブパートを持つパッシブパートをロックすべく、受信側のアクティブパートｒを持つパッシブパートを処理するパッシブパート処理部１２に対して"lock1" メッセージを送出する。
【００４８】
〔１−３〕タイムアウトパート処理部１３の概要
タイムアウトパート処理部１３は、クライアント２-iから発行される非決定的選択実行を許す同期型通信サーバ１-iへの通信リクエストの一部として用いられるタイムアウトパート（タイムアウトするまでの時間について記述する）を処理する。
【００４９】
タイムアウトパート処理部１３は、図４に示すように、クライアント２-iから受け取るパッシブパート（通信リクエスト）がタイムアウトパートを持つ場合に、パッシブパート処理部１２により生成されて、そのタイムアウトパートの記述する時間が経過すると、パッシブパート処理部１２の持つfromClientという記憶領域に、そのタイムアウトパートを書き込む処理を行う。
【００５０】
〔１−４〕パッシブパートの概要
パッシブパート処理部１２の処理するパッシブパート（通信リクエスト）は、アクティブパートの集合と、タイムアウトパート（ｎｕｌｌのこともある）とを持つ。さらに、図５に示すように、ＬＫ１と呼ばれる領域と、ＬＫ２と呼ばれる領域とを持つ。
【００５１】
このＬＫ１には、上述した"lock1" メッセージに従って、データの受け渡し要求が合致したアクティブパートの組の受信側のアクティブパートが書き込まれることになる。ここで、別々のアクティブパート処理部１４から "lock1"メッセージが通知されてくる場合もあるので、複数のアクティブパートが書き込まれることがある。ただし、パッシブパート処理部１２は、それまで空であった場合にだけ、後述する"lock2" メッセージを送信することになる。
【００５２】
一方、ＬＫ２には、ＬＫ１にアクティブパートが書き込まれていることで同期処理のロックが進行中である場合に、その同期処理を待機する別の同期処理についての情報（具体的には、データの受け渡し要求が合致したアクティブパートの組の情報）が書き込まれることになる。
【００５３】
〔１−５〕パッシブパート処理部１２の概要
パッシブパート処理部１２は、パッシブパート（アクティブパートの集合で構成される通信リクエスト）を処理する。
【００５４】
このパッシブパート処理部１２は、図６に示すように、ＰＡＳと呼ばれる記憶領域と、fromClientと呼ばれる記憶領域と、ＤＯＮＥと呼ばれる記憶領域とを持ち、ネットワークコントローラ１１から、
<"lock1", r, s >  ：  上述したメッセージ。受信側のアクティブパートｒを持つ
パッシブパートをロックしろというメッセージ
<"lock2", r, s >  ：  送信側のアクティブパートｓを持つパッシブパートをロッ
クしろというメッセージ
<"val", r, date > ：  アクティブパートｒのデータを受信しろというメッセージ
<"cancel", r, null >：アクティブパートｒのロックを解除しろというメッセージ
というメッセージを受け取る。
【００５５】
さらに、"lock1" メッセージに応答してパッシブパートをロックできた場合には、ネットワークコントローラ１１に対して、
<"lock2", r, s >  ：  送信側のアクティブパートｓを持つパッシブパートをロッ
クしろというメッセージ（通知先は送信側のアクティブパ
ートｓを持つパッシブパートを処理するパッシブパート処
理部１２）
というメッセージを送信する。
【００５６】
ＰＡＳには、クライアント２-iから受け取ったパッシブパートの集合が格納されることになる。fromClientには、クライアント２-iから受け取ったパッシブパートが一時的に格納されるとともに、タイムアウトパート処理部１３から受け取ったタイムアウトパートが一時的に格納されることになる。ＤＯＮＥには、クライアント２-iへの返答メッセージの集合が格納されることになる。ここで、クライアント２-iへ返答したパッシブパートについては、ＰＡＳから削除されることになる。
【００５７】
パッシブパート処理部１２は、fromClientからパッシブパートを読み出し、そのパッシブパートで指定されるアクティブパートの集合を得ると、ネットワークコントローラ１１を介して、それらのアクティブパートについての処理を指示する上述した"try" メッセージをアクティブパート処理部１４に送る。
【００５８】
この"try" メッセージを受け取ると、アクティブパート処理部１４は、上述した"lock1" メッセージを送信してくる。
【００５９】
パッシブパート処理部１２は、この"lock1" メッセージを受け取ると、別の"lock1" メッセージによってパッシブパートがロックされていないかを調べて（上述したパッシブパートのＬＫ１領域を参照することで調べる）、ロックできた場合には、"lock2" メッセージを送信する。
【００６０】
一方、パッシブパート処理部１２は、"lock2" メッセージを受け取ると、その"lock2" メッセージで指定されるパッシブパートが別の"lock1" メッセージによってロックされていないかを調べて（上述したパッシブパートのＬＫ１領域を参照することで調べる）、ロックできた場合には、同期処理が完了したことを判断して、受信側のパッシブパートを処理するパッシブパート処理部１２に対して"val" メッセージを送信する。
【００６１】
この処理にあって、パッシブパート処理部１２は、"lock2" メッセージを受け取るときにあって、別の"lock1" メッセージによってパッシブパートがロックされている場合に、そのまま同期処理を諦めるのではなくて、他の同期処理が待機していない場合には（上述したパッシブパートのＬＫ２領域を参照することで調べる）、ある判断基準を用いて、"lock2" メッセージで通知されるデータの受け渡し要求が合致するアクティブパートの組を待機させるのか否かを判断して、その判断基準を充足する場合には、そのアクティブパートの組の同期処理を待機させる。そして、そのロックが解除される場合には、その待機させた同期処理を格上げして同期処理を行う。
【００６２】
パッシブパート処理部１２は、fromClientに格納されるパッシブパートを順番に読み出していくときにあって、タイムアウトパート処理部１３により書き込まれたタイムアウトパートを読み出すと、そのタイムアウトパートを持つパッシブパートがＰＡＳに格納されているのか否かを判断して、格納されていない場合には、既にそのパッシブパート（通信リクエスト）についての非決定的選択実行が終了していることに対応させて、タイムアウトを無視するように処理する。
【００６３】
一方、タイムアウトしたパッシブパートがＰＡＳに格納されている場合にあって、そのパッシブパートが未だロックされていない場合には（上述したパッシブパートのＬＫ１領域を参照することで調べる）、タイムアウトしたことに対応させて、そのパッシブパートについての同期処理を中止するように処理する。
【００６４】
一方、タイムアウトしたパッシブパートがＰＡＳに格納されている場合にあって、そのパッシブパートが既にロックされている（上述したパッシブパートのＬＫ１領域を参照することで調べる）ことで、同期処理が進行中である場合には、ロック中の同期処理を待機する同期処理について記録する領域（上述したパッシブパートのＬＫ２領域）に、タイムアウトしたタイムアウトパートを書き込む。
【００６５】
このようにタイムアウトパートを書き込んでおくと、ロック中の同期処理が成功した場合には、送信側から上述した"val" メッセージが送られてきてクライアント２-iにデータが渡されて、タイムアウトパートの書き込みに関係なく処理が終了する。
【００６６】
一方、ロック中の同期処理が不成功となった場合（その同期処理の送信側のパッシブパートのＬＫ１領域が空でないことで、ロックがかけられない場合）には、そのロック中の同期処理を待機する別の同期処理があるのか否かを調べるべく、ロック中の同期処理を待機する同期処理について記録する領域（上述したパッシブパートのＬＫ２領域）を参照することになるが、タイムアウトパートの書き込みにより、タイムアウトしていることが分かるので、クライアント２-iに対してタイムアウトしたことが通知されることになる。
【００６７】
〔１−６〕処理の一例
次に、このように構成されるネットワークコントローラ１１／パッシブパート処理部１２／タイムアウトパート処理部１３／アクティブパート処理部１４により実現される本発明の処理の一例について説明する。
【００６８】
〔１−６−１〕図７の処理
図７は、アクティブパート処理部１４において、受信側のアクティブパートａ２と送信側のアクティブパートｂ３とのデータの受け渡し要求が合致して、最終的に同期処理が成功した場合の処理例である。
【００６９】
この場合、ａ２とｂ３とを指定する"lock1" メッセージが、ａ２を持つパッシブパートＡを処理するパッシブパート処理部１２に送られる。このとき、パッシブパートＡのＬＫ１領域が空であることで、ＬＫ１領域にａ２が書き込まれ、これにより仮押えのロックがとれる。
【００７０】
続いて、ａ２とｂ３とを指定する"lock2" メッセージが、ｂ３を持つパッシブパートＢを処理するパッシブパート処理部１２に送られる。このとき、パッシブパートＢのＬＫ１領域が空であることが検出されると、本押えのロックに成功して、ａ２のデータを転送するという"val" メッセージが送られて、そのデータがクライアント２-iに渡されることになる。
【００７１】
〔１−６−２〕図８の処理
図８は、アクティブパート処理部１４において、受信側のアクティブパートａ２と送信側のアクティブパートｂ３とのデータの受け渡し要求が合致したものの、最終的に同期処理が失敗した場合の処理例である。
【００７２】
この場合、ａ２とｂ３とを指定する"lock1" メッセージが、ａ２を持つパッシブパートＡを処理するパッシブパート処理部１２に送られる。このとき、パッシブパートＡのＬＫ１領域が空であることで、ＬＫ１領域にａ２が書き込まれ、これにより仮押えのロックがとれる。
【００７３】
続いて、ａ２とｂ３とを指定する"lock2" メッセージが、ｂ３を持つパッシブパートＢを処理するパッシブパート処理部１２に送られる。このとき、パッシブパートＢのＬＫ１領域に、別の同期処理の仮押えが成立していることを示すアクティブパートｂ１が書き込まれていることを検出する。
【００７４】
そこで、ａ２とｂ１とをある基準で比較して、ａ２のロックを待機させるのか否かを判断する。この例では、ａ２が待機する同期処理として選ばれないことを想定しており、パッシブパートＢのＬＫ２領域には何も書き込まれない。
【００７５】
本押えのロックに失敗し、さらに、待機状態にも入らないことが決まったので、ａ２の仮押えを解除すべく、ａ２を指定する"cancel"メッセージが、ａ２を持つパッシブパートＡを処理するパッシブパート処理部１２に送られる。
【００７６】
〔１−６−３〕図９の処理
図９は、アクティブパート処理部１４において、受信側のアクティブパートａ２と送信側のアクティブパートｂ３とのデータの受け渡し要求が合致したものの、本押えのロックに失敗して待機に入った場合の処理例である。
【００７７】
この場合、ａ２とｂ３とを指定する"lock1" メッセージが、ａ２を持つパッシブパートＡを処理するパッシブパート処理部１２に送られる。このとき、パッシブパートＡのＬＫ１領域が空であることで、ＬＫ１領域にａ２が書き込まれ、これにより仮押えのロックがとれる。
【００７８】
続いて、ａ２とｂ３とを指定する"lock2" メッセージが、ｂ３を持つパッシブパートＢを処理するパッシブパート処理部１２に送られる。このとき、パッシブパートＢのＬＫ１領域に、別の同期処理の仮押えが成立していることを示すアクティブパートｂ１が書き込まれていることを検出する。
【００７９】
そこで、ａ２とｂ１とをある基準で比較して、ａ２のロックを待機させるのか否かを判断する。この例では、ａ２が待機する同期処理として選ばれたことを想定しており、これにより、ａ２とｂ３との組の同期処理が待機に入ったことを示すべく、パッシブパートＢのＬＫ２領域に、ａ２とｂ３との組の情報が書き込まれる。
【００８０】
待機状態に入ったので、ａ２の仮押えは解除されず、パッシブパートＢのＬＫ１領域に書き込まれているｂ１の本押えが成功するのか失敗するのか待つことになる。
【００８１】
〔１−６−４〕図１０の処理
図１０は、図９で待機状態に入った後に、待機状態に入る原因となったｂ１の本押えが成功した場合の処理例である。
【００８２】
この場合には、ｂ１を持つパッシブパートＢを処理するパッシブパート処理部１２に対して、送信側から、ｂ１のデータを転送するという"val" メッセージが送られてくるので、このパッシブパート処理部１２は、それを受け取ってデータをクライアント２-iに渡す。さらに、待機状態は意味がなくなったので、待機状態にあったａ２の仮押えを解除すべく、ａ２を指定する"cancel"メッセージを、ａ２を持つパッシブパートＡを処理するパッシブパート処理部１２に送る。
【００８３】
〔１−６−５〕図１１の処理
図１１は、図９で待機状態に入った後に、待機状態に入る原因となったｂ１の本押えが失敗した場合の処理例である。
【００８４】
この場合には、ｂ１を持つパッシブパートＢを処理するパッシブパート処理部１２に対して、送信側から、ｂ１の仮押えをキャンセルする"cancel"メッセージが送られてくるので、このパッシブパート処理部１２は、パッシブパートＢのＬＫ１領域に書き込まれているｂ１を消去する。さらに、待機状態を格上げして、ａ２とｂ３との組の同期処理が成功したことに対応させて、ａ２を持つパッシブパートを処理するパッシブパート処理部１２に対して、ａ２のデータを転送するという"val" メッセージを送る。
【００８５】
〔１−６−６〕図１２の処理
図１２は、タイムアウトパートに係る処理の説明図である。
【００８６】
この図に示すように、パッシブパート処理部１２は、クライアント２-iから受け取るパッシブパート（通信リクエスト）がタイムアウトパートを持つ場合には、タイムアウトパート処理部１３を生成する。このようにして生成されると、タイムアウトパート処理部１３は、そのタイムアウトパートの記述する時間が経過するときに、パッシブパート処理部１２の持つfromClientに、そのタイムアウトパートを書き込む処理を行う。
【００８７】
一方、パッシブパート処理部１２は、fromClientからタイムアウトパート処理部１３により書き込まれたタイムアウトパートを読み出すときに、そのタイムアウトパートを持つパッシブパートについての同期処理が終了している場合には、タイムアウトを無視するように処理する。
【００８８】
一方、そのタイムアウトを持つパッシブパートのＬＫ１領域がｎｕｌｌであることで、そのパッシブパートについての同期処理が未だ開始していない場合には、その同期処理を中止するように処理する。
【００８９】
一方、そのタイムアウトパートを持つパッシブパートについての同期処理が進行中である場合には、そのパッシブパートのＬＫ２領域がｎｕｌｌであるのか否かを判断する。そして、そのＬＫ２領域がｎｕｌｌでない場合には、待機中の別の同期処理があることにより、そのＬＫ２領域にタイムアウトパートを書き込むことができないので、タイムアウトを無視するように処理する。一方、そのＬＫ２領域がｎｕｌｌである場合には、そのＬＫ２領域にタイムアウトパートを書き込むように処理する。
【００９０】
このようにして、パッシブパートのＬＫ２領域にタイムアウトパートが書き込まれると、図１３に示すように、その後の処理に応じて、パッシブパート処理部１２に"val" メッセージが送られてくる場合にはタイムアウトが無視され、一方、パッシブパート処理部１２に"cancel"メッセージが送られてくる場合にはタイムアウトがクライアント２-iに通知されることになる。
【００９１】
ここで、ＬＫ２領域がｎｕｌｌでない場合に、上書きする形で、ＬＫ２領域にタイムアウトパートを書き込むようにしてもよい。
【００９２】
〔２〕本発明の詳細
次に、本発明の詳細について説明する。
【００９３】
なお、以下の説明では、説明の便宜上、アクティブパートを通信リクエスト、タイムアウトパートを通信リクエストの一部を構成するもの、パッシブパートを通信リクエストの集合という概念で記載している。
【００９４】
〔２−１〕パッシブパート処理部１２とアクティブパート処理部１４とタイムアウトパート処理部１３
パッシブパート処理部１２、アクティブパート処理部１４、タイムアウトパート処理部１３について説明する。
【００９５】
パッシブパート処理部１２とアクティブパート処理部１４とタイムアウトパート処理部１３とは、それぞれ識別子を持つ。この識別子は、ネットワークコントローラ１１の説明で導入した「送信先に関する宛先情報」として用いられる。
【００９６】
パッシブパート処理部１２は、タイムアウト処理のために、タイムアウトパート処理部１３を動的に新規生成し起動する。生成されるたびに、タイムアウトパート処理部１３はメモリ上に展開される。生成されたタイムアウトパート処理部１３は、同期型通信サーバ１-iの中でそれらを識別する通し番号を持つ。
【００９７】
パッシブパート処理部１２とアクティブパート処理部１４とタイムアウトパート処理部１３とは、以下のフォーマットのデータ（それぞれ、パッシブパートと呼ばれるデータとアクティブパートと呼ばれるデータとタイムアウトパートと呼ばれるデータ）を扱う。
【００９８】
〔２−２〕アクティブパートのフォーマット
アクティブパートは、
＜ｃＦＲ，ｐＦＲ，ｐＩＤ，ａＩＤ，ｂｏｄｙ＞
という５項組のレコードで構成される。
【００９９】
これらの各フィールドの意味は、
・ｃＦＲ  ：  アクティブパート処理部１４の識別子
・ｐＦＲ  ：  パッシブパート処理部１２の識別子
・ｐＩＤ  ：  パッシブパートの識別子
・ａＩＤ  ：  アクティブパートの識別子
・ｂｏｄｙ：  通信リクエスト本体
通信リクエストは、以下のどちらかのフォーマットに従う
＜！，＜ｃＦＲ，ｃｈ＞，ｄａｔａ＞
＜？，＜ｃＦＲ，ｃｈ＞，ｎｕｌｌ＞
である。
【０１００】
ただし、ｃｈは整数または文字列とする。！または？をリクエストの極性と呼ぶ。！は送信リクエストを表し、？は受信リクエストを表す。＜ｃＦＲ，ｃｈ＞部をチャネルと呼ぶ。ｄａｔａ部は送信されるデータである。また、通信リクエスト本体ｂｏｄｙに関して、第１要素（！または？部）、第２要素（ < cFR,ch > 部）、第３要素（「data」または「null」部）を、Ｃ言語の構造体と同様の表記を用いて、それぞれ、body.polar、body.chan 、body.valueと表記する。
【０１０１】
Ｃ言語の構造体と同様に、以下の表記を用いる。たとえば、アクティブパートａのｃＦＲ部を表現するのに a.cFRと表記する。他のフィールドに関しても同様とする。さらに、アクティブパ一トａのｂｏｄｙ部のｐｏｌａｒ部を、a.body.polarと表記する。他のｂｏｄｙ部のフィールドに関しても同様とする。
【０１０２】
〔２−３〕アクティブパートの一例
下記に、アクティブパートの一例を示す。
【０１０３】
・ a1 = < 2,1,1,1, < !, < 2,1 >, 123 >> 
・ a2 = < 4,5,2,3, < ?, < 4,2 >, null >>
・ a3 = < 4,5,2,5, < ?, < 4,"abc" >, null >>
この例では、ｃＦＲ部（ a1.cFR=2, a2.cFR=4, a3.cFR=4 ）と、ｐＦＲ部（ a1.pFR=1, a2.pFR=5, a3.pFR=5 ）に整数を用いている。しかし、「ＩＰアドレスとポート番号の組」を用いるなど、ネットワーク内でアクティブパート処理部１４やパッシブパート処理部１２を特定できれば、識別子としてどのようなデータを用いてもよい。
【０１０４】
アクティブパートは、クライアント２-iの非決定的選択実行を許す同期型通信サーバ１-iへの通信リクエストとして用いられる。通信リクエスト本体は、アクティブパートのｂｏｄｙ部に記述される。たとえば、上記の例では、アクティブパートａ１，ａ２，ａ３は、それぞれ、
・ａ１  ：  チャネル < 2,1 >へのデータ「１２３」の送信を試みるリクエスト
・ａ２  ：  チャネル < 4,2 >からデータの受信を試みるリクエスト
・ａ３  ：  チャネル < 4,"abc" >からデータの受信を試みるリクエスト
を表す。
【０１０５】
〔２−４〕タイムアウトパートのフォーマット
タイムアウトパートは、
＜ｔｉｍｅ，ｐＩＤ，ｄｕｒａｔｉｏｎ＞
という３項組のレコードで構成される。
【０１０６】
これらの各フィールドの意味は、
・ｐＩＤ    ：  パッシブパートの識別子
・duration  ：  タイムアウトまでの時間を表す０以上の整数（秒）
である。
【０１０７】
タイムアウトパートｔの第一要素、第二要素、第三要素をそれぞれ、t.1st 、t.2nd 、t.3rd と書く。また、タイムアウトパートの第二要素、第三要素をそれぞれ、ｐＩＤ部、duration部と呼ぶこともある。
【０１０８】
〔２−５〕タイムアウトパートの一例
下記に、タイムアウトパートの一例を示す。
【０１０９】
・ t1 = < time,1,10 > 
・ t2 = < time,3,5 >
・ t3 = < time,21,100 > 
タイムアウトパートは、クライアント２-iの非決定的選択実行を許す同期型通信サーバ１-iへの通信リクエストの一部として用いられる。上記の例では、タイムアウトパートｔ１，ｔ２，ｔ３は、それぞれ、
・ｔ１  ：  １０秒待つリクエスト( pID は１）
・ｔ２  ：  ５秒待つリクエスト( pID は３）
・ｔ３  ：  １００秒待つリクエスト( pID は21）
を表す。
【０１１０】
〔２−６〕パッシブパートのフォーマット
パッシブパートは、
＜ＬＫ１，ＬＫ２，ａｃｔｓ，ｔｉｍｅｏｕｔ＞
という４項組のレコードで構成される。
【０１１１】
これらの各フィールドの意味は、
・ＬＫ１  ：  アクティブパートの集合
・ＬＫ２  ：  空（null）またはタイムアウトパートまたはアクティブパート
の二項組< a1, a2 >  
・acts    ：  アクティブパートの集合
・timeout ：  空（null）またはタイムアウトパート
である。
【０１１２】
アクティブパートの場合と同様に、Ｃ言語の構造体と同様の表記を用いる。たとえば、パッシブパートｐのＬＫ１部を表現するのにp.LK1 と表記し、timeout 部を表現するのにp.timeout と表記する。また、ＬＫ２の第一要素、第二要素、第三要素をそれぞれ、p.LK2.1st 、p.LK2.2nd 、p.LK2.3rd と書く。
【０１１３】
また、パッシブパートｐの acts 部にアクティブパートａが現れるとき、ｐをａの親と呼ぶ。また、パッシブパートｐのtimeout 部にタイムアウトパートｔが現れるとき、ｐをｔの親と呼ぶ。
【０１１４】
〔２−７〕パッシブパートの一例
下記に、パッシブパートの一例を示す。
【０１１５】
・p1 = <｛｝,null,｛ < 2,1,1,1, < !, < 2,1 >, 123 >> ,
< 4,1,1,2, < ?, < 4,"abc" >, null>> ｝,< time,1,10 >> 
・p2 = <｛ < 2,1,1,1, < !, < 2,1 >, 123 >>｝,null,
｛ < 2,1,1,1, < !,< 2,1>, 123 >>, < 4,1,1,3, < ?,< 4,1 >, null>>｝,null>
クライアント２-iは、ｐＦＲを識別子に持つパッシブパート処理部１２に、ＬＫ１部とＬＫ２部がそれぞれ｛｝とnullであるパッシブパートを、共有メモリ１０を用いて渡す。上記の例のｐ１は、ＬＫ１部とＬＫ２部がそれぞれ｛｝とnullであるパッシブパートの例である。
【０１１６】
上記の例のｐ１は、
・チャネル < 2,1 >にデータ「１２３」を送る動作
・チャネル < 4,"abc" >  からデータを受ける動作
・１０秒後にタイムアウトして同期を中止する
の三つの動作を表す、通信リクエストおよびタイムアウトリクエストを含む例を示している。
【０１１７】
上記のｐ１のようなパッシブパートをパッシブパート処理部１２に渡すことで、クライアント２-iは、非決定的選択実行を許す同期型通信サーバ１-iを呼び出す。
【０１１８】
上記の例のパッシブパートｐ１では、２つの通信リクエストと１つのタイムアウトリクエストである
・< 2,1,1,1, < !, < 2,1 >, 123 >>     : チャネル < 2,1 >にデータ「１２３」
を送る動作
・< 4,1,1,2, < ?, < 4,"abc" >, null>> : チャネル < 4,"abc" >  からデータを
受ける動作
・< time,1,10 >                       : １０秒後にタイムアウトして同期を中
止する
のいづれかひとつの動作のみが成功し、残りの動作はキャンセルされるという意味のリクエスト集合として用いられる。
【０１１９】
クライアント２-iは、パッシブパート処理部１２を呼び出す際、ａｃｔｓ部のすべてのアクティブパートが同一の < pFR, pID > の組を持ち、かつ、全てのアクティブパートとタイムアウトパートとが同じｐＩＤを持つようなパッシブパートをパラメータとして用いる。たとえば、上記の例のｐ１は、クライアント２-iがパッシブパート処理部１２を呼び出す際に使うパッシブパートの例である。
【０１２０】
すなわち、上記の例のパッシブパートｐ１では、２つのアクティブパートと１つのタイムアウトパートである
・< 2,1,1,1, < !, < 2,1 >, 123 >> 
・< 4,1,1,2, < ?, < 4,"abc" >, null>> 
・< time,1,10 > 
が現れるが、そのアクティブパートの < pFR, pID > 部はともに＜１，１＞であり、全てのｐＩＤは１である。
【０１２１】
これは、上記の２つのアクティブパートと１つのタイムアウトパートとが、識別子＜１，１＞を持つ同一の親（パッシブパート）を持つことを表す。タイムアウトパートのｐＦＲはデータ構造に明示されないが、そのパッシブパートを受け取ったパッシブパート処理部１２の識別子（この場合は１）となる。
【０１２２】
メモリ上で集合を扱うためのライブラリ関数は容易に構成可能である。そのようなライブラリ関数を図１４〜図１６に示し、以下の説明で利用する。
【０１２３】
ここで、図中に示す「add-Set(X,Y)」は、集合Ｘに要素Ｙを加えた集合を返す機能を持つ。また、「sub-Set(X,Y)」は、集合Ｘから要素Ｙを取り除いた集合を返す機能を持つ。また、「exist-Set(X,Y)」は、集合Ｘに要素Ｙが存在するのかを検索して、その検索結果を返す機能を持つ。また、「search-PAS(X,Y) 」は、パッシブパートの集合Ｙを検索し、acts部にアクティブパートＸを含むようなパッシブパートを返す機能を持つ。また、「search-timeout-PAS(X,Y) 」は、パッシブパートの集合Ｙを検索し、timeout 部にタイムアウトパートＸを含むようなパッシブパートを返す機能を持つ。また、「compare-LK1(X,Y)」は、アクティブパートＸとアクティブパートＹとを比較して、Ｘの方が大きければ真を返し、Ｙの方が大きければ偽を返す機能を持つ。また、「search-ACT(pol,a,acts)」は、データの受け渡しが可能になるアクティブパートの組を検索して返す機能を持つ。「sleep(duration) 」は、duration秒待つ機能を持つ。
【０１２４】
〔２−８〕アクティブパート処理部１４の構成および動作
アクティブパート処理部１４は、以下の内部変数を持つ。
【０１２５】
・記憶領域名ＡＣＴ  ：  アクティブパートの集合の格納用の記憶領域
初期値は｛｝（空集合）
・記憶領域名ＬＫ１  ：  アクティブパートの集合の格納用の記憶領域
初期値は｛｝（空集合）
・記憶領域名ｍｅｓ  ：  ネットワークコントローラ１１からデータを受信する
ための記憶領域。初期値はｎｕｌｌ
・記憶領域名ｔｍｐ  ：  値の一時記憶用の記憶領域。初期値はｎｕｌｌ
アクティブパート処理部１４は、ネットワークコントローラ１１から以下のフォーマットのメッセージを受け取る（ただし、ａはアクティブパートを表す）。
【０１２６】
・＜“ｔｒｙ”，ａ＞
・＜“ｆａｉｌ”，ａ＞
・＜“ｆｉｎ”，ａ＞
すなわち、アクティブパート処理部１４が受け取るメッセージは＜ｘ，ｙ＞の形式の二項組で、ｙの部分はアクティブパートである。ネットワークコントローラ１１から受け取るメッセージをｍとするとき、ｍの第１項目を m.1st、第２項目を m.2ndと書く。
【０１２７】
アクティブパート処理部１４は、以下の手順で動作する。図１７および図１８に、この手順の流れを図示する。
【０１２８】
『手順１』アクティブパート処理部１４は、ネットワークコントローラ１１にメッセージ受信要求を送る。
『手順２』ネットワークコントローラ１１からメッセージが送られるのを待つ。
『手順３』ネットワークコントローラ１１からメッセージを受けたら、そのメッセージを内部変数ｍｅｓに格納する。
『手順４』mes.1st が "try"かを比較し、比較結果を変数ｔｍｐに格納する。比較結果が真の場合は手順５に分岐し、偽の場合は手順１３に分岐する。
【０１２９】
『手順５』add-Set(ACT, mes.2nd) を評価し、評価結果を変数ＡＣＴに格納する。
『手順６』mes.2nd.body.polarが「！」かを比較し、比較結果を変数ｔｍｐに格納する。比較結果が真の場合は手順７に分岐し、偽の場合は手順１０に分岐する。
『手順７』search-ACT (!,mes.2nd,ACT)を評価し、評価結果を変数ｔｍｐに格納する。評価結果が null ならば手順１に戻る。
『手順８』変数 tmp.2ndに格納されたデータをネットワークコントローラ１１に渡す。
【０１３０】
『手順９』add-Set(LK1,tmp.1st)を評価し、評価結果を変数ＬＫ１に格納する。また、add-Set(LK1,mes.2nd)を評価し、評価結果を変数ＬＫ１に再格納する。sub-Set(ACT,tmp.1st)を評価し、評価結果を変数ＡＣＴに格納する。また、sub-Set(ACT,mes.2nd)を評価し、評価結果を変数ＡＣＴに再格納する。さらに、手順１に戻る。
『手順１０』search-ACT (?,mes.2nd,ACT)を評価し、評価結果を変数ｔｍｐに格納する。評価結果がnullならば手順１に戻る。
『手順１１』変数 tmp.2ndに格納されたデータをネットワークコントローラ１１に渡す。
『手順１２』add-Set(LK1,tmp.1st)を評価し、評価結果を変数ＬＫ１に格納する。また、add-Set(LK1,mes.2nd)を評価し、評価結果を変数ＬＫ１に再格納する。sub-Set(ACT,tmp.1st)を評価し、評価結果を変数ＡＣＴに格納する。また、sub-Set(ACT,mes.2nd)を評価し、評価結果を変数ＡＣＴに再格納する。さらに、手順１に戻る。
【０１３１】
『手順１３』mes.1st が"fail"かを比較し、比較結果を変数ｔｍｐに格納する。比較結果が真の場合は手順１４に分岐し、偽の場合は手順１６に分岐する。
『手順１４』exist-Set(LK1,mes.2nd)を評価し、比較結果を変数ｔｍｐに格納する。比較結果が真の場合は手順１５に分岐し、偽の場合は手順１に分岐する。
『手順１５』sub-Set(LK1,mes.2nd)を評価し、評価結果を変数ＬＫ１に格納する。add-Set(ACT,mes.2nd)を評価し、評価結果を変数ＡＣＴに格納する。さらに、手順１に戻る。
『手順１６』mes.1st が"fin" かを比較し、比較結果を変数ｔｍｐに格納する。比較結果が真の場合は手順１７に分岐し、偽の場合は手順１に分岐する。
『手順１７』sub-Set(LK1,mes.2nd)を評価し、評価結果を変数ＬＫ１に格納する。sub-Set(ACT,mes.2nd)を評価し、評価結果を変数ＡＣＴに格納する。さらに、手順１に戻る。
【０１３２】
〔２−９〕アクティブパート処理部１４の実行手順の具体例
次に、アクティブパート処理部１４の実行手順を、具体的により詳細に説明する。
【０１３３】
〔２−９−１〕具体例１
変数ＡＣＴ、ＬＫ１、ｍｅｓ、ｔｍｐの格納内容は、すべてアクティブパート処理部１４の内部変数の説明で述べた初期値であるとする。また、アクティブパート処理部１４は識別子２を持つとする。
【０１３４】
まず、アクティブパート処理部１４は、ネットワークコントローラ１１にメッセージ受信要求を送る（手順１）。
【０１３５】
次に、アクティブパート処理部１４は、ネットワークコントローラ１１からデータが送られるのを待つ（手順２）。
【０１３６】
ここで、メッセージ
ｍ１＝ < "try", < 2,1,1,1, < !, < 2,1 >, 123 >>>  
がネットワークコントローラ１１から送られたとする。アクティブパート処理部１４は識別子２を持つので、m1.2nd.cFR=2となる上記メッセージが受信される。
【０１３７】
アクティブパート処理部１４は、メッセージ < "try", < 2,1,1,1, < !, < 2,1 >, 123 >>>を内部変数ｍｅｓに格納する（手順３）。
【０１３８】
mes.1st が "try"かを比較し、比較結果を変数ｔｍｐに格納する。この場合は、比較結果が真であるから、手順５に分岐する（手順４）。
【０１３９】
add-Set(ACT,mes.2nd)を評価し、評価結果
｛ < 2,1,1,1, < !, < 2,1 >, 123 >>  ｝
を変数ＡＣＴに格納する（手順５）。
【０１４０】
mes.2nd.body.polarが「！」かを比較し、比較結果を変数ｔｍｐに格納する。この場合は比較結果が真であるから、手順７に分岐する（手順６）。
【０１４１】
search-ACT (!,mes.2nd,ACT)を評価する（手順７）。この場合は、変数ＡＣＴの内容が
｛ < 2,1,1,1, < !, < 2,1 >, 123 >>  ｝
であるから、受信リクエストは存在しない。よって、評価結果は null であるから、値 null が変数ｔｍｐに格納される。それゆえ、手順１に分岐する。
【０１４２】
再び、アクティブパート処理部１４は、ネットワークコントローラ１１にメッセージ受信要求を送る（手順１）。
【０１４３】
アクティブパート処理部１４は、ネットワークコントローラ１１からデータが送られるのを待つ（手順２）。
【０１４４】
ここで、メッセージ
ｍ２＝ < "try", < 2,3,4,2, < ?, < 2,1 >, () >>>   
がネットワークコントローラ１１から送られたとする。アクティブパート処理部１４は識別子２を持つので、m2.2nd.cFR=2となる上記メッセージが受信される。
【０１４５】
アクティブパート処理部１４は、メッセージ< "try", < 2,3,4,2, < ? , < 2,1 >, () >>> を内部変数ｍｅｓに格納する（手順３）。
【０１４６】
mes.1st が "try"かを比較し、比較結果を変数ｔｍｐに格納する。この場合は、比較結果が真であるから、手順５に分岐する（手順４）。
【０１４７】
add-Set(ACT,mes.2nd)を評価し、評価結果
｛ < 2,1,1,1, < !, < 2,1 >, 123 >>, < 2,3,4,2, < ?, < 2,1 >, () >>｝
を変数ＡＣＴに格納する（手順５）。
【０１４８】
mes.2nd.body.polarが「！」かを比較し、比較結果を変数ｔｍｐに格納する。この場合は比較結果が偽であるから、手順１０に分岐する（手順６）。
【０１４９】
search-ACT (?,mes.2nd,ACT)を評価する（手順１０）。評価結果は、
<< 2,1,1,1, < !, < 2,1 >, 123 >>,
< "lock1", < 2,3,4,2, < ?, < 2,1 >, () >>,
< 2,1,1,1, < !, < 2,1 >, 123 >>>>
であるから、この値を変数ｔｍｐに格納する。
【０１５０】
さらに、変数 tmp.2ndに格納されたデータ
< "lock1",<2,3,4,2,<?,<2,1>,()>>,<2,1,1,1,<!,<2,1>,123 >>>
をネットワークコントローラ１１に渡す（手順１１）。
【０１５１】
以下の処理を行う（手順１２）。まず、add-Set(LK1,tmp.1st)を評価し、評価結果
｛ < 2,1,1,1, < !, < 2,1 >, 123 >>  ｝
を変数ＬＫ１に格納する。また、add-Set(LK1,mes.2nd)を評価し、評価結果
｛ < 2,1,1,1, < !, < 2,1 >, 123 >>, < 2,3,4,2, < ?, < 2,1 >, () >>｝
を変数ＬＫ１に再格納する。
【０１５２】
そして、sub-Set(ACT,tmp.1st)を評価し、評価結果
｛ < 2,3,4,2, < ?, < 2,1 >, () >> ｝
を変数ＡＣＴに格納する。また、sub-Set(ACT,mes.2nd)を評価し、評価結果
｛｝
を変数ＡＣＴに再格納する。さらに、手順１に戻る。
【０１５３】
〔２−９−２〕具体例２
アクティブパート処理部１４は識別子２を持つとする、また、変数ＡＣＴ、ＬＫ１、ｍｅｓ、ｔｍｐの格納内容は、具体例１の最後の状態であるとする。
【０１５４】
このとき、メモリＡＣＴの内容は
｛｝
であり、ＬＫ１の内容は
｛ < 2,1,1,1, < !, < 2,1 >, 123 >>, < 2,3,4,2, < ?, < 2,1 >, () >>｝
である。
【０１５５】
まず、アクティブパート処理部１４は、ネットワークコントローラ１１にメッセージ受信要求を送る（手順１）。
【０１５６】
次に、アクティブパート処理部１４は、ネットワークコントローラ１１からデータが送られるのを待つ（手順２）。
【０１５７】
ここで、メッセージ
ｍ３＝ < "fin", < 2,1,1,1, < !, < 2,1 >, 123 >>>
がネットワークコントローラ１１から送られたとする。アクティブパート処理部１４は識別子２を持つので、m3.2nd.cFR=2となる上記メッセージが受信される。
【０１５８】
アクティブパート処理部１４は、メッセージ< "fin", < 2,1,1,1, < !, < 2,1 >, 123 >>> を内部変数ｍｅｓに格納する（手順３）。
【０１５９】
mes.1st が "try"かを比較し、比較結果を変数ｔｍｐに格納する。この場合は、比較結果が偽であるから、手順１３に分岐する（手順４）。
【０１６０】
mes.1st が "fail" かを比較し、比較結果を変数ｔｍｐに格納する（手順１３）。この場合は、比較結果が偽であるから、手順１６に分岐する。
【０１６１】
mes.1st が "fin"かを比較し、比較結果を変数ｔｍｐに格納する（手順１６）。この場合は、比較結果が真であるから、手順１７に分岐する。
【０１６２】
sub-Set(LK1,mes.2nd)を評価し、評価結果
｛ < 2,3,4,2, < ?, < 2,1 >, () >>   ｝
を変数ＬＫ１に格納する（手順１７）。さらに、sub-Set(ACT,mes.2nd)を評価し、評価結果
｛｝
を変数ＡＣＴに格納する。さらに、手順１に戻る。
【０１６３】
手順１で、アクティブパート処理部１４は、ネットワークコントローラ１１にメッセージ受信要求を送る。
【０１６４】
次に、アクティブパート処理部１４は、ネットワークコントローラ１１からデータが送られるのを待つ（手順２）。
【０１６５】
ここで、メッセージ
ｍ４＝ < "fin", < 2,3,4,2, < ?, < 2,1 >, () >>> 
がネットワークコントローラ１１から送られたとする。アクティブパート処理部１４は識別子２を持つので、m4.2nd.cFR=2となる上記メッセージが受信される。
【０１６６】
アクティブパート処理部１４は、メッセージ < "fin", < 2,3,4,2, < ?, < 2,1 >, () >>> を内部変数ｍｅｓに格納する（手順３）。
【０１６７】
mes.1st が "try"かを比較し、比較結果を変数ｔｍｐに格納する。この場合は、比較結果が偽であるから、手順１３に分岐する（手順４）。
【０１６８】
mes.1st が "fail" かを比較し、比較結果を変数ｔｍｐに格納する（手順１３）。この場合は、比較結果が偽であるから、手順１６に分岐する。
【０１６９】
mes.1st が "fin"かを比較し、比較結果を変数ｔｍｐに格納する（手順１６）。この場合は、比較結果が真であるから、手順１７に分岐する。
【０１７０】
sub-Set(LK1,mes.2nd)を評価し、評価結果
｛｝
を変数ＬＫ１に格納する（手順１７）。さらに、sub-Set(ACT,mes.2nd)を評価し、評価結果
｛｝
を変数ＡＣＴに格納する。さらに、手順１に戻る。
【０１７１】
〔２−９−３〕具体例３
アクティブパート処理部１４は識別子２を持つとする、また、変数ＡＣＴ、ＬＫ１、ｍｅｓ、ｔｍｐの格納内容は、具体例１の最後の状態であるとする。
【０１７２】
このとき、メモリＡＣＴの内容は
｛｝
であり、ＬＫ１の内容は
｛ < 2,1,1,1, < !, < 2,1 >, 123 >>, < 2,3,4,2, < ?, < 2,1 >, () >>  ｝
である。
【０１７３】
まず、アクティブパート処理部１４は、ネットワークコントローラ１１にメッセージ受信要求を送る（手順１）。
【０１７４】
次に、アクティブパート処理部１４は、ネットワークコントローラ１１からデータが送られるのを待つ（手順２）。
【０１７５】
ここで、メッセージ
ｍ５＝ < "fail", < 2,1,1,1, < !, < 2,1 >, 123 >>> 
がネットワークコントローラ１１から送られたとする。アクティブパート処理部１４は識別子２を持つので、m5.2nd.cFR=2となる上記メッセージが受信される。
【０１７６】
アクティブパート処理部１４は、メッセージ < "fail", < 2,1,1,1, < !, < 2,1 >, 123 >>> を内部変数ｍｅｓに格納する（手順３）。
【０１７７】
mes.1st が "try"かを比較し、比較結果を変数ｔｍｐに格納する。この場合は、比較結果が偽であるから、手順１３に分岐する（手順４）。
【０１７８】
mes.1st が "fail" かを比較し、比較結果を変数ｔｍｐに格納する（手順１３）。この場合は、比較結果が真であるから、手順１４に分岐する。
【０１７９】
exist-Set(LK1,mes.2nd)を評価し、比較結果を変数ｔｍｐに格納する（手順１４）。この場合は比較結果が真であるから、手順１５に分岐する。
【０１８０】
sub-Set(LK1,mes.2nd)を評価し、評価結果
｛ < 2,3,4,2, < ?, < 2,1 >, () >>   ｝
を変数ＬＫ１に格納する（手順１５）。また、add-Set(ACT,mes.2nd)を評価し、評価結果
｛ < 2,1,1,1, < !, < 2,1 >, 123 >>  ｝
を変数ＡＣＴに格納する。さらに、手順１に戻る。
【０１８１】
〔２−１０〕タイムアウトパート処理部１３の構成および動作
タイムアウトパート処理部１３は、以下の内部変数を持つ。
【０１８２】
・記憶領域名 duration   ：  タイムアウトの時間格納用の記憶領域
初期値は０
また、タイムアウトパート処理部１３は、パッシブパート処理部１２から新規生成されるとき、以下のように初期化される記憶領域を持つ。
【０１８３】
・記憶領域名ＰＡＲＡＭ  ：  パッシブパート処理部１２が引数として渡す値
が初期値としてここに格納される
タイムアウトパート処理部１３は、以下の手順で動作する。
【０１８４】
『手順１』ＰＡＲＡＭ.3rdを評価して、結果を duration に格納する。
『手順２』sleep(duration) を評価して、duration秒待つ。
『手順３』add-Set(fromCliet,PARAM)を評価し、評価結果をfromCliet に格納しなおす。
『手順４』このタイムアウトパート処理部１３の実行を終了する。
【０１８５】
〔２−１１〕タイムアウトパート処理部１３の実行手順の具体例
〔２−１１−１〕具体例４
次に、タイムアウトパート処理部１３の実行手順を、具体的により詳細に説明する。
【０１８６】
あるタイムアウトパート処理部１３が、 < time,1,10 >を引数としてパッシブパート処理部１２によって新規に生成されたとする。ＰＡＲＡＭの値は、< time,1,10 > に初期化される。このタイムアウトパート処理部１３は以下のように動作する。
【０１８７】
ＰＡＲＡＭ.3rdを評価する。評価結果である“１０”を duration に格納する（手順１）。
【０１８８】
sleep(duration) を評価して、１０秒待つ（手順２）。
【０１８９】
１０秒待った時点で、fromCliet の値は｛｝であったとする。add-Set(fromCliet,PARAM)を評価する。その評価結果< time,1,10 > をfromCliet に格納しなおす（手順３）。
【０１９０】
最後にタイムアウトパート処理部１３の実行を終了する（手順４）。
【０１９１】
〔２−１２〕パッシブパート処理部１２の構成および動作
パッシブパート処理部１２は、以下の内部変数を持つ。
【０１９２】
・記憶領域名ＰＡＳ    ：  パッシブパートの集合の格納用の記憶領域
初期値は｛｝（空集合）
・記憶領域名ＤＯＮＥ  ：  クライアントへの返答メッセージ集合の格納用の
記憶領域。初期値は｛｝（空集合）
・記憶領域名fromCliet ：  クライアントからパッシブパートを受信して格納す
るため記憶領域、およびタイムアウトパート処理部
１３からタイムアウトパートを受信して格納するた
めの記憶領域。初期値は｛｝（空集合）
・記憶領域名ｍｅｓ    ：  ネットワークコントローラ１１からデータを受信す
るための記憶領域。初期値はｎｕｌｌ
・記憶領域名ａＲ      ：  アクティブパートの一時記憶用の記憶領域
初期値はｎｕｌｌ
・記憶領域名ａＳ      ：  アクティブパートの一時記憶用の記憶領域
初期値はｎｕｌｌ
・記憶領域名ｄａｔａ  ：  値の一時記憶用の記憶領域。初期値はｎｕｌｌ
・記憶領域名tmp,tmp2,tmp3   ：  値の一時記憶用の記憶領域。
【０１９３】
初期値はｎｕｌｌ
パッシブパート処理部１２は、ネットワークコントローラ１１から以下のフォーマットのメッセージを受け取る（ただし、ｒ，ｓはアクティブパートを表す）。
【０１９４】
・＜“ｌｏｃｋ１”，ｒ，ｓ＞
・＜“ｌｏｃｋ２”，ｒ，ｓ＞
・＜“ｖａｌ”，ｒ，ｄａｔａ＞
・＜“ｃａｎｃｅｌ”，ｒ，ｎｕｌｌ＞
すなわち、パッシブパート処理部１２が受け取るメッセージは、＜ｘ，ｙ，ｚ＞の形式の三項組である。ネットワークコントローラ１１から受け取るメッセージをｍとするとき、ｍの第１項目を m.1st、第２項目を m.2nd、第３項目を m.3rdと書く。
【０１９５】
また、クライアント２-iとパッシブパート処理部１２とは、記憶領域fromCliet および記憶領域ＤＯＮＥを共有する。クライアント２-iは、fromCliet にパッシブパートを書き込み、パッシブパート処理部１２は、fromCliet の値を読み出して削除する。パッシブパート処理部１２は、ＤＯＮＥに通信結果を書き込み、クライアント２-iは、ＤＯＮＥの内容を読み出して削除する。
【０１９６】
パッシブパート処理部１２は、以下の手順で動作する。図１９〜図２１に、この手順の流れを図示する。
【０１９７】
『手順１』パッシブパート処理部１２は、メモリ領域fromCliet が｛｝をチェックする。｛｝の場合は、手順７に分岐する。
『手順２』fromCliet に格納されたデータｐ（パッシブパートまたはタイムアウトパート）を１つ取り出し、メモリ領域ｔｍｐに格納する。さらに、sub-Set(fromCliet,tmp)を評価し、評価結果をfromCliet に格納しなおす。tmp.1st を評価し、結果をｔｍｐ２に格納する。ｔｍｐ２がtimeだったら、手順３２に分岐する。
【０１９８】
『手順３』add-Set(PAS,tmp)を評価し、評価結果をＰＡＳに格納しなおす。
『手順４』メモリｔｍｐに格納された内容は、初期データである
<｛｝,null,acts,timeout >  
とする。さらに、actsは、ｎ個のアクティブパートの集合
｛ < cFR1,pFR1,pID1,aID1,body1 >, ・・・, < cFRn,pFRn,pIDn,aIDn,bodyn > ｝
であるとする。
【０１９９】
このとき、ネットワークコントローラ１１にｎ個の送信要求
< cFR1, < "try", < cFR1,pFR1,pID1,aID1,body1 >>>,・・・・・, 
< cFRn, < "try", < cFRn,pFRn,pIDn,aIDn,bodyn >>> 
を渡す。
【０２００】
これにより、識別子ｃＦＲｉ（ｉ＝１〜ｎ）を持つ各アクティブパート処理部１４に対して、メッセージ
< "try", < cFRi,pFRi,pIDi,aIDi,bodyi >>
が送信されることになる。
【０２０１】
『手順５』timeout が null でない場合は、timeout を引数として、タイムアウトパート処理部１３を新規に生成して起動する。
『手順６』手順１に戻る。
『手順７』パッシブパート処理部１２は、ネットワークコントローラ１１にメッセージ受信要求を送る。
『手順８』ネットワークコントローラ１１からデータが送られるのを待つ。
【０２０２】
『手順９』ネットワークコントローラ１１からデータを受けたら、そのデータを内部変数ｍｅｓに格納する。
『手順１０』ｍｅｓが null の場合は、手順１に戻る。
『手順１１』mes.1st が"lock1" かを比較し、比較結果を変数ｔｍｐに格納する。比較結果が真の場合は手順１２に分岐し、偽の場合は手順１６に分岐する。
『手順１２』mes.2nd を評価し、評価結果を変数ａＲに格納する。また、mes.3rd を評価し、評価結果を変数ａＳに格納する。さらに、search-PAS(aR,PAS)を評価し、評価結果をｔｍｐに格納する。
【０２０３】
『手順１３』ｔｍｐを評価し、評価結果が null の場合は、手順１に分岐する。また、nullでない場合は、メモリｔｍｐにはパッシブパートが格納されている。このときは、手順１４に分岐する。
『手順１４』以下を順に評価する。まず、add-Set(tmp.LK1,aR) を評価し、評価結果をｔｍｐ２に格納する。次に、add-Set(PAS,<tmp2,tmp.LK2,tmp.acts,tmp.timeout>)を評価し、評価結果をＰＡＳに格納する。最後に、sub-Set(PAS,tmp)を評価し、評価結果をＰＡＳに格納する。
【０２０４】
『手順１５』tmp.LK1 を評価し、評価結果をｔｍｐに格納する。評価結果が｛｝の場合は、ネットワークコントローラ１１に送信要求
< aS.pFR, < "lock2",aR,aS >> 
を渡し、手順１に分岐する。そうでない場合は、ネットワークコントローラ１１に送信要求
< aS.cFR, < "fail",aR,aS >>
を渡し、手順１に分岐する。
【０２０５】
『手順１６』mes.1st が"lock2" かを比較し、比較結果を変数ｔｍｐに格納する。比較結果が真の場合は手順１７に分岐し、偽の場合は手順２３に分岐する。
『手順１７』mes.2nd を評価し、評価結果を変数ａＲに格納する。また、mes.3rd を評価し、評価結果を変数ａＳに格納する。さらに、search-PAS(aS,PAS)を評価し、評価結果をｔｍｐに格納する。
【０２０６】
『手順１８』ｔｍｐを評価し、評価結果が null の場合は、ネットワークコントローラ１１に送信要求
< aR.pFR, < "cancel",aR,null >>
を渡し、手順１に分岐する。また、nullでない場合は、手順１９に分岐する。
『手順１９』tmp.LK1 を評価し、評価結果が｛｝かどうかを比較する。比較結果が真の場合は手順２０に分岐する。比較結果が偽の場合は手順２１に分岐する。
【０２０７】
『手順２０』まず、ネットワークコントローラ１１に送信要求
< aR.pFR, < "val",aR, aS.body.value >> 
を渡す。次に、add-Set(DONE,<aS,tmp.acts,null>)を評価し、評価結果をＤＯＮＥに格納する。さらに、sub-Set(PAS,tmp)を評価し、評価結果をＰＡＳに格納する。最後に、ネットワークコントローラ１１に以下の要領で複数個の送信要求を送る。
【０２０８】
tmp.actsがｎ個のアクティブパートの集合
｛ < cFR1,pFR1,pID1,aID1,body1 >, ・・・, < cFRn,pFRn,pIDn,aIDn,bodyn > ｝
とする。このとき、ネットワークコントローラ１１には、
< cFR1, <"fin", < cFR1,pFR1,pID1,aID1,body1 >>>,・・・・・, 
< cFRn, < "fin", < cFRn,pFRn,pIDn,aIDn,bodyn >>>
を渡す。上記を行ったら、手順１に分岐する。
『手順２１』tmp.LK2 を評価し、nullかどうかを比較する。比較結果が偽の場合は、手順２２に分岐する。比較結果が真の場合は、以下を行う。
【０２０９】
compare-LK1(aR,tmp.LK1) を評価し、評価結果をｔｍｐ２に格納する。評価結果が偽ならば、手順２２に分岐する。評価結果が真ならば、以下を行う。まず、add-Set(PAS,<tmp.LK1,<aR,aS>,tmp.acts,tmp.timeout>) を評価し、評価結果をＰＡＳに格納する。次に、sub-Set(PAS,tmp)を評価し、評価結果をＰＡＳに再格納する。最後に、手順１に分岐する。
【０２１０】
『手順２２』まず、ネットワークコントローラ１１に送信要求
< aR.pFR, < "cancel",aR,null >>
を渡す。次に、add-Set(tmp.LK1,aS) を評価し、評価結果をｔｍｐ２に格納する。また、add-Set(PAS,<tmp2,tmp.LK2,tmp.acts,tmp.timeout>)を評価し、評価結果をＰＡＳに格納する。さらに、sub-Set(PAS,tmp)を評価し、評価結果をＰＡＳに再格納する。最後に、手順１に分岐する。
【０２１１】
『手順２３』mes.1st が"val" かを比較し、比較結果を変数ｔｍｐに格納する。比較結果が真の場合は手順２４に分岐し、偽の場合は手順２７に分岐する。
『手順２４』mes.2nd を評価し、評価結果を変数ａＲに格納する。また、mes.3rd を評価し、評価結果を変数ｄａｔａに格納する。さらに、search-PAS(aR,PAS)を評価し、評価結果をｔｍｐに格納する。
【０２１２】
『手順２５』まず、add-Set(DONE,<aR,tmp.acts,data>)を評価し、評価結果を変数ＤＯＮＥに格納する、また、sub-Set(PAS,tmp)を評価し、評価結果を変数ＰＡＳに格納する。さらに、tmp.LK2 がnullかどうかを比較する。比較結果が偽であるならば、ネットワークコントローラ１１に送信要求
< tmp.LK2.1st.pFR, < "cancel",tmp.LK2.1st,null >>
を渡す。
『手順２６』ネットワークコントローラ１１に以下の要領で複数個の送信要求を送る。
【０２１３】
tmp.actsがｎ個のアクティブパートの集合
｛ < cFR1,pFR1,pID1,aID1,body1 >, ・・・, < cFRn,pFRn,pIDn,aIDn,bodyn > ｝
とする。このとき、ネットワークコントローラ１１には、
< cFR1, < "fin", < cFR1,pFR1,pID1,aID1,body1 >>>,・・・・・, 
< cFRn, < "fin", < cFRn,pFRn,pIDn,aIDn,bodyn >>> 
を渡す。上記を行ったら、手順１に分岐する。
【０２１４】
『手順２７』以下は、"cancel"メッセージ受信の処理である。まず、mes.2nd を評価し、評価結果を変数ａＲに格納する。また、search-PAS(aR,PAS)を評価し、評価結果をｔｍｐに格納する。
『手順２８』tmp.LK2 を評価し、評価結果をｔｍｐ２に格納する。評価結果がnullの場合は、手順２９に分岐する。評価結果がnullでない場合は、手順３０に分岐する。
『手順２９』add-Set(PAS, <｛｝,null,tmp.acts,tmp.timeout>)を評価し、評価結果をＰＡＳに格納する。次に、sub-Set(PAS,tmp)を評価し、評価結果をＰＡＳに格納する。最後に、ネットワークコントローラ１１に以下の要領で複数個の送信要求を送る。
【０２１５】
tmp.LK1 がｎ個のアクティブパートの集合
｛ < cFR1,pFR1,pID1,aID1,body1 >, ・・・, < cFRn,pFRn,pIDn,aIDn,bodyn > ｝
とする。このとき、ネットワークコントローラ１１には、
< cFR1, < "fail", < cFR1,pFR1,pID1,aID1,body1 >>>, ・・・・・, 
< cFRn, < "fail", < cFRn,pFRn,pIDn,aIDn,bodyn >>>
を渡す。上記を行ったら、手順１に分岐する。
【０２１６】
『手順３０』まず、tmp.LK2.1st を評価して評価結果をａＲに格納する。ａＲが time ならば手順３１に分岐する。また、tmp.LK2.2nd を評価して評価結果をａＳに格納する。次に、ネットワークコントローラ１１に送信要求
< aR.pFR, < "val",aR,aS.body.value >>
を渡す。さらに、以下を行う。
【０２１７】
まず、add-Set(DONE,<aS,tmp.act,null>) を評価し、評価結果をＤＯＮＥに格納する。次に、sub-Set(PAS,tmp)を評価し、評価結果をＰＡＳに格納する。最後に、ネットワークコントローラ１１に以下の要領で複数個の送信要求を送る。
【０２１８】
tmp.LK1 がｎ個のアクティブパートの集合
｛ < cFR1,pFR1,pID1,aID1,body1 >, ・・・, < cFRn,pFRn,pIDn,aIDn,bodyn > ｝
とする。このとき、ネットワークコントローラ１１には、
< cFR1, < "fin", < cFR1,pFR1,pID1,aID1,body1 >>>,・・・・・, 
< cFRn, < "fin", < cFRn,pFRn,pIDn,aIDn,bodyn >>> 
を渡す。上記を行ったら、手順１に分岐する。
【０２１９】
『手順３１』add-Set(DONE,tmp) を評価し、評価結果を変数ＤＯＮＥに格納する。また、sub-Set(PAS,tmp)を評価し、評価結果をＰＡＳに格納する。その後、手順２６に分岐する。
『手順３２』search-timeout-PAS(tmp,PAS) を評価し、評価結果をｔｍｐ２に格納する。ｔｍｐ２がnullでなければ、手順３４に分岐する。
『手順３３』ｔｍｐ２がnullだったら、手順１に分岐する。
【０２２０】
『手順３４』tmp2.LK1を評価し、評価結果をｔｍｐ３に格納する。ｔｍｐ３が｛｝でなかったら手順３６に分岐する。
『手順３５』ｔｍｐ３が｛｝だったら、add-Set(DONE,tmp) を評価し、評価結果を変数ＤＯＮＥに格納する。また、sub-Set(PAS,tmp)を評価し、評価結果をＰＡＳに格納する。その後、手順２６に分岐する。
【０２２１】
『手順３６』tmp2.LK2を評価し、評価結果をｔｍｐ３に格納する。ｔｍｐ３がnullでなかったら手順１に分岐する。
『手順３７』ｔｍｐ３がnullのときは、sub-Set(PAS,tmp2) を評価し、評価結果をＰＡＳに格納する。さらに、add-Set(PAS,<tmp2.LK1,tmp,tmp2.acts,tmp2.timeout>)を評価して、評価結果ＰＡＳに格納する。その後、手順１に分岐する。
【０２２２】
〔２−１３〕パッシブパート処理部１２の実行手順の具体例
次に、パッシブパート処理部１２の実行手順を、具体的により詳細に説明する。
【０２２３】
〔２−１３−１〕具体例５
２つのパッシブパート処理部１２（識別子１と識別子３を持つ）があるとする。識別子１のパッシブパート処理部１２をＰＭ１、識別子３のパッシブパート処理部１２をＰＭ３と書く。これらのパッシブパート処理部１２の内部変数の格納内容は、すべてパッシブパート処理部１２の内部変数の説明で述べた初期値であるとする。また、ＰＭ１は所定のクライアント１-i（以下、このクライアントをクライアント１と書く）と共有メモリを持ち、ＰＭ３はそれとは別の所定のクライアント１-3（以下、このクライアントをクライアント３と書く）と共有メモリを持つとする。
【０２２４】
なお、以下では、クライアント１に接続される同期型通信サーバ１-iを同期型通信サーバ１と書き、クライアント３に接続される同期型通信サーバ１-iを同期型通信サーバ３と書くことがある。
【０２２５】
まず、クライアント１はＰＭ１の持つ共有メモリfromClientに、パッシブパート
ｐ１＝ <｛｝,null,｛ < 2,1,1,1, < !, < 2,1 >, 123 >>,   
< 4,1,1,2, < ?, < 4,"abc" >, null >>  ｝,null > 
を書き込むとする。その結果、fromClientの内容は、
｛ <｛｝,null,｛ < 2,1,1,1, < !, < 2,1 >, 123 >>,   
< 4,1,1,2, < ?, < 4,"abc" > ,null >>  ｝,null > ｝
に更新される。
【０２２６】
また、クライアント３はＰＭ３の持つ共有メモリfromClientに、パッシブパート
ｐ２＝ <｛｝,null,｛ < 2,3,4,2, < ?, < 2,1 >, () >> ｝,< time,4,10 >> 
を書き込むとする。その結果、fromClientの内容は、
｛ <｛｝,null,｛ < 2,3,4,2, < ?, < 2,1 >, () >> ｝,< time,4,10 >> ｝
に更新される。
【０２２７】
まず、ＰＭ１側の動作について説明する。手順１から手順６までを実行する。その結果、fromClientの格納内容は、
｛｝
に更新される。また、ＰＭ１の内部変数ＰＡＳの内容は、
<｛｝, null, ｛ < 2,1,1,1, < !, < 2,1 >, 123 >>,   
< 4,1,1,2, < ?, < 4,"abc"> ,null >> ｝,null > 
に更新される。
【０２２８】
さらに、ネットワークコントローラ１１を通じて、識別子２を持つアクティブパート処理部１４（ＡＭ２と書く）にメッセージ
< "try", < 2,1,1,1, < !, < 2,1 >, 123 >>>  
が、また、識別子４を持つアクティブパート処理部１４（ＡＭ４と書く）にメッセージ
< "try", < 4,1,1,2, < ?, < 4,"abc" >, null>>>
が、それぞれ送信される。
【０２２９】
一方、ＰＭ３側は以下のように動作する。手順１から手順６までを実行する。その結果、fromClientの格納内容は、
｛｝
に更新される。また、ＰＭ３の内部変数ＰＡＳの内容は、
<｛｝,null,｛ < 2,3,4,2, < ?, < 2,1 >, () >> ｝, < time,4,10 >>
に更新される。
【０２３０】
さらに、ネットワークコントローラ１１を通じて、ＡＭ２にメッセージ
< "try", < 2,3,4,2, < ?, < 2,1 >, () >>> 
が送信される。
【０２３１】
一方、timeout 部が <time,4,10 > であり、nullでないので、<time,4,10 >を引数としてタイムアウトパート処理部１３が同期型通信サーバ３にて新規に生成されて起動される。
【０２３２】
上記の動作の後、ＰＭ１およびＰＭ３はともに内部変数fromClientの内容が｛｝であるから、手順１を経て手順７に分岐する。
【０２３３】
ここで、同期型通信サーバ３のタイムアウトパート処理部１３を考える。このタイムアウトパート処理部１３は、ＰＡＲＡＭ.3rdを評価して、その結果の１０秒を duration に格納する。その後、sleep(duration) を評価して、１０秒が経過するのを待つ。
【０２３４】
さらに、ＰＭ１およびＰＭ３は、ネットワークコントローラ１１にメッセージ受信要求を送り（手順７）、ネットワークコントローラ１１からデータが送られるのを待つ（手順８）。
【０２３５】
ここで、ＡＭ２が上述した「具体例１」の動作を行ったとする。このとき、ＰＭ３に対して、メッセージ
<"lock1",<2,3,4,2,<?,<2,1>,()>>,<2,1,1,1,<!,<2,1>,123>>> 
が送られる。
【０２３６】
この"lock1" メッセージは、受信リクエスト側（すなわち、< 2,3,4,2, < ?, < 2,1 >,() >> 側）のパッシブパート処理部１２にまず送られることになる。これにより、「受信側→送信側」とロックがとれた時点で、直ちに送信側から受信側にデータを送れることができることで、同期型通信の達成に必要となる制御メッセージ数を削減できるようになる。
【０２３７】
ＰＭ３は、ネットワークコントローラ１１からデータを受けたら、そのデータをＰＭ３の持つ内部変数ｍｅｓに格納する（手順９）。その結果、変数ｍｅｓの内容は、
<"lock1",<2,3,4,2,<?,<2,1>,()>>,<2,1,1,1,<!,<2,1>,123 >>>
に更新される。
【０２３８】
mes.1st が "lock1"かを比較し、比較結果を変数ｔｍｐに格納する（手順１１）。この場合は、mes.1st が "lock1"であるから、比較結果は真である。よって、手順１２に分岐する。
【０２３９】
mes.2nd を評価し、評価結果
< 2,3,4,2, < ?, < 2,1 >, () >> 
を変数ａＲに格納する（手順１２）。また、mes.3rd を評価し、評価結果
< 2,1,1,1, < !, < 2,1 > ,123 >>
を変数ａＳに格納する。さらに、search-PAS(aR,PAS)を評価し、評価結果
<｛｝,null,｛ < 2,3,4,2, < ?, < 2,1 >, () >> ｝> 
をｔｍｐに格納する。
【０２４０】
ｔｍｐを評価する（手順１３）。この場合、評価結果はnullでないので、手順１４に分岐する。
【０２４１】
以下を順に評価する（手順１４）。まず、add-Set(tmp.LK1,aR) を評価し、評価結果
｛ < 2,3,4,2, < ?, < 2,1 >, () >> ｝
をｔｍｐ２に格納する。次に、add-Set(PAS,<tmp2,tmp.LK2,tmp.acts,tmp.timeout>)を評価し、評価結果
｛ <｛ <2,3,4,2,<?,<2,1>,()>> ｝,null,｛ <2,3,4,2,<?,<2,1>,()>> ｝>,
< ｛｝,null,｛ <2,3,4,2,<?,<2,1>,()>> ｝> ｝
をＰＡＳに格納する。最後に、sub-Set(PAS,tmp)を評価し、評価結果
｛ <｛ <2,3,4,2,<?,<2,1>,()>> ｝,null,｛ <2,3,4,2,<?,<2,1>,()>> ｝> ｝
をＰＡＳに格納する。
【０２４２】
tmp.LK1 を評価し、評価結果
｛｝
をｔｍｐに格納する（手順１５）。この場合は、評価結果が｛｝であるから、ネットワークコントローラ１１に送信要求
< 1,<"lock2",<2,3,4,2,<?,<2,1>,()>>,<2,1,1,1,<!,<2,1>,123>>>>
を渡し、手順１に分岐する。
【０２４３】
ここで、同期型通信サーバ３のタイムアウトパート処理部１３を考える。タイムアウトパート処理部１３のsleep(duration) の評価開始から、いま１０秒たったとする。すると、add-Set(fromClient,PARAM) を評価し、評価結果である｛<time,4,10> ｝を同期型通信サーバ３のfromClientに格納しなおす。その後、タイムアウトパート処理部１３は実行を終了する。
【０２４４】
次に、ＰＭ１を考える。ＰＭ１は、ネットワークコントローラ１１からデータ
<"lock2",<2,3,4,2,<?,<2,1>,()>>,<2,1,1,1,<!,<2,1>,123>>> 
を受信する。このとき、このメッセージを内部変数ｍｅｓに格納する（手順９）。
【０２４５】
mes.1st が"lock1" かを比較し、比較結果を変数ｔｍｐに格納する（手順１１）。この場合は比較結果が偽であるから、手順１６に分岐する。
【０２４６】
mes.1st が"lock2" かを比較し、比較結果を変数ｔｍｐに格納する（手順１６）。この場合は比較結果が真であるから、手順１７に分岐する。
【０２４７】
以下を行う（手順１７）。mes.2nd を評価し、評価結果
< 2,3,4,2, < ?, < 2,1 >, () >>  
を変数ａＲに格納する。また、mes.3rd を評価し、評価結果
< 2,1,1,1, < !, < 2,1 >, 123 >> 
を変数ａＳに格納する。さらに、search-PAS(aS,PAS)を評価し、評価結果
｛ <｛｝,null,｛<2,1,1,1,<!,<2,1>,123>>,<4,1,1,2,<?,<4,"abc">,null>>｝> ｝
をｔｍｐに格納する。
【０２４８】
ｔｍｐを評価する（手順１８）。評価結果はnullでないので、手順１９に分岐する。
【０２４９】
tmp.LK1 を評価し、評価結果
｛｝
が｛｝かどうかを比較する（手順１９）。この場合は比較結果が真であるから、手順２０に分岐する。
【０２５０】
以下を行う（手順２０）。まず、ネットワークコントローラ１１に送信要求
< 3, < "val", < 2,3,4,2, < ?, < 2,1 > ,() >> ,123 >>  
を渡す。次に、add-Set(DONE,<aS,tmp.acts,null>)を評価し、評価結果
｛ <<2,1,1,1,<!,<2,1>,123>>,
｛ <2,1,1,1,<!,<2,1>,123>>,<4,1,1,2,<?,<4,"abc">,null>> ｝,null>  ｝
をＤＯＮＥに格納する。さらに、sub-Set(PAS,tmp)を評価し、評価結果
｛｝
をＰＡＳに格納する。最後に、ネットワークコントローラ１１に、送信要求
< 2, < "fin", < 2,1,1,1, < !, < 2,1 >, 123 >>>>,
< 4, < "fin", < 4,1,1,2, < ?, < 4,"abc" >, null >>>>
を送る。上記を行ったら、手順１に分岐する。
【０２５１】
以下では、再びＰＭ３の動作を考える。
【０２５２】
パッシブパート処理部１２は、メモリ領域fromClientが｛｝かをチェックする。この場合は｛<time,4,10> ｝であるから、<time,4,10> をｔｍｐに格納する。さらに、sub-Set(fromClient,tmp）を評価し、評価結果｛｝をfromClientに格納しなおす。次に、tmp.1st を評価し、結果のtimeをｔｍｐ２に格納する。ｔｍｐ２がtimeなので、手順３２に分岐する。
【０２５３】
search-timeout-PAS(tmp,PAS) を評価し、評価結果
< ｛ <2,3,4,2,<?,<2,1>,()>> ｝,null,｛ <2,3,4,2,<?,<2,1>,()>> ｝> 
をｔｍｐ２に格納する、ｔｍｐ２はnullではないので、手順３４に分岐する。
【０２５４】
tmp2.LK1を評価し、評価結果の
< 2,3,4,2, < ?, < 2,1 >, () >>
をｔｍｐ３に格納する。ｔｍｐ３が｛｝でないので手順３６に分岐する。
【０２５５】
tmp2.LK2を評価し、評価結果のnullをｔｍｐ３に格納する。ｔｍｐ３がnullなので、sub-Set(PAS,tmp2) を評価し、評価結果｛｝をＰＡＳに格納する。さらに、add-Set(PAS,<tmp2.LK1,tmp,tmp2.acts,tmp2.timeout>)を評価して、評価結果
｛ <｛<2,3,4,2,<?,<2,1>,()>>｝,<time,4,10>, ｛<2,3,4,2,<?,<2,1>,()>>｝> ｝
をＰＡＳに格納する。その後、手順１に分岐する。
【０２５６】
パッシブパート処理部１２は、メモリ領域fromClientが｛｝かをチェックする。この場合は｛｝であるから、手順７に分岐する。
【０２５７】
パッシブパート処理部１２は、ネットワークコントローラ１１にメッセージ受信要求を送る（手順７）。
【０２５８】
ネットワークコントローラ１１からデータが送られるのを待つ（手順８）。
【０２５９】
ネットワークコントローラ１１からデータ
< "val", < 2,3,4,2, < ?, < 2,1 >, () >> ,123 >
を受信する。このとき、そのデータを内部変数ｍｅｓに格納する（手順９）。
【０２６０】
mes.1st が"lock1" かを比較し、比較結果を変数ｔｍｐに格納する（手順１１）。この場合は、比較結果が偽であるから、手順１６に分岐する。
【０２６１】
mes.1st が"lock2" かを比較し、比較結果を変数ｔｍｐに格納する（手順１６）。この場合は、比較結果が偽であるから、手順２３に分岐する。
【０２６２】
mes.1st が"val" かを比較し、比較結果を変数ｔｍｐに格納する（手順２３）。この場合は比較結果が真であるから、手順２４に分岐する。
【０２６３】
mes.2nd を評価し、評価結果
< 2,3,4,2, < ?, < 2,1 >, () >> 
を変数ａＲに格納する。また、mes.3rd を評価し、評価結果
１２３
を変数ｄａｔａに格納する。さらに、search-PAS(aR,PAS)を評価し、評価結果
<｛ <2,3,4,2,<?,<2,1>,()>> ｝,<time,4,10>, ｛ <2,3,4,2,<?,<2,1>,()>> ｝> 
をｔｍｐに格納する。
【０２６４】
add-Set(DONE,<aR,tmp.acts,data>)を評価し、評価結果
｛ <<2,3,4,2,<?,<2,1>,()>>, ｛ <2,3,4,2,<?,<2,1>,()>> ｝,123 >  ｝
を変数ＤＯＮＥに格納する（手順２５）。また、sub-Set(PAS,tmp)を評価し、評価結果
｛｝
を変数ＰＡＳに格納する。さらに、tmp.LK2 がnullかどうかを比較する。この場合は、比較結果が真であるから、何もしない。
【０２６５】
以下を行う（手順２６）。ネットワークコントローラ１１に、送信要求
< 2, < "fin", < 2,3,4,2, < ?, < 2,1 >, () >>>>
を送る。上記を行ったら、手順１に分岐する。
【０２６６】
以上を行ったとき、ＡＭ２では、上述した「具体例２」の動作が実行される。
【０２６７】
〔２−１３−２〕具体例６
具体例６は、具体例５と同じ初期値で、具体例５とは異なる実行例を示す。具体例５は、パッシブパート処理部１２にタイムアウトリクエストを含み、同期型通信サーバ３にタイムアウトパート処理部１３が新規生成され、ＬＫ２部にタイムアウトリクエストが格納されるが、結局同期処理の成功が速く、タイムアウトが無視されるという実行例であった。この具体例６は、同期処理の開始よりもタイムアウトが速い場合の実行例を示す。
【０２６８】
２つのパッシブパート処理部１２（識別子１と識別子３を持つ）があるとする。識別子１のパッシブパート処理部１２をＰＭ１と、識別子３のパッシブパート処理部１２をＰＭ３と書く。これらのパッシブパート処理部１２の内部変数の格納内容は、すべてパッシブパート処理部１２の内部変数の説明で述べた初期値であるとする。また、ＰＭ１とＰＭ３は、それぞれ、クライアント１とクライアント３と共有メモリを持つとする。
【０２６９】
まず、クライアント１はＰＭ１の持つ共有メモリfromClientに、パッシブパート
ｐ１＝ <｛｝,null,｛ < 2,1,1,1, < !, < 2,1 >, 123 >>,   
< 4,1,1,2, < ?, < 4,"abc" >, null >>  ｝,null > 
を書き込むとする。その結果、fromClientの内容は、
｛ <｛｝,null,｛ < 2,1,1,1, < !, < 2,1 >, 123 >>,   
< 4,1,1,2, < ?, < 4,"abc" > ,null >>  ｝,null > ｝
に更新される。
【０２７０】
また、クライアント３はＰＭ３の持つ共有メモリfromClientに、パッシブパート
ｐ２＝ <｛｝,null,｛ < 2,3,4,2, < ?, < 2,1 >, () >> ｝, < time,4,10 >>
を書き込むとする。その結果、fromClientの内容は、
｛ <｛｝,null,｛ < 2,3,4,2, < ?, < 2,1 >, () >> ｝, < time,4,10 >>  ｝
に更新される。
【０２７１】
まず、ＰＭ１側の動作について説明する。手順１から手順６までを実行する。その結果、fromClientの格納内容は、
｛｝
に更新される。また、ＰＭ１の内部変数ＰＡＳの内容は、
<｛｝, null, ｛ < 2,1,1,1, < !, < 2,1 >, 123 >>,   
< 4,1,1,2, < ?, < 4,"abc"> ,null >> ｝,null > 
に更新される。
【０２７２】
さらに、ネットワークコントローラ１１を通じて、識別子２を持つアクティブパート処理部１４（ＡＭ２と書く）にメッセージ
< "try", < 2,1,1,1, < !, < 2,1 >, 123 >>>  
が、また、識別子４を持つアクティブパート処理部１４（ＡＭ４と書く）にメッセージ
< "try", < 4,1,1,2, < ?, < 4,"abc" >, null>>>
が、それぞれ送信される。
【０２７３】
一方、ＰＭ３側は以下のように動作する。手順１から手順６までを実行する。その結果、fromClientの格納内容は、
｛｝
に更新される。また、ＰＭ３の内部変数ＰＡＳの内容は、
<｛｝,null,｛ < 2,3,4,2, < ?, < 2,1 >, () >> ｝, < time,4,10 >>
に更新される。
【０２７４】
さらに、ネットワークコントローラ１１を通じて、ＡＭ２にメッセージ
< "try", < 2,3,4,2, < ?, < 2,1 >, () >>> 
が送信される。
【０２７５】
一方、timeout 部が <time,4,10 > であり、nullでないので、<time,4,10 >を引数としてタイムアウトパート処理部１３が同期型通信サーバ３にて新規に生成されて起動される。
【０２７６】
上記の動作の後、ＰＭ１およびＰＭ３はともに内部変数fromClientの内容が｛｝であるから、手順１を経て手順７に分岐する。
【０２７７】
ここで、同期型通信サーバ３のタイムアウトパート処理部１３を考える。このタイムアウトパート処理部１３は、ＰＡＲＡＭ.3rdを評価して、その結果の１０秒を duration に格納する。その後、sleep(duration) を評価して、１０秒が経過するのを待つ。
【０２７８】
さらに、ＰＭ１およびＰＭ３はネットワークコントローラ１１にメッセージ受信要求を送り（手順７）、ネットワークコントローラ１１からデータが送られるのを待つ（手順８）。
【０２７９】
このときネットワークコントローラ１１がＰＭ３にnullを送ったとする。ＰＭ３は内部変数ｍｅｓに受けたデータnullを格納する。ｍｅｓがnullなので、手順１に戻る。
【０２８０】
ここで、同期型通信サーバ３のタイムアウトパート処理部１３を考える。タイムアウトパート処理部１３のsleep(duration) の評価開始から、いま１０秒たったとする。すると、add-Set(fromClient,PARAM) を評価し、評価結果である｛<time,4,10> ｝を同期型通信サーバ３のfromClientに格納しなおす。その後、タイムアウトパート処理部１３は実行を終了する。
【０２８１】
次に、ＰＭ３を考える。パッシブパート処理部１２は、メモリ領域fromClientが｛｝かをチェックする。この場合は｛<time,4,10> ｝であるから、<time,4,10> をｔｍｐに格納する。さらに、sub-Set(fromClient,tmp) を評価し、評価結果｛｝をfromClientに格納しなおす。次に、tmp.1st を評価し、結果のtimeをｔｍｐ２に格納する。ｔｍｐ２がtimeなので、手順３２に分岐する。
【０２８２】
search-timeout-PAS(tmp,PAS) を評価し、評価結果
<｛｝,null,｛ < 2,3,4,2, < ?, < 2,1 >, ()>>  ｝> 
をｔｍｐ２に格納する。ｔｍｐ２は｛｝ではないので、手順３４に分岐する。
【０２８３】
tmp2.LK1を評価し、評価結果｛｝をｔｍｐ３に格納する。
【０２８４】
ｔｍｐ３が｛｝なので、add-Set(DONE,tmp) を評価し、評価結果である｛<time,4,10> ｝を変数ＤＯＮＥに格納する。また、sub-Set(PAS,tmp)を評価し、評価結果｛｝をＰＡＳに格納する。その後、手順２６に分岐する。
【０２８５】
ネットワークコントローラ１１に、送信要求
< 2,"fin", < 2,3,4,2, < ?, < 2,1 >, () >>> 
を送る。上記を行ったら、手順１に分岐する。
【産業上の利用可能性】
【０２８６】
このようにして、本発明によれば、非決定的選択実行を許す同期型通信サーバ１-iを用いて、タイムアウトを非決定的選択の選択肢のひとつとして実行することができるようになる。
【図面の簡単な説明】
【０２８７】
【図１】本発明の適用されるネットワークシステムの説明図である。
【図２】同期型通信サーバの装置構成の説明図である。
【図３】アクティブパート処理部の概要を説明する図である。
【図４】タイムアウトパート処理部の概要を説明する図である。
【図５】パッシブパートの概要を説明する図である。
【図６】パッシブパート処理部の概要を説明する図である。
【図７】本発明の処理の概要を説明する図である。
【図８】本発明の処理の概要を説明する図である。
【図９】本発明の処理の概要を説明する図である。
【図１０】本発明の処理の概要を説明する図である。
【図１１】本発明の処理の概要を説明する図である。
【図１２】本発明の処理の概要を説明する図である。
【図１３】本発明の処理の概要を説明する図である。
【図１４】本発明で用いるライブラリ関数の説明図である。
【図１５】本発明で用いるライブラリ関数の説明図である。
【図１６】本発明で用いるライブラリ関数の説明図である。
【図１７】アクティブパート処理部の実行する処理の流れを説明する図である。
【図１８】アクティブパート処理部の実行する処理の流れを説明する図である。
【図１９】パッシブパート処理部の実行する処理の流れを説明する図である。
【図２０】パッシブパート処理部の実行する処理の流れを説明する図である。
【図２１】パッシブパート処理部の実行する処理の流れを説明する図である。
【図２２】非決定的選択実行の通信処理の説明図である。
【符号の説明】
【０２８８】
１    同期型通信サーバ
２    クライアント
３    ネットワーク
１０  共有メモリ
１１  ネットワークコントローラ
１２  パッシブパート処理部
１３  タイムアウトパート処理部
１４  アクティブパート処理部
【図１】
2005250518.tif 000003
【図２】
2005250518.tif 000004
【図３】
2005250518.tif 000005
【図４】
2005250518.tif 000006
【図５】
2005250518.tif 000007
【図６】
2005250518.tif 000008
【図７】
2005250518.tif 000009
【図８】
2005250518.tif 000010
【図９】
2005250518.tif 000011
【図１０】
2005250518.tif 000012
【図１１】
2005250518.tif 000013
【図１２】
2005250518.tif 000014
【図１３】
2005250518.tif 000015
【図１４】
2005250518.tif 000016
【図１５】
2005250518.tif 000017
【図１６】
2005250518.tif 000018
【図１７】
2005250518.tif 000019
【図１８】
2005250518.tif 000020
【図１９】
2005250518.tif 000021
【図２０】
2005250518.tif 000022
【図２１】
2005250518.tif 000023
【図２２】
2005250518.tif 000024