next up previous contents index
Next: 分散処理用ジェネリック・オブジェクトの詳細 Up: メッセージの送信/受信 Previous: メッセージの送信

メッセージの受信

KLICでは、送信するメッセージはencode_XXXにより生成されるが、 基本的に以下のようになっている(詳細な構造は実装に依存する)。

受信時には、このメッセージ内の「処理関数のアドレス」を参照し、 その関数に残りのデータを渡すことによりdecode処理を行うことになっている。 つまり、decodeのdispatchはメッセージ中に記述されている関数を 直接呼びだすことにより行われている。 [*]

なお、各種decode処理は、各々のメッセージに応じて、decode_XXXなる名称で runtime/cntlmsg.c内で定義されている。

この受信に関する処理は、runtime/sendrecv.c内でrecv_message()により 定義されている。

なお、受信処理のきっかけは、以下の2つを併用している。

送信時に送信元から送られるUSR1シグナル:
送信者は、送信後にUSR1シグナルを送信先に送ることになっている。 よって、基本的には受信者はUSR1シグナルを受信したらメッセージが到着している と判断し、メッセージ受信を試みる。

intervalタイマによる一定間隔のポーリング:
PVMを用いた処理系では、 現実的には、シグナルがメッセージを追い越し、USR1シグナルを受信したにも 関わらず、メッセージが未到着な場合がある。このようなケースを補完するため、 一定時間毎にメッセージ受信を試みている。

割り込み、タイマとも、第4.1.1章 ([*]ページ), 第4.3章 ([*]ページ)で記述された方法を用い、 実際の処理は、リダクションの切れ目で行われるように設定されている。

receive_message()の下位では、実装依存のreceive_packe()関数を呼びだしており、 これが実装間のインターフェースになっている。



Sekita Daigo
1998-05-18