分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf ·...

57
1 分散システムにおけるプロセス 間通信 教科書2

Upload: others

Post on 02-Aug-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

1

分散システムにおけるプロセス間通信

教科書2章

Page 2: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

2

プロセス間通信

プロセス間通信:分散システムの中核メッセージパッシングに基づく

ネットワークの下位層で提供される低位のサービス

大規模分散システムの構築 高位の通信手段が必要

4つの(高位の)通信モデル遠隔手続き呼び出し(RPC)遠隔メソッド実行 (RMI)メッセージ指向ミドルウェア(MOM)ストリームベース通信

Page 3: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

3

プロセス間通信

プロセス間通信:分散システムの中核メッセージパッシングに基づく

ネットワークの下位層で提供される低位のサービス

大規模分散システムの構築 高位の通信手段が必要

4つの(高位の)通信モデル遠隔手続き呼び出し(RPC)遠隔メソッド実行 (RMI)メッセージ指向ミドルウェア(MOM)ストリームベース通信

Page 4: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

4

遠隔手続き呼び出し(RPC) (1/2)

分散システム: メッセージ送受信に基づくが...手続きsend,receiveなどの使用: アクセス透過性を達成できない

遠隔手続き呼び出し(Remote Procedure Call, RPC)を提案[Birrel and Nelson 1984]

マシンA上のプロセスがマシンB上の手続きを呼び出す

マシンA上のプロセスはマシンBに呼び出しパラメタの情報を送信し、一旦停止

マシンB上で手続きは実行され、結果を呼び出したマシンA上のプロセスに応答

呼び出し結果を受け取ると、マシンA上のプロセスは実行を再開

プログラマはメッセージ送受信を意識する必要がない

Page 5: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

5

遠隔手続き呼び出し(RPC) (2/2)

課題:

呼び出し側のプロセスと呼び出される側のプロセス: 異なるマシンの異なるアドレス空間で実行

パラメタと返り値: 異なるマシンでやり取り

クラッシュや障害の対策

Page 6: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

6

従来の手続き呼び出し (1/2)

例) count=read(fd,buf,nbytes); (C言語の例)

1. パラメタ(fd,buf,nbytes)をスタックに(逆順に)積む

2. 呼び出し先からの戻リアドレス(return address)をスタックに積む

Page 7: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

7

従来の手続き呼び出し (2/2)

3. 手続きreadを呼ぶ(手続きが書いてあるアドレスにジャンプ)

4.手続き終了後、返り値countをレジスタに格納し、return addressをスタックから取り除き、そのアドレスにジャンプ(呼び出し元に戻る)

5. 呼び出し元は、スタックを元の状態に戻す

Page 8: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

8

パラメタ渡し

call-by-value(値渡し)

呼ばれた手続きにとって、パラメタ変数は単なる局所変数(値の変更は呼んだ側の手続きに影響しない)

call-by-reference(参照渡し)

パラメタが格納されているアドレスを渡す

呼ばれた手続きから呼んだ側の変数を変更可能

Page 9: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

9

RPCの実現方法

RPCのアイデア:

リモート手続き呼び出しを、できるだけローカルと同じように見えるように(透過的に)する

システムコール・ライブラリコールの例プログラマは、単にプログラムに(例えば)read()手続きの呼び出しを記述

リンカはライブラリからread()手続きのルーチンを取り出してオブジェクトコードに追加 (プログラマは手続き呼び出し処理の詳細は知らなくて良い)

RPCも同様に実現

Page 10: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

10

クライアントスタブ/サーバスタブ

リモート計算機上のread()手続きを呼び出す場合

ローカル側ではクライアントスタブ(client stub)を呼ぶ

パラメタをメッセージにまとめてリモート計算機に送信し、結果を受け取る

サーバにメッセージが到着すると、サーバ側のOSはそれをサーバスタブ(server stub)に渡す。

リモートからの手続き呼び出し要求に従って、ローカルの手続きを呼ぶ

Page 11: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

11

RPCの実行手順

Page 12: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

12

RPCにおけるパラメタ渡し (1/3)RPCでのパラメタ渡し

クライアントスタブがパラメタをメッセージに符号化して送信し、サーバスタブがそれを復号化してローカル手続きに渡す

それほど単純ではない

Page 13: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

13

RPCにおけるパラメタ渡し (2/3)パラメタのメッセージへの符号化 = parameter marshaling(パラメタ・マーシャリング)

Page 14: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

14

RPCにおけるパラメタ渡し (3/3) ---マシンタイプの違いの吸収

