JPH10207724A - 分散アプリケーション実行システム - Google Patents

分散アプリケーション実行システム

Info

Publication number
JPH10207724A
JPH10207724A JP9006747A JP674797A JPH10207724A JP H10207724 A JPH10207724 A JP H10207724A JP 9006747 A JP9006747 A JP 9006747A JP 674797 A JP674797 A JP 674797A JP H10207724 A JPH10207724 A JP H10207724A
Authority
JP
Japan
Prior art keywords
message
procedure
program
application execution
processes
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP9006747A
Other languages
English (en)
Inventor
Tatsuo Kishi
達男 岸
Takayuki Saito
隆之 斉藤
Hirotoshi Maekawa
博俊 前川
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Digital Vision Laboratories Corp
Original Assignee
Digital Vision Laboratories Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Digital Vision Laboratories Corp filed Critical Digital Vision Laboratories Corp
Priority to JP9006747A priority Critical patent/JPH10207724A/ja
Publication of JPH10207724A publication Critical patent/JPH10207724A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Computer And Data Communications (AREA)

Abstract

(57)【要約】 【課題】本発明は複数のプロセスから構成される分散ア
プリケーション空間を動的に設営可能な分散アプリケー
ション実行システムを提供することを目的とする。 【解決手段】複数のコンピュータノードがネットワーク
を介して結合された分散処理システム上でノード上に存
在するプロセス間のメッセージ受け渡しを行うアプリケ
ーションを実行する分散アプリケーション実行システム
において、アプリケーションを構成するプロセスの生成
元となるプログラムを識別する第1の識別手段と、第1
の識別手段により識別されたプログラムによって生成さ
れる少なくとも一つのプロセスを識別する第2の識別手
段とを具備し、プロセス間のメッセージ受け渡しは、第
1の識別手段によるプログラムの識別と、第2の識別手
段によるプロセスの識別とによって前記プロセスを特定
して行われる。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明は、個人用コンピュー
タあるいはワークステーション等からなる複数のノード
がネットワークを介して有機的に結合された分散処理シ
ステムにおける分散アプリケーション実行システムに関
する。
【0002】
【従来の技術】分散システムにおいて実行されるアプリ
ケーションは、ネットワークを介して隔てられた個々の
ノードで生成される複数のプロセスによって構成され
る。プロセスは、実行中にあるプログラムの状態を指
し、単なる命令の列としてのプログラムと区別する。プ
ロセスは、その元となるプログラムをプロセッサが実行
することにより生じる。
【0003】複数の分散アプリケーションを実行する分
散アプリケーション実行システムを、既存のプロセス間
通信技術、例えば遠隔手続き呼び出し(リモートプロシ
ジャーコール;RPC)を用いて実現する場合には、解
決すべき次のような問題がある。すなわち上記RPCに
おける呼び出し側からのプロシージャの特定は、プログ
ラムの識別によって行われるものとなっている。このこ
とは、複数のプロセスから構成される分散アプリケーシ
ョン空間を動的に設営しようとする際の制約になるとい
う問題点がある。
【0004】
【発明が解決しようとする課題】したがって本発明は、
複数のプロセスから構成される分散アプリケーション空
間を動的に設営可能な分散アプリケーション実行システ
ムを提供することを目的とする。
【0005】
【課題を解決するための手段】
(1)本発明の分散アプリケーション実行システムは、
複数のコンピュータノードがネットワークを介して結合
された分散処理システム上で前記ノード上に存在するプ
ロセス間のメッセージ受け渡しを行うアプリケーション
を実行する分散アプリケーション実行システムにおい
て、前記アプリケーションを構成するプロセスの生成元
となるプログラムを識別する第1の識別手段と、前記第
1の識別手段により識別されたプログラムによって生成
される少なくとも一つのプロセスを識別する第2の識別
手段とを具備し、前記プロセス間のメッセージ受け渡し
は、前記第1の識別手段によるプログラムの識別と、前
記第2の識別手段によるプロセスの識別とによって前記
プロセスを特定して行われることを特徴とする。
【0006】この構成により、上記アプリケーションを
構成するプロセス間のメッセージ受け渡しは、当該アプ
リケーションのプロセスの生成元となるプログラムの識
別ではなくプロセスの識別によって行うことができる。
このため、例えば同一のプログラムから生成された複数
のプロセスを識別してプロセス間のメッセージ受け渡し
を行うことができる。
【0007】
【発明の実施の形態】以下、図面を参照して本発明によ
る分散アプリケーション実行システムの実施形態を説明
する。まず第1実施形態においては、分散アプリケーシ
ョンを構成する複数プロセス間のメッセージパッシング
(メッセージ受け渡し)を、遠隔手続き呼び出し(RP
C)によって実現する場合のシステム構成例について説
明する。また第2実施形態においては、同様に分散アプ
リケーションを構成する複数プロセス間のメッセージパ
ッシングを、いわゆるソケットインタフェースによるプ
ロセス間通信により実現する場合のシステム構成例につ
いて説明する。
【0008】(第1実施形態)図1は本発明の第1実施
形態に係る分散アプリケーション実行システムの一例を
示す論理構成図である。分散アプリケーション実行シス
テムは、一つあるいは複数の(コンピュータ)ノードを
有するイントラネット及びこれに相当する種々の局所的
なネットワークがインターネットを介して相互に接続さ
れて成る分散処理システム上において分散アプリケーシ
ョンを実行するものである。
【0009】分散アプリケーション実行システムは、ネ
ットワークを介して隔てられた複数のプロセスのうち、
同図の一点鎖線Lによって包含されハッチングで示され
る特定のプロセスをその構成要素としている。また、分
散アプリケーション実行システムは、同空間内において
複数の分散アプリケーションを実行する。各々の分散ア
プリケーションは複数の実行プロセスを有し、これら実
行プロセス間においてメッセージパッシングを行って協
調動作する。
【0010】図2はこのような分散アプリケーション間
におけるメッセージパッシングの機能を実現するための
ソフトウェア構成図である。図2に示すように、分散ア
プリケーションAp1とAp2の間のメッセージパッシ
ングは、メッセージパッシングオペレータ部M1及びM
2と、通信メディアインタフェース部C1及びC2を介
して行われる。
【0011】図3はこのようなメッセージパッシングを
実現するためのより具体的な構成例を示すブロック図で
ある。分散評価部10、開発ツール(モニタ及びデバッ
ガ)11、そしてシステムイニシャライザ12が上記ア
プリケーションAp1(Ap2)に相当する。また、メ
ッセージディスパッチャ31及びメッセージ送信要求部
32を含むメッセージパッシングオペレータ部30が上
記メッセージパッシングオペレータ部M1(M2)に相
当する。ネットワークインタフェース61を有する通信
メディアインタフェース60が、上記通信メディアイン
タフェースC1(C2)に相当している。
【0012】そして本実施形態においては、通信メディ
アインタフェース部60が、同図に示すように通信メデ
ィア70を介して他のノードの通信メディアインタフェ
ース部に対して遠隔手続き呼び出し(RPC)を行うも
のとなっている。
【0013】ここで、遠隔手続き呼び出しによるメッセ
ージパッシングを行う通信メディアインタフェース部6
0の具体的な構成例について説明する。図4は、ネット
ワークを介して隔てられたノード間(ノードA〜ノード
B)において、遠隔手続き呼び出しによりプロセス間の
メッセージパッシングを行う場合の構成を概略的に示す
ブロック図である。ノードA側のプロセス及びノードB
側のプロセスの両者は一つの分散アプリケーションの構
成要素である。
【0014】そしてここでは、遠隔手続き呼び出しによ
りノードAがノードBに対してメッセージ送信を行う場
合について説明する。同図に示すように、ノードA及び
ノードBの両プロセスは、遠隔手続呼び出しによるメッ
セージパッシングのための送信スレッド800(70
0)及び受信スレッド400(900)、そして受信ス
レッドにより生成されるメッセージ処理スレッド300
(600)から構成される。
【0015】プロシージャ呼び出し要求としてのメッセ
ージ送信要求を受信する受信スレッド900の通信メデ
ィアインターフェース500は、受信準備プロシージャ
501と、ディスパッチプロシージャ502と、実処理
プロシージャ503と、RPC504とから構成され
る。RPC504は、受信準備プロシージャ501又は
ディスパッチプロシージャ502から呼び出されるラン
タイムライブラリとして実装され、このRPC504
は、メッセージ送信側のプロセスから送られてきたメッ
セージ送信要求(プロシージャ呼び出し要求)をポート
505を介して入力する。
【0016】受信準備プロシージャ501は、メッセー
ジが到着した際にディスパッチプロシージャ502に制
御が渡るようRPC504に依頼する。ディスパッチプ
ロシージャ502はプロシージャ呼び出し要求を処理
し、実処理プロシージャ503を呼び出す。実処理プロ
シージャ503はメッセージ処理スレッド600を生成
してメッセージディスパッチャ601を生成する。メッ
セージディスパッチャ601は、受信したメッセージを
処理する。メッセージ処理スレッド600は、受信スレ
ッド500とは別のスレッドにより実行される。このた
め受信スレッド500の実処理プロシージャ503は速
やかに終了されることとなり、迅速に次のメッセージ待
ち状態に移行することになる。なお受信スレッド400
は、受信スレッド900と同様に構成される。図5に上
記メッセージ処理スレッド600により処理されるプロ
シージャ呼び出し要求メッセージのデータ構造を模式的
に示す。
【0017】図6は、受信準備プロシージャ501、デ
ィスパッチプロシージャ502、及び実処理プロシージ
ャ503の動作を示すフローチャートである。図6
(a)は受信準備プロシージャ501の動作を示すフロ
ーチャートである。先ずステップS1においてRPCト
ランスポートハンドルを取得する。当該処理は自プロセ
スのプロセスIDをパラメータに指定してRPC504
の所定のライブラリルーチンを呼び出すことにより実現
される。RPCトランスポートハンドルは、通信に関す
る情報を維持するための特定のデータ構造を有してい
る。次にステップS2においてディスパッチプロシージ
ャ502をポートマップに登録する。当該処理は、以下
に記すパラメータを指定してRPC504の所定のライ
ブラリルーチンを呼び出すことにより実現される。
【0018】指定パラメータ: ・RPCサービストランスポートハンドル ・プログラム番号(分散アプリケーション実行システム
ID) ・バージョン番号(プロセスID) ・ディスパッチプロシージャ ・伝送プロトコル(TCP又はUDP)
【0019】そしてステップS3においてプロシージャ
呼び出し要求として与えられるメッセージを待つイベン
ト待ち処理に移行する。ここで、プロシージャ呼び出し
側プロセスからのメッセージが到着すると、RPCは5
04はディスパッチプロシージャ502に制御を渡す。
ここで、上記受信準備プロシージャ501のより具体的
な構成例として当該プロシージャのC言語ソースリスト
を記す。
【0020】 /********************************************************** * cmirpc.x ;ONC RPC言語によるプロトコル定義ファイル * rpcgen -b cmirpc.x ***********************************************************/ struct packetInfo { opaque senderHostID[4]; /* 送信側ホストID */ u_long senderPID; /* 送信側プロセスID */ opaque receiverHostID[4];/* 受信側ホストID */ u_long receiverPID; /* 受信側プロセスID */ opaque msg<>; /* message本体 */ }; /********************* * progran definition *********************/ program CMIPROG { version CMIVERS { int CMISVC(packetInfo) = 1; /* プロシージャ番号 */ } = 1; /* バージョン番号( 仮) * / } = 0x211d1ae3; /* プログラム番号 */ /*************************** * cmirpc.h ;ヘッダファイル ****************************/ #ifndef _CMIRPC_H_RPCGEN #define _CMIRPC_H_RPCGEN #include <rpc/rpc.h> struct packetInfo { char senderHostID[4]; u_long senderPID; char receiverHostID[4]; u_long receiverPID; struct { u_int msg_len; char *msg_val; } msg; }; typedef struct packetInfo packetInfo; #define CMIPROG ((unsigned long)(0x211d1ae3)) #define CMIVERS ((unsigned long)(1)) #define CMISVC ((unsigned long)(1)) extern int * cmisvc_1(); extern int cmiprog_1_freeresult(); /* the xdr functions */ extern bool_t xdr_packetInfo(); #endif /* !_CMIRPC_H_RPCGEN */ /******************************************* * cmirpc_xdr.c ;外部データ表現変換ルーチン ********************************************/ #include "cmirpc.h" bool_t xdr_packetInfo(xdrs, objp) register XDR *xdrs; packetInfo *objp; { register long *buf; int i; if (!xdr_opaque(xdrs, objp->senderHostID, 4)) return (FALSE); if (!xdr_u_long(xdrs, &objp->senderPID)) return (FALSE); if (!xdr_opaque(xdrs, objp->receiverHostID, 4)) return (FALSE); if (!xdr_u_long(xdrs, &objp->receiverPID)) return (FALSE); if (!xdr_bytes(xdrs, (char **)&objp->msg.msg_val, (u_int *) &obj p->msg.msg_len, ~0)) return (FALSE); return (TRUE); } /**************************** * 受信準備プロシージャ ****************************/ void cmilisten(u_long SelfProcessID) { SVCXPRT *transp; int sock = RPC_ANYSOCK; int proto = IPPROTO_TCP; /* ポートマップから指定プログラム番号、バージョン番号の登録を削 除 */ (void) pmap_unset(CMIPROG, SelfProcessID); /* RPCサービストランスポートハンドルを取得 */ transp = svctcp_create(sock, 0, 0); if (transp == NULL) { exit(1); } /* ディスパッチプロシージャをポートマップに登録 */ /* svc_register() の第二引数はプログラム番号、 * 第三引数はバージョン番号である。
【0021】 * 第二引数にアプリケーション実行システムIDであるCMIPROG * (ヘッダファイルに0x2211d1aeと言う値で定義されている) 、 * 第三引数に自プロセスのプロセスIDであるSelfProcessID を * 指定する。
【0022】 */ if (!svc_register(transp, CMIPROG, SelfProcessID, cmiprog, proto)) { exit(1); } /* プロシージャ呼び出し要求を待つループに入る */ svc_run(); exit(1); }
【0023】図6(b)は、ディスパッチプロシージャ
502の動作を示すフローチャートである。このディス
パッチプロシージャ502には、プロシージャ番号及び
RPCサービストランスポートハンドルがパラメータと
して指定される。また当該処理はRPC504の所定の
ライブラリルーチンを利用する。
【0024】先ずステップS21において、プロシージ
ャ番号による分岐処理を行う。すなわち、プロシージャ
番号に“0”が指定された場合は、ステップS20に移
行し、値を返さす応答処理のみを実行して終了する。こ
のプロシージャ番号“0”は、特定の目的すなわち受信
側の動作確認のために予約されている。またプロシージ
ャ番号に“1”が指定された場合は、ステップS23に
移行し、受け取った引数(メッセージ)のデコードを行
い、ステップS24に移行して実処理プロシージャ50
3を呼び出す。ここでは、デコードされた引数を指定
し、リモートから呼び出されたプロシージャを呼び出
す。呼び出し処理を終えるとステップS26に移行し、
上記デコードによって割り当てられたメモリ領域を開放
して終了する。
【0025】またプロシージャ番号に上記“0”もしく
は“1”以外の値が指定された場合はエラーとする。こ
こで、上記ディスパッチプロシージャ502のより具体
的な構成例として当該プロシージャのC言語ソースリス
トを記す。
【0026】 /**************************** * ディスパッチプロシージャ ****************************/ static void cmiprog(struct svc_req *rqstp, SVCXPRT *transp) { union { packetInfo cmisvc_1_arg; } argument; char *result; bool_t (*xdr_argument)(), (*xdr_result)(); char *(*local)(); /* プロシージャ番号による切り分け */ switch (rqstp->rq_proc) { case NULLPROC: /* プロシージャ番号0: 値を返さず応答のみする */ (void) svc_sendreply(transp, xdr_void, (char *)NULL); return; case CMISVC: /* プロシージャ番号1: */ xdr_argument = xdr_packetInfo; xdr_result = xdr_int; local = (char *(*)()) cmisvc_1; break; default: /* その他 */ svcerr_noproc(transp); return; } (void) memset((char *)&argument, 0, sizeof (argument)); /* 受け取った引数をデコード */ if (!svc_getargs(transp, xdr_argument, &argument)) { svcerr_decode(transp); return; } /* 実処理プロシージャ呼び出し */ result = (*local)(&argument, rqstp); /* 返値をエンコードし呼び出し元へ送信 */ if (result != NULL && !svc_sendreply(transp, xdr_result, result) ) { svcerr_systemerr(transp); } /* デコードで割り当てられたメモリを解放 */ if (!svc_freeargs(transp, xdr_argument, &argument)) { exit(1); } return; }
【0027】図6(c)は、実処理プロシージャ503
の動作を示すフローチャートである。実処理プロシージ
ャ503は、ステップS30においてメッセージ処理ス
レッド600を生成し、引数(メッセージ)をメッセー
ジディスパッチャ601に渡す。メッセージディスパッ
チャ601はメッセージを処理する。メッセージ処理ス
レッド600は、受信スレッド900とは別のスレッド
により実行される。このため受信スレッド900の実処
理プロシージャ503は速やかに終了されることとな
り、迅速に次のメッセージ待ち状態に移行することにな
る。ここで、上記実処理プロシージャ503のより具体
的な構成例として当該プロシージャのC言語ソースリス
トを記す。
【0028】 /**************************** * 実処理プロシージャ ***************************/ int * cmisvc_1(packetInfo *packetInfoPtr, struct svc_req *rqstp) { struct packetInfo* packetInfoPtr2; int result; u_long tid; /* メモリを確保し、引数( メッセージ) をコピー */ packetInfoPtr2 = (struct packetInfo *)malloc(sizeof(packetInfo)); memcpy(packetInfoPtr2, packetInfoPtr, sizeof(packetInfo)); packetInfoPtr2->msg.msg_val = (char *)malloc(packetInfoPtr->msg.msg_le n); memcpy(packetInfoPtr2->msg.msg_val, packetInfoPtr->msg.msg_val, packetInfoPtr->msg.msg_len); /* Message処理スレッドを生成し、引数( メッセージ) を渡す */ result = thr_create(0,0,(void*(*)(void*))MessageDispatcher, packetInfo Ptr2, 0, &tid); return (&result); }
【0029】一方、プロシージャが呼び出される側のプ
ロセスの受信スレッド900に対しプロシージャ呼び出
し要求を送信する送信スレッド800は、メッセージ送
信要求部100と通信メディアインタフェース部200
とから構成される。通信メディアインタフェース部20
0は、送信プロシージャ201とRPC202とから構
成される。RPC202は、送信プロシージャ201か
ら呼び出されるランタイムライブラリとして実装され、
このRPC202は、ポート203から上記要求メッセ
ージを出力し、プロシージャが呼び出される側のプロセ
スのポート505に送る。なお送信スレッド700は、
送信スレッド800と同様に構成される。
【0030】図7は送信プロシージャ201の動作を示
すフローチャートである。この送信プロシージャ201
は、送信要求部100により送信先ホストID、プロセ
スID、そしてメッセージがパラメータとして指定され
る。
【0031】先ずステップS40においてクライアント
ハンドルを取得する。このクライアントハンドルは、受
信側との接続情報を保持するための特定のデータ構造を
有している。当該処理は、以下に記すパラメータを指定
してRPC202の所定のライブラリルーチンを呼び出
すことにより実現される。
【0032】指定パラメータ: ・ホストID ・プログラム番号(分散アプリケーション実行システム
ID) ・バージョン番号(プロセスID) ・その他(バッファサイズなど)
【0033】次にステップS41においてリモートプロ
シージャ呼び出しを行う。当該処理は、以下に記すパラ
メータを指定してRPC202の所定のライブラリルー
チンを呼び出すことにより実現される。
【0034】指定パラメータ: ・クライアントハンドル ・プロシージャ番号 ・引数エンコード用プロシージャ ・引数本体(メッセージ) ・返値デコード用プロシージャ ・返値格納用フィールド ・タイムアウト時間
【0035】ここで、上記送信プロシージャ201のよ
り具体的な構成例として当該プロシージャのC言語ソー
スリストを記す。
【0036】 /**************************** * 送信プロシージャ ****************************/ int cmisend(const struct packetInfo *packetInfoPtr) { int clnt_res; CLIENT *clnt; struct sockaddr_in Sockaddr; static struct timeval TIMEOUT = { 5, 0 }; int sock = RPC_ANYSOCK; memset((char *)&Sockaddr, 0, sizeof(Sockaddr)); memcpy(&(Sockaddr.sin_addr.s_addr), packetInfoPtr->receiverHostID, sizeof(u_long)); Sockaddr.sin_family = AF_INET; /* クライアントハンドルを取得 */ /* clnttcp_create() の第二引数はプログラム番号、 * 第三引数はバージョン番号である。
【0037】 * ここで、第二引数にアプリケーション実行システムIDであるCMIPROG * (ヘッダファイルに0x2211d1aeと言う値で定義されている) 、 * 第三引数に受信側プロセスのプロセスIDであるpacketInfoPtr->recei verPIDを * 指定する。
【0038】 */ if ((clnt = clnttcp_create(&Sockaddr, CMIPROG, packetInfoPtr->receiver PID,&sock, 0, 0)) == NULL) { clnt_pcreateerror("clnttcp_create"); return -1; } /* リモートプロシージャ呼び出し */ if (clnt_call(clnt, CMISVC, (xdrproc_t) xdr_packetInfo, (caddr_t) packetInfoPtr, (xdrproc_t) xdr_int, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { clnt_perror(clnt, "call failed"); return -1; } return(clnt_res); }
【0039】ところで本実施形態は、上記したようにプ
ログラム番号には分散アプリケーション実行システムI
Dを指定し、バージョン番号にはプロセスIDを指定す
るものとなっている。すなわち本実施形態においては、
第1の識別手段として分散アプリケーション実行システ
ムIDを指定し、このアプリケーション実行システムI
Dにより識別されたプログラムによって生成される一つ
あるいは複数のプロセスを識別する第2の識別手段とし
てプロセスIDを指定する。この構成により、分散アプ
リケーションを構成するプログラムを遠隔手続き呼び出
しシステム上で稼動している他のプログラムから区別
し、なおかつ分散アプリケーションを構成するプログラ
ムから生成された個々のプロセスを識別してプロセス間
のメッセージ受け渡しを行うことができる。
【0040】たとえば図8に示すように、分散アプリケ
ーション実行システムが、複数のノードN1〜N4と、
それらのノードに配置された分散アプリケーション実行
システム機能をもつ複数のプログラムPg0〜Pg4
(同一の分散アプリケーション実行システムIDをも
つ)から構成されている場合を考える。本実施形態によ
れば、それらのプログラムから生成されたプロセスP0
〜P5を識別することが可能となり、プロセスP0〜P
5は独立した分散アプリケーション1と分散アプリケー
ション2として構成できる。
【0041】かくして複数の分散アプリケーションを動
的に設営することが可能な分散アプリケーション実行シ
ステムを提供できる。 (第2実施形態)次に、本発明の第2実施形態を説明す
る。第1実施形態においては、分散アプリケーション実
行システムによって管理されるアプリケーションを構成
する複数プロセス間のメッセージパッシングを、遠隔手
続き呼び出し(RPC)によって実現する場合のシステ
ム構成例について説明したが、第2実施形態において
は、上記アプリケーションを構成する複数プロセス間の
メッセージパッシングを、いわゆるソケットインタフェ
ースによるプロセス間通信により実現する場合のシステ
ム構成例について説明する。
【0042】図9は、ネットワークを介して隔てられた
ノード間(ノードA〜ノードB)において、ソケットイ
ンターフェースによるプロセス間通信によりメッセージ
パッシングを行う場合の構成を概略的に示すブロック図
である。ノードA側のプロセス及びノードB側のプロセ
スの両者は一つのアプリケーションの構成要素である。
同図に示すように、ノードA及びノードBの両プロセス
は、ソケットインタフェースによるプロセス間通信を用
いるメッセージパッシングのための送信スレッド500
1(5000)及び受信スレッド8000(800
1)、そして受信スレッドにより生成されるメッセージ
処理スレッド4000(9000)から構成される。
【0043】送信スレッド5001は送信要求部100
0および通信メディアインターフェース部2000から
構成される。通信メディアインタフェース部2000
は、送信プロシージャ2001と、ポート番号管理要求
プロシージャ2002と、ソケットライブラリルーチン
2003とから構成される。なお送信スレッド5000
は、送信スレッド5001と同様に構成される。
【0044】受信スレッド8001は、ポート番号管理
要求プロシージャ3001と、受信プロシージャ300
2と、ソケットライブラリルーチン3003とから成る
通信メディアインタフェース部3000を有している。
受信プロシージャ3002から呼び出されるメッセージ
処理スレッド4000は、メッセージディスパッチャ4
001を呼び出す。なお、当該メッセージ処理スレッド
4000及びメッセージディスパッチャ4001は、第
1実施形態において説明したメッセージ処理スレッド6
00及びメッセージディスパッチャ601と同様の構成
である。
【0045】ポート番号管理プロセス6000は、ポー
ト番号表管理プロシージャ6001と、ポート番号表6
002と、ソケットライブラリルーチン6003とから
構成される。なお、ポート管理プロセス7000は、ポ
ート管理プロセス6000と同様に構成される。
【0046】図10は、送信プロシージャ2001及び
ポート番号管理要求プロシージャ2002の動作を示す
フローチャートである。図10(a)は、送信プロシー
ジャ2001の動作を示すフローチャートである。送信
プロシージャ2001は、送信先ホストID、送信先プ
ロセスID、そしてメッセージがパラメータとして指定
され、送信要求部1000により呼び出される。先ずス
テップS70において、ポート番号管理プロセス600
0に対しポート番号を問い合わせる。すなわちポート番
号管理要求プロシージャ2002を呼び出す。ここでは
送信先ホストのポート番号管理プロセス6000に対
し、アプリケーション実行システムID及びプロセスI
Dに対応するポート番号を問い合わせる。
【0047】次にステップS71において、メッセージ
送信用のソケットを作成する。ここでは、上記ステップ
S70の問い合わせ処理によって得たポート番号を指定
して接続要求を出す。続くステップS72においてメッ
セージを送信する。ここでは先ず図5に示したデータ構
造を有するメッセージデータを送信する。そしてステッ
プS73において結果を受信する。ここで、上記送信プ
ロシージャ2001のより具体的な構成例として当該プ
ロシージャのC言語ソースリストを記す。
【0048】 /****************************** * ヘッダファイル ******************************/ #include <stdlib.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/uio.h> #include <netinet/in.h> struct portInfo { int flag; /* 0:ポート番号登録 1: ポート番号問い合わせ */ u_long progID; /* アプリケーション実行システムID */ u_long processID; /* プロセスID */ u_short portNo; /* ポート番号 */ }; #define CMIPROG ((unsigned long)(0x211d1ae3)) struct packetInfo { u_long senderHostID; u_long senderPID; u_long receiverHostID; u_long receiverPID; struct { u_int msg_len; char *msg_val; } msg; }; /**************************** * 送信プロシージャ ***************************/ int cmisend(const struct packetInfo *packetInfoPtr) { struct sockaddr_in ports, socks; int Sock, addrlen, nByteRecv, nByteSend, result, portNo; struct portInfo PortInfo; /* ポート番号管理プロセスにポート番号を問い合わせ */ PortInfo.flag = 1; PortInfo.progID = CMIPROG; /* ヘッダファイルに定義されている */ PortInfo.processID = packetInfoPtr->receiverPID; portNo = cmiportreq(packetInfoPtr->receiverHostID, &PortInfo); if(portNo == -1){ return -1; } /* メッセージ送信用のソケットを作成 */ Sock = socket(AF_INET, SOCK_STREAM, 0); socks.sin_addr.s_addr = packetInfoPtr->receiverHostID; socks.sin_family = AF_INET; socks.sin_port = htons(portNo);/* 問い合わせで得た送信相手ポート番号に 接続 */ connect(Sock, (struct sockaddr *)&socks, sizeof(socks)); /* packetInfo を送信 */ nByteSend = send(Sock, (char *)packetInfoPtr, sizeof(struct packetInfo ), 0); /* メッセージ本体を送信 */ nByteSend = send(Sock, (char *)packetInfoPtr->msg.msg_val, packetInfoPtr->msg.msg_len, 0); /* 結果を受信 */ nByteRecv = recv(Sock, (char *)&result, sizeof(result), 0); close(Sock); return result; }
【0049】図10(b)はポート番号管理要求プロシ
ージャ2002の動作を示すフローチャートである。当
該プロシージャは、以下のようなパラメータが指定され
て送信プロシージャ2001から呼び出される。
【0050】指定パラメータ: ・ホストID ・要求内容(登録又は問い合わせ) ・アプリケーション実行システムID ・プロセスID ・ポート番号
【0051】先ずステップS80において、要求送信用
のソケットを作成する。ここではポート番号表管理プロ
シージャ6001のために予約されたポート番号(後述
のように“8888”が予約)を指定して接続要求を出
す。次にステップS81において要求を送信し、ステッ
プS82において結果を受信し、そしてステップS83
において、呼び出し元である送信プロシージャ2001
に対して受信結果を返す。ここで、上記ポート番号管理
要求プロシージャ2002のより具体的な構成例として
当該プロシージャのC言語ソースリストを記す。
【0052】 /************************************* * ポート番号管理要求プロシージャ *************************************/ int cmiportreq(u_long HostID, struct portInfo *portInfoPtr) { struct sockaddr_in ports; int portSock, addrlen, nByteRecv, nByteSend, result; /* 要求送信用のソケットを作成 */ memset((char *)&ports, 0, sizeof(ports)); portSock = socket(AF_INET, SOCK_STREAM, 0); ports.sin_addr.s_addr = HostID; ports.sin_family = AF_INET; ports.sin_port = htons(8888);/* 「ポート番号管理プロセス」のポートに接 続 */ connect(portSock, (struct sockaddr *)&ports, sizeof(ports)); /* 要求を送信 */ nByteSend = send(portSock, (char *)portInfoPtr, sizeof(*portInfoPtr), 0); /* 結果を受信 */ nByteRecv = recv(portSock, (char *)&result, sizeof(result), 0); close(portSock); if(result < 0){ printf("portreq error:%d\n", result); return -1; } return result; }
【0053】図11は、ポート番号表管理プロシージャ
6001及び受信プロシージャ3002の動作を示すフ
ローチャートである。図11(a)はポート番号表管理
プロシージャ6001の動作を示すフローチャートであ
る。当該プロシージャは、送信スレッドのポート番号管
理要求プロシージャ2002からの要求により、ポート
番号の登録処理又はポート番号問い合わせ処理を行う。
先ずステップS50において、要求受信用のソケットを
作成する。ここでは、ポート番号管理プロセス6000
のために予約されたポート番号(ここでは“8888”
とする)を指定してソケットを作成する。
【0054】次にステップS51において、要求の受信
待ちを行い、ここで管理要求を受信したらステップS5
2に移行する。ステップS52においては、ポート番号
管理要求プロシージャ2002によって指定されたパラ
メータのうち要求内容を判別して処理を行う。すなわち
要求内容が「ポート番号の登録要求」である場合は、ス
テップS53に移行しポート番号表6002にアプリケ
ーション実行システムID,プロセスIDおよびポート
番号を格納する。また要求内容が「ポート番号の問い合
わせ要求」である場合は、ステップS54に移行し、ポ
ート番号表6002内において、指定パラメータのアプ
リケーション実行システムID及びプロセスIDに対応
するポートを検索する。対応するポートが見つかった場
合はそのポート番号を返す。
【0055】そしてステップS55において、呼び出し
元であるポート番号管理要求プロシージャ2002に対
して結果を送信したのち、ステップS51に移行し、再
び要求の受信待ちに入る。ここで、上記ポート番号表管
理プロシージャ6001のより具体的な構成例として当
該プロシージャのC言語ソースリストを記す。
【0056】 #include "port.h" /******************************************************** * ポート番号表管理プロシージャ * ********************************************************/ #define PORTTABLE_MAX 256 void main() { struct sockaddr_in listens, news; int i, listenSock, newSock, addrlen, opt, nByteRecv, nByteSend, result ; struct portInfo PortInfo; struct portTable { /* ポート番号表 */ u_long progID; u_long processID; u_short portNo; }PortTable[PORTTABLE_MAX]; int portTable_tail = -1; /* 要求受信用のソケット作成 */ listenSock = socket(AF_INET, SOCK_STREAM, 0); opt = 1; setsockopt(listenSock, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof( int)); memset((char *)&listens, 0, sizeof(listens)); listens.sin_addr.s_addr = htonl(INADDR_ANY); listens.sin_family = AF_INET; listens.sin_port = htons(8888);/* 「ポート番号管理プロセス」のポート指 定 */ bind(listenSock, (struct sockaddr *)&listens, sizeof(listens)); listen(listenSock, 5); addrlen = sizeof(struct sockaddr_in); while(1){ /* 要求の受信待ち */ newSock = accept(listenSock, (struct sockaddr *)&news, &addrlen); /* 要求を受信 */ nByteRecv = recv(newSock, (char *)&PortInfo, sizeof(PortInfo), 0); switch(PortInfo.flag){ case 0: /* ポート番号の登録要求: ポート番号表にアプリケーション実行システムID、プロセスID、 ポート番号を格納 */ if(portTable_tail == PORTTABLE_MAX - 1){ result = -1; break; } for(i = 0; i <= portTable_tail; i++){ if(PortTable[i].progID == PortInfo.progID && PortTable[i].processID == PortInfo.processID){ break; } } if(i <= portTable_tail){ /* すでにある: 上書き */ PortTable[i].portNo = PortInfo.portNo; }else{ /* ない: 新規登録 */ PortTable[++portTable_tail].processID = PortInfo.processID; PortTable[portTable_tail].progID = PortInfo.progID; PortTable[portTable_tail].portNo = PortInfo.portNo; } result = 0; break; case 1: /* ポート番号の問い合わせ要求: ポート番号表をアプリケーション実行システムID、プロセスIDで検索 し、対応するポート番号を返却 */ result = -1; for(i = 0; i <= portTable_tail; i++){ if(PortTable[i].progID == PortInfo.progID && PortTable[i].processID == PortInfo.processID){ result = PortTable[i].portNo; break; } } break; default: result = -1; break; } /* 結果を送信 */ nByteSend = send(newSock, (char *)&result, sizeof(result), 0); close(newSock); } /* while */ }
【0057】図11(b)は、受信プロシージャ300
2の動作を示すフローチャートである。当該プロシージ
ャに対しては、自プロセスID及び自ホストIDがパラ
メータとして指定される。
【0058】先ずステップS60においてメッセージ受
信用のソケットを作成する。次に、ステップS61にお
いて、ポート番号管理プロセス6000に対し、ポート
番号の登録を要求する。すなわちメッセージ受信用に割
り当てられたポート番号を調べ、そのポート番号及びア
プリケーション実行システムID,プロセスIDを自ホ
ストのポート番号管理プロセスに対して登録要求する。
当該処理は、受信プロシージャ3002がポート番号管
理要求プロシージャ3001を呼び出すことによって行
われる。次にステップS62においてメッセージ受信待
ちに入る。ここで、メッセージを受信した場合は、メッ
セージを格納するメモリ領域を確保し、当該領域にメッ
セージ本体を書き込む。
【0059】次にステップS63においてメッセージ処
理スレッド4001を生成し、引数(すなわちメッセー
ジ)を渡す。ここでは上述したようにメッセージディス
パッチャ4001によるメッセージ処理が行われる。そ
してステップS64に移行し、送信スレッド側に結果を
送信する。ここで、上記受信プロシージャ3002のよ
り具体的な構成例として当該プロシージャのC言語ソー
スリストを記す。
【0060】 /**************************** * 受信プロシージャ * ***************************/ void cmilisten(u_long selfProcessID, u_long selfHostID) { struct sockaddr_in listens, news; int i, listenSock, newSock, addrlen, nByteRecv, nByteSend, result; struct packetInfo* packetInfoPtr; struct portInfo PortInfo; u_long tid; /* メッセージ受信用のソケットを作成 */ memset((char *)&listens, 0, sizeof(listens)); listenSock = socket(AF_INET, SOCK_STREAM, 0); listens.sin_addr.s_addr = htonl(INADDR_ANY); listens.sin_family = AF_INET; listens.sin_port = htons(0); bind(listenSock, (struct sockaddr *)&listens, sizeof(listens)); /* 割り当てられたポート番号を調べる */ addrlen = sizeof(struct sockaddr_in); getsockname(listenSock, (struct sockaddr *)&listens, &addrlen); /* ポート番号管理プロセスに登録を要求 */ PortInfo.flag = 0; PortInfo.progID = CMIPROG; /* ヘッダファイルに定義されている */ PortInfo.processID = selfProcessID; PortInfo.portNo = listens.sin_port; if(cmiportreq(selfHostID, &PortInfo) == -1){ exit(1); } listen(listenSock, 5); while(1){ /* メッセージの受信待ち */ newSock = accept(listenSock, (struct sockaddr *)&news, &addrlen); /* packetInfo を読み込み、メッセージ本体長を得る */ packetInfoPtr = (struct packetInfo *)malloc(sizeof(struct packetInfo )); nByteRecv = recv(newSock, (char *)packetInfoPtr, sizeof(struct packetInfo), 0); /* メッセージ本体を読み込む */ packetInfoPtr->msg.msg_val = (char *)malloc(packetInfoPtr->msg.msg_l en); nByteRecv = recv(newSock, (char *)packetInfoPtr->msg.msg_val, packetInfoPtr->msg.msg_len, 0); /* メッセージ処理スレッドを生成し、引数( メッセージ) を渡す */ result = thr_create(0,0,(void*(*)(void*))MessageDistributer, packetInfoPtr, 0, &tid); /* 結果を送信 */ nByteSend = send(newSock, (char *)&result, sizeof(result), 0); close(newSock); } /* while */ }
【0061】このように、複数プロセス間のメッセージ
パッシングを、いわゆるソケットインタフェースによる
プロセス間通信により実現する第2実施形態によれば、
メッセージ送信先の特定を、アプリケーション実行シス
テムID及びプロセスIDの指定によって行うため、ソ
ケットインタフェースの通常の方法によりホストのアド
レス及びポート番号を用いて物理的に特定する場合に比
べて、論理的に、そして柔軟に行うことができる。な
お、本発明は上述した実施形態に限定されず、種々変形
して実施可能である。
【0062】
【発明の効果】以上説明したように本発明によれば、複
数のアプリケーションから構成される分散アプリケーシ
ョン空間を動的に設営可能な分散アプリケーション実行
システムを提供できる。
【図面の簡単な説明】
【図1】本発明の第1実施形態に係る分散アプリケーシ
ョン実行システムの論理構成図。
【図2】上記第1実施形態に係るアプリケーション間に
おけるメッセージパッシングの機能を実現するためのソ
フトウェア構成図。
【図3】上記第1実施形態に係るメッセージパッシング
を実現するためのより具体的な構成例を示すブロック
図。
【図4】上記第1実施形態に係り、ネットワークを介し
て隔てられたノード間(ノードA〜ノードB)におい
て、遠隔手続き呼び出しによりプロセス間のメッセージ
パッシングを行う場合の構成を概略的に示すブロック
図。
【図5】上記第1実施形態に係るメッセージ処理スレッ
ド600により処理されるプロシージャ呼び出し要求メ
ッセージのデータ構造を模式的に示す図。
【図6】上記第1実施形態に係る受信準備プロシージャ
501、ディスパッチプロシージャ502、及び実処理
プロシージャ503の動作を示すフローチャート。
【図7】上記第1実施形態に係る送信プロシージャ20
1の動作を示すフローチャート。
【図8】上記第1実施形態に係る分散アプリケーション
の構築例を示す模式図。
【図9】本発明の第2実施形態に係るメッセージパッシ
ングを実現するためのより具体的な構成例を示すブロッ
ク図。
【図10】送信プロシージャ2001及びポート番号管
理要求プロシージャ2002の動作を示すフローチャー
ト。
【図11】ポート番号表管理プロシージャ6001及び
受信プロシージャ3002の動作を示すフローチャー
ト。
【符号の説明】
L…分散アプリケーション実行システム Ap1,Ap2…(分散)アプリケーション M1,M2…メッセージパッシングオペレータ部 C1,C2…通信メディアインターフェース部 10…分散評価部 11…開発ツール 12…システムイニシャライザ 13…メッセージ受け渡しインタフェース部 20…メッセージ評価スケジューラ 30…メッセージパッシングオペレータ部 31…メッセージディスパッチャ 32…メッセージ送信要求部 60…通信メディアインターフェース部 61…ネットワークインターフェース 70…通信メディア 100…送信要求部 200,500…通信メディアインターフェース部 201…送信プロシージャ 202,504…RPC 203,505…ポート 300,600…メッセージ処理スレッド 400,900…受信スレッド 501…受信準備プロシージャ 502…ディスパッチプロシージャ 503…実処理プロシージャ 601…メッセージディスパッチャ 700,800…送信スレッド

Claims (3)

    【特許請求の範囲】
  1. 【請求項1】 複数のコンピュータノードがネットワー
    クを介して結合された分散処理システム上で前記ノード
    上に存在するプロセス間のメッセージ受け渡しを行うア
    プリケーション、を実行する分散アプリケーション実行
    システムにおいて、 前記アプリケーションを構成するプロセスの生成元とな
    るプログラムを識別する第1の識別手段と、前記第1の
    識別手段により識別されたプログラムによって生成され
    る少なくとも一つのプロセスを識別する第2の識別手段
    とを具備し、 前記プロセス間のメッセージ受け渡しは、前記第1の識
    別手段によるプログラムの識別と、前記第2の識別手段
    によるプロセスの識別とによって前記メッセージの送り
    先を特定して行われることを特徴とする分散アプリケー
    ション実行システム。
  2. 【請求項2】 前記メッセージ受け渡しは、遠隔手続き
    呼出しにより行われ、当該遠隔手続き呼出しに対する通
    信ポートの割り当ては、前記第1の識別手段によるプロ
    グラムの識別と、前記第2の識別手段によるプロセスの
    識別により行われ、前記メッセージは前記通信ポートに
    対して送られることを特徴とする請求項1に記載の分散
    アプリケーション実行システム。
  3. 【請求項3】 前記メッセージ受け渡しは、ソケットイ
    ンタフェースによるプロセス間通信により行われ、当該
    ソケットインタフェースに対する通信ポートの割り当て
    は、前記第1の識別手段によるプログラムの識別と、前
    記第2の識別手段によるプロセスの識別とによって行わ
    れることを特徴とする請求項1に記載の分散アプリケー
    ション実行システム。
JP9006747A 1997-01-17 1997-01-17 分散アプリケーション実行システム Pending JPH10207724A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP9006747A JPH10207724A (ja) 1997-01-17 1997-01-17 分散アプリケーション実行システム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP9006747A JPH10207724A (ja) 1997-01-17 1997-01-17 分散アプリケーション実行システム

Publications (1)

Publication Number Publication Date
JPH10207724A true JPH10207724A (ja) 1998-08-07

Family

ID=11646796

Family Applications (1)

Application Number Title Priority Date Filing Date
JP9006747A Pending JPH10207724A (ja) 1997-01-17 1997-01-17 分散アプリケーション実行システム

Country Status (1)

Country Link
JP (1) JPH10207724A (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR100331519B1 (ko) * 1998-08-01 2002-04-06 포만 제프리 엘 분산 애플리케이션을 실행시키는 시스템 및 컴퓨터화된 방법
WO2013011713A1 (ja) * 2011-07-15 2013-01-24 オムロン株式会社 Plcのcpuユニット、plc用のシステムプログラム、plc用のシステムプログラムを格納した記録媒体、plcシステム、plcサポート装置、plcサポートプログラム、および、plcサポートプログラムを格納した記録媒体

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR100331519B1 (ko) * 1998-08-01 2002-04-06 포만 제프리 엘 분산 애플리케이션을 실행시키는 시스템 및 컴퓨터화된 방법
WO2013011713A1 (ja) * 2011-07-15 2013-01-24 オムロン株式会社 Plcのcpuユニット、plc用のシステムプログラム、plc用のシステムプログラムを格納した記録媒体、plcシステム、plcサポート装置、plcサポートプログラム、および、plcサポートプログラムを格納した記録媒体
JP2013025353A (ja) * 2011-07-15 2013-02-04 Omron Corp Plcのcpuユニット、plc用のシステムプログラム、plc用のシステムプログラムを格納した記録媒体、plcシステム、plcサポート装置、plcサポートプログラム、および、plcサポートプログラムを格納した記録媒体
CN103562807A (zh) * 2011-07-15 2014-02-05 欧姆龙株式会社 Plc的cpu单元、plc用的系统程序、保存有plc用的系统程序的记录介质、plc系统、plc辅助装置、plc辅助程序以及保存有plc辅助程序的记录介质
US10082777B2 (en) 2011-07-15 2018-09-25 Omron Corporation CPU unit for PLC, PLC-use system program, recording medium in which PLC-use system program is stored, PLC system, PLC support device, PLC support program, and recording medium in which PLC support program is stored

Similar Documents

Publication Publication Date Title
CN106161537B (zh) 远程过程调用的处理方法、装置、系统及电子设备
US5926636A (en) Remote procedural call component management method for a heterogeneous computer network
US6282581B1 (en) Mechanism for resource allocation and for dispatching incoming calls in a distributed object environment
Arulanthu et al. The design and performance of a scalable ORB architecture for CORBA asynchronous messaging
US20040068479A1 (en) Exploiting asynchronous access to database operations
US5867650A (en) Out-of-band data transmission
US6360279B1 (en) True parallel client server system and method
US7640549B2 (en) System and method for efficiently exchanging data among processes
JPH10124470A (ja) ロー・コンテクスト・スイッチングのオーバーヘッドが小さいマルチプレックス化メッセージの呼出し処理のメカニズム
JP2004536382A (ja) 置換可能なサービス品質機能のあるネットワーク通信チャネルコンポーネントを選択するために、置換可能なコンポーネントを用いるシステム、方法及び製造物
JP2002543491A (ja) 分散コンピューティング環境のための通信アーキテクチャ
CN100442240C (zh) 数据处理系统及其控制方法
CN118381796A (zh) 数据传输方法、装置、电子设备、存储介质和程序产品
US5933632A (en) Ring transitions for data chunks
US20030202522A1 (en) System for concurrent distributed processing in multiple finite state machines
JPH10207724A (ja) 分散アプリケーション実行システム
KR20040002624A (ko) 실시간 미들웨어 구성을 위한 멀티 프로토콜 연동 장치 및그 방법
JPH08212180A (ja) プロセス間通信処理装置
CN111901689B (zh) 流媒体数据的传输方法、装置、终端设备和存储介质
CN115361348A (zh) 由数据采集设备执行的与web浏览器通信的方法
US7320044B1 (en) System, method, and computer program product for interrupt scheduling in processing communication
US20030061257A1 (en) Multithreaded universal daemon for network data exchanges
US5987527A (en) Binding data sinks and sources across ring levels
JP2000267960A (ja) プロセス間のパケット通信方法及びパケット通信装置
JP2000151739A (ja) 情報処理装置、分散処理装置およびネットワークシステム