トロンフォーラム

第7回 タスク間同期・通信機能4

ランデブポート

今回はランデブ機能について説明します。

ランデブによるタスク間の同期

ランデブは、タスク間での同期と通信を行うための機能の一種です。

あるタスクから別のタスクへの処理の依頼と、処理の依頼を受けたタスクから処理を依頼したタスクへの処理結果の返却を、一連の手順としてサポートします(図1)。

図1 ランデブ機能

図1 ランデブ機能

このようなタスクが同期する(待ち合わせる)ためのオブジェクトを、ランデブポート(Rendezvous Port)と呼びます。

ランデブを利用する典型的な例としては、クライアント/サーバモデルによるタスク間通信があります。図1で言えば、taskCLがクライアント、taskSVがサーバに相当します。それぞれで利用するシステムコールは、クライアント側がtk_cal_por、サーバ側がtk_acp_porとtk_rpl_rdvです。クライアントがサーバを呼び出し(call)、サーバがクライアントによる呼び出しを受け付け(accept)て、サーバ側での処理が完了したら結果をクライアントに返答(reply)します。

実際に図1をプログラミングした例をリスト1に示します。

※ 以下のサンプルプログラムはこちらからダウンロードできます。

ところで、リスト1では、taskSVがランデブポートで待っているところにtaskCLが処理を依頼することでランデブが成立しています。この時の両方のタスク状態の変化を示すと図2のようになります。

図2 サーバが先に待っている場合

図2 サーバが先に待っている場合

一方、リスト1でコメントアウトされている15行目のtk_dly_tsk(100)を有効にしてから実行すると、taskSVがランデブポートでの受付待ちを行う前に、taskCLが処理の依頼をするようになります。この時の両方のタスク状態の変化を示すと図3のようになります。

図3 クライアントが先に待っている場合

図3 クライアントが先に待っている場合

ランデブする時は、サーバ側とクライアント側のどちらが先に待ち合わせを開始してもよく、ランデブ成立後の動作に違いはありません。

Return Top