マシンのタイプが異なると 文字コード(ASCII,EBCDIC)やint ,floatなどのデータ表現が異なる(big endian, little endianなど)little endianからbig endianへの変換 上位バイトと下位バイトの入れ替え

もしデータの型が文字列ならばこの変換をおこなってはならない  データの型に関する情報も必要

Page 15: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

15

RPCにおける参照渡し (1/3)

ポインタなど参照をRPCでどうやって渡すか?

ローカルプロセスでのポインタの値: リモートプロセス上では無意味

一つの解決法: RPCでは全ての参照渡しを禁止

参照渡しは重要であり、この解決法は望ましくない

Page 16: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

16

RPCにおける参照渡し (2/3)

もう一つの解決法:

read(fd,buf,nbytes)の例:

クライアントスタブは第2パラメタbufは文字配列へのポインタであること、および、そのサイズを知っている

クライアントスタブは配列bufの内容をすべてコピーしてサーバスタブに渡す

サーバスタブはbufをローカルメモリに展開し、手続きを実行し、結果の配列bufをクライアントスタブにコピーして返す

多くの場合うまく動作する

Page 17: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

17

RPCにおける参照渡し (3/3)

より効率の良い解決法:

bufが入力パラメタか出力パラメタかが明らかな場合 クライアントでの配列のコピーとサーバでのコピーのどちらかを省略可能

read()の例の場合: bufは入力パラメタ クライアントスタブはサーバに内容をコピーして渡す必要が無い

単純な配列や構造体なら上記でOK

任意の複雑なデータ構造(リスト、ツリーなど)は扱えない

ポインタが指す値を動的にクライアントに要求できれば、全体をコピーする必要はない

Page 18: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

18

パラメタ仕様とスタブ生成 (1/2)RPCでは手続き呼び出し側と呼び出され側でメッセージ形式に関して取り決め(プロトコル)が必要

単純なデータ型(int,char,booleanなど)に関して、その表現に関する取り決めも必要

メッセージ送受信に関する取り決めも必要TCPをつかうか、UDPをつかうか、など

Page 19: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

19

パラメタ仕様とスタブ生成 (2/2)クライアントスタブ/ サーバスタブの実装

アプリケーションとのインタフェースに関しても合意する必要あり

インタフェース=クライアントから呼び出され、サーバに実装されるべき手続きの集合

インタフェース仕様の記述方法:1.クライアント・サーバを記述したプログラム言語で記述 (プログラム言

語依存)

2.標準化されたインタフェース記述言語(IDL:Interface Description Language)で記述し、IDL記述からスタブを自動生成 (プログラム言語非依存)

Page 20: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

20

拡張RPCモデル (1/2)非同期RPC(asynchronous RPC)

返り値が不要な手続き呼び出し 手続き終了を待つのは無駄

片方向RPC(one-way RPC)

リモート手続きを呼び出した後、返り値を待たずに次の仕事をする

サーバは呼び出しリクエストの受理通知をすぐに返した後、手続きを実行

Page 21: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

21

拡張RPCモデル (2/2)非同期RPC(asynchronous RPC)

返り値が必要だが、すぐには必要でない場合:

保留同期RPC(deferred synchronous RPC)

片方向RPCと同様に、クライアントは非同期RPCでサーバを呼び出した後、返り値を待たずに処理を続行

サーバは、返り値を別の非同期RPCを用いてクライアントに返す

クライアントは割り込みによって返り値の受信を知り、受理通知をサーバに返す

Page 22: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

22

例:Sun RPC

Sun RPC (ONC RPC) : RPCの実現方式の一つ

Sun Microsystems社のOpen Network Computingグループで開発

多くのUNIXシステムで利用NFS, NISなどはSun RPCを使って実装

プログラム番号、バージョン番号、手続き番号の組で呼び出す手続きを識別

受け渡しできるパラメタは1つのみただし、2つ以上のパラメタを構造体にまとめて渡せる

仕様書 : RFC1831

Page 23: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

23

Sun RPCにおけるIDL

Sun RPCにおけるIDL : RPC言語(RPC language, RPCL)

ファイル名の拡張子: .x手続きのパラメタのデータ型、返り値の型、手続き番号、バージョン、プログラム番号などを宣言

パラメタのデータ型はXDR言語(eXternal Data Representation Language)で記述

XDRの符号化・復号化は規格化されており、扱うライブラリも整備されている

仕様書: RFC1832rpcgenコマンドでスタブを自動生成

Page 24: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

24

Sun RPCにおけるIDLの記述例add.x

struct intpair {int a; int b; }; /* XDR言語によるパラメタのデータ型宣言 */program ADD_PROG { /* プログラム宣言 */version ADD_VERS { /* バージョン宣言 */

int ADD(intpair) = 1; /* 手続きのプロトタイプ及び手続き番号(=1)宣言*/

} = 1; /* バージョン番号=1 */} = 0x23451111; /* プログラム番号(=0x2345111) */

Page 25: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

25

RPCプログラム番号

0x00000000 - 0x1FFFFFFF: Defined by Sun 0x20000000 - 0x3FFFFFFF: User Defined0x40000000 - 0x5FFFFFFF: Transient 0x60000000 - 0xFFFFFFFF: Reserved

Page 26: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

26

rpcgenの実行例

% rpcgen –a add.x% lsMakefile.add   Makefileの雛形(テンプレート)

add.x add_clnt.c     生成されたクライアントスタブ

add_svc.c     生成されたサーバスタブ

add.h        共通のヘッダファイル

add_client.c    クライアント側のサンプルコード

add_server.c サーバ側のサンプルコード

add_xdr.c XDR処理ルーチン

%

Page 27: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

27

add_client.cの編集例(1/2)… (省略) …void add_prog_1(char *host, int a, int b){

CLIENT *clnt; int *result_1;intpair add_1_arg; /* add.xで宣言したintpair型構造体 */

… (省略) …add_1_arg.a=a;add_1_arg.b=b;

   result_1 = add_1(&add_1_arg, clnt); /* クライアントスタブの呼び出し*/if (result_1 == (int *) NULL) {

clnt_perror (clnt, "call failed");} else {printf("result = %d¥n", *result_1);

}… (省略) …

}

Page 28: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

28

add_client.cの編集例(2/2)

void main(int argc,char *argv[]){

char *host;int a,b;if (argc != 4) {

printf ("usage: %s server_host num1 num2¥n", argv[0]);exit (1);

}host = argv[1]; /* リモートホストの指定 */a=atoi(argv[2])) ; /* リモート手続きadd_prog_1()への

b=atoi(argv[3])) ;       引数a,bの設定 */add_prog_1 (host, a, b); /* リモート手続きの呼び出し */

exit (0);}

Page 29: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

29

add_server.cの編集例

…(省略)…int *add_1_svc(intpair *argp, struct svc_req *rqstp){     /* クライアントから渡されたパラメタはargpに格納 */

static int result;/** insert server code here */ /* ここからリモート手続きの処理内容を記述 */printf("add function called¥n");printf("parameters: %d, %d¥n",argp->a,argp->b);result = argp->a + argp->b; /* 整数引数a,bを加算 */printf("returning: %d¥n",result);return &result; /* 結果をクライアントへ返す */

}

Page 30: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

30

add_client/add_serverの実行例

(クライアント側)

% ./add_client localhost 1 2 result = 3%

(サーバ側)

% ./add_serveradd function calledparameters: 1, 2returning: 3

Page 31: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

31

プロセス間通信

プロセス間通信:分散システムの中核メッセージパッシングに基づく

ネットワークの下位層で提供される低位のサービス

大規模分散システムの構築 高位の通信手段が必要

4つの(高位の)通信モデル遠隔手続き呼び出し(RPC)遠隔メソッド実行 (RMI)メッセージ指向ミドルウェア(MOM)ストリームベース通信

Page 32: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

32

遠隔オブジェクト起動(Remote Object Invocation)

オブジェクト指向技術

きちんと定義されたインタフェースによって外部から内部構造を隠蔽 インタフェースが同じならばオブジェクトの置き換えが容易

RPCのメカニズムをオブジェクトに拡張: Remote Object Invocation (遠隔オブジェクト起動)

Page 33: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

33

ソフトウェア部品としてのオブジェクト

オブジェクト(Object)の主な特徴

データ、及び、それらに対する処理群をまとめてカプセル化(encapsulate)し、外部から隠蔽

データ:オブジェクトの状態(state)処理:オブジェクトのメソッド(method)

メソッドの集合はインタフェース(interface)として外部から利用可能に

プロセスはメソッドを起動することによってのみ、データにアクセス可能

Page 34: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

34

分散オブジェクト

分散システムでのオブジェクトの実装インタフェースとその実装を分離

インタフェースはクライアントに、実装はサーバに存在分散オブジェクト(Distributed Object)

Page 35: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

35

分散オブジェクトの構成 (1/3)クライアントが分散オブジェクトを結合(bind)する

オブジェクトのインタフェースの実装をクライアント側にロード

プロキシ(proxy)(RPCにおけるクライアントスタブに対応)

Page 36: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

36

分散オブジェクトの構成 (2/3)

実際のオブジェクトはサーバに実装

インタフェースはクライアント側と同じ

分散オブジェクトにおけるサーバスタブ: スケルトン(skeleton)

Page 37: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

37

分散オブジェクトの構成 (3/3)

オブジェクト自体は分散していない

単一のサーバに実装 遠隔オブジェクト(remote object)とも呼ばれる

Page 38: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

38

オブジェクトレファレンス

RPCと分散オブジェクトの違い

分散オブジェクトにおいては、分散システム全体にわたって有効なオブジェクトレファレンス(object reference)を持つことが可能

オブジェクトレファレンスを異なるマシン上の異なるプロセスへ(メソッドのパラメタとして)渡すことが可能

パラメタの参照渡しが可能

透過性がRPCより向上

Page 39: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

39

クライアントのオブジェクトへの結合

オブジェクトレファレンスが指すオブジェクトのメソッドの起動

結合(binding)によって、該当オブジェクトのインタフェースを実装するプロキシをローカルプロセスのメモリ空間に生成

通常は結合は自動的に行われる

該当オブジェクトの実装を持っているサーバの位置を知る手段、および、ローカルにプロキシを生成する手段が必要

Page 40: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

40

暗黙的結合と明示的結合

暗黙的結合(Implicit Binding)

クライアントはオブジェクトレファレンスを使って直接リモートメソッドを起動できる

必要時に自動的に結合が行われる

Page 41: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

41

暗黙的結合と明示的結合

明示的結合(Explicit Binding)クライアントはリモートメソッド起動の前に、結合を行うための特別な関数を呼ぶ必要がある

その関数の返り値は、ローカルに生成されたプロキシへのポインタ

Page 42: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

42

オブジェクトレファレンスの実装(1/3)

オブジェクトレファレンスクライアントが分散オブジェクトを結合するのに十分な情報を含む必要あり

単純な実装:

分散オブジェクトが存在するサーバのネットワークアドレス、オブジェクト毎に動的に割り当てられたポート番号、および、オブジェクトの名前の組

欠点:

サーバがクラッシュして、回復後、オブジェクトのポート番号が変わった場合、古いオブジェクトレファレンスは無効

オブジェクトを別のサーバに移動できない(サーバのネットワークアドレスが変わるので)

Page 43: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

43

オブジェクトレファレンスの実装(2/3)

解決法:

ロケーションサーバを設けて、オブジェクトとそれが現在稼動するサーバのアドレスおよびポート番号の対応を管理

オブジェクトレファレンスはロケーションサーバのアドレスと、オブジェクトの大域的な名前(ID)を保持

ただし、ロケーションサーバにスケーラビリティ問題が生じる

Page 44: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

44

オブジェクトレファレンスの実装(3/3)

今までの実装での仮定

クライアントとサーバは同じプロトコルを使用

同じトランスポートプロトコル(TCPなど)同じパラメタ符号化(マーシャリング)プロトコル

オブジェクトレファレンスに追加情報を加えると、上記の仮定は不要

リモートオブジェクトとの通信プロトコルに関する情報など

このアプローチを更に進めると...実装ハンドル(implementation handle)をオブジェクトレファレンスに含める

Page 45: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

45

実装ハンドル

実装ハンドル(implementation handle)= プロキシの完全な実装(バイナリコード)が置いてある場所のURLクライアントが結合を行うときは、プロキシを動的にダウンロード・インストールし、インスタンス化したのちに起動

利点:クライアントはどんなプロトコルで実装されているかを知らなくて良い

欠点:ダウンロードしたコードを実行するので、セキュリティ上の問題がある

Page 46: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

46

遠隔メソッド起動(RMI)

遠隔メソッド起動(Remote Method Invocation,RMI)

クライアントがリモートオブジェクトを結合した後、そのオブジェクトのメソッドをプロキシを通して起動すること

RPCとの本質的な相違点

オブジェクトへの大域的な参照(前述)

汎用のスタブを持つ必要が無い

オブジェクトに特化したスタブを持つことができる

Page 47: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

47

静的RMIと動的RMI

RMIをサポートする方法IDLなどでインタフェースをあらかじめ記述

Javaなどの言語:スタブの自動生成が可能

前もって定義されたインタフェース記述を利用するアプローチ 静的起動(static invocation)

クライアントの開発時に既にインタフェースが定義されている必要がある

インタフェースが変更になると、クライアントを再コンパイルする必要あり

実行時に、メソッドの起動を動的に構成 動的起動(dynamic invocation)

Page 48: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

48

動的RMI

動的RMI一般的な形式

invoke(object, method, input_params, output_params);object: 分散オブジェクトのIDmethod: メソッド名

input_params: メソッドの入力パラメタ群を持つデータ構造

output_params: メソッドの出力パラメタ群を持つデータ構造

動的RMIが有用な例

オブジェクトブラウザ

任意のオブジェクトの情報を表示したりメソッド起動を行ったりする

実行時に任意のインタフェースを扱える必要あり

バッチ処理サービス

メソッド起動のリクエストをキューに蓄えておき、順番に実行

Page 49: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

49

RMIにおけるパラメタ渡し (1/2)RMIはRPCと異なり、大域的なオブジェクト参照を扱えるRPCよりパラメタ渡し(特に参照渡し)に関する制限は少ない

分散オブジェクトしか存在しないシステムを考えると...任意のオブジェクトを参照渡しで渡せる

渡されたプロセスは必要時に当該オブジェクトを結合すればよい

Page 50: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

50

RMIにおけるパラメタ渡し (2/2)全てのオブジェクトを分散オブジェクトとして扱うのは非効率

整数(integer) や論理型( boolean)などの基本型のデータはローカルに扱いたい

 ローカルオブジェクトへの参照は、参照している値をコピーして渡す(RPCでの配列の場合と同様)

Page 51: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

51

例1 CORBA

CORBA(Common Object Request Broker Architecture) (詳細は教科書9.1節)

非営利組織OMG(Object Management Group)により標準化

プログラム言語に非依存

クライアントとオブジェクト間の通信: ORB(Object Request Broker,オブジェクトリクエストブローカー)と呼ばれるミドルウェア層が処理

ORB間通信プロトコルを標準化(IIOP,Internet Inter-ORB Protocol) 異なるマシン・実装間で相互接続可能(開放型分散システム)

Page 52: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

52

CORBAインタフェース

インタフェースは標準言語OMG IDL(CORBA IDL)で記述

IDLから多くの言語(C,C++,Java,Ada,COBOL,Smalltalkなど)へのマッピング規則あり

Javaの場合: JDK付属ツールidljでスタブ(ORB)を自動生成可能 (Java IDL)

Page 53: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

53

OMG IDLの記述例 Hello.idl

module HelloMod { /* モジュール宣言 */interface Hello { /* インタフェース宣言 */

/* メソッド宣言 */string getMessage();oneway void shutdown();

}; };

Java IDLを用いたスタブ生成およびコード記述方法は以下を参照:

http://www.atmarkit.co.jp/fjava/javafaq/ent/ent05.html

Page 54: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

54

例2 HORB

HORB: Javaベースの分散オブジェクト技術

他の技術と比較して、透過性が高いサーバコードは無変更(自動変換)で、クライアントコードはわずかな変更(オブジェクト結合の部分)で分散化可能

IDLは不要(Javaのクラス定義をそのまま使用)

Java言語に依存ただし、Javaの特性によりプラットフォーム非依存

IIOPを用いてCORBAオブジェクトと相互接続可能

Page 55: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

55

HORB記述例

サーバコード(horbcでスタブ自動生成)

public class Test{ public String greeting(String s){  System.out.println(s);  return “こんにちは、Testです。”; }}

クライアントコード(サーバのコンパイルで得られたTest_Proxyクラスを用いて結合)

public class Client2{ …(省略)…

  Test_Proxy test = new Test_Proxy(“horb://remote_host.co.jp”);   String result = test.greeting(“こんにちは、Clientです。”);  System.out.println(result); …(省略)…}

Page 56: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

56

関連技術:XML Webサービス

ミドルウェア層の下位プロトコルとして汎用プロトコルであるHTTPを利用した分散オブジェクト技術

HTTPによるデータ転送のために、データをXMLに符号化(SOAP:Simple Object Access Protocol)

Webサーバ

Webサーバ

Webサーバ

Webクライアント

HTML over HTTP

SOAP/XML over HTTP

SOAP対応クライアントSOAP/XML over HTTP

Page 57: 分散システムにおけるプロセス 間通信nakata/mobile-cp/chap-02j-1.pdf · RPCにおける参照渡し(2/3) もう一つの解決法: read(fd,buf,nbytes)の例: クライアントスタブは第2パラメタbufは文字配列

57

演習問題

1. パラメタ・マーシャリング/アンマーシャリングとは具体的にどのような処理か説明せよ。

2. クライアントスタブ/サーバスタブの役割を説明せよ。

3. RPCを用いたソフトウェアの例を3つ以上挙げよ。

4. 分散オブジェクトを結合するとは具体的にどのような処理か説明せよ。

5. RMIにおける参照渡しの実現がRPCに比べて容易である理由を挙げよ。