並行プログラミング・分散オブジェクト

ソケットなどのネットワークプログラミング、分散オブジェクト (主にCORBA)、リモートプロシージャコール (RPC) などを扱います。

並行、並列、分散はこんな感じでしょうか。

並行 (concurrent)
論理的に複数のタスクが同時に動く。逐次の対義語。時分割などで擬似的に実現されているかもしれない。
並列 (parallel)
複数のCPU (コア) で同時に複数のタスクを動かす
分散 (distributed)
複数のシステム(コンピュータ)で複数のタスクを同時に動かす

文書

ORBit2
GNOMEのCORBA ORB、ORBit2の使いかた
CORBA ORBインターフェイス
CORBA仕様で定義されるORBのインターフェイス
Rubyで分散オブジェクト (dRuby)
Ruby標準のpure RubyなORB、dRubyの使いかた
Bonobo components
GNOMEの分散コンポーネント技術Bonoboの使いかた
IPv6ソケットプログラミング
IPv4/IPv6両対応のプログラムの書き方。
スレッドプログラミング (pthread)
UNIXでのスレッドプログラミング。
MPICH2のインストール
クラスタ環境の用意。

CORBA接続実験

 CORBAでのクラス継承を試す。

2000.11.19
ORBit, mico, omniORB, JavaによるCounter/ReverseCounterリモートオブジェクトの相互接続のテスト
2000.01.03
gtk+クライアント
1999.05.16
ORBit
1999.04.23
mico

 Counter/ReverseCounterクラスのオブジェクトをやり取りした。Linux版はgtk+(GUI)クライアントも実装してみた。

interface Counter {
    readonly attribute short value;
    void incr();
    void decr();
    string name();
};

interface ReverseCounter: Counter {
};

 ReverseCounterはincr()で減算し,decr()で加算する。

 C++の場合は多重継承を使って実装する。plain Cだと(C++ならコンパイラが自動でやってくれる)vtableを手で書く。Javaは多重継承が使えないので,TIE(委譲)モデルで実装する。

 IORを文字列にして渡すというヘボい方法なら,JDK 1.2をサーバーにしたとき以外はどの組み合わせでも問題なく接続できる。

\クライアント
サーバー\
LinuxWindows
omniORB mico ORBacus ORBit omniORB JDK 1.2
omniORB
on Linux
(未)
mico
on Linux (注1)
ORBacus
on Linux
(未)
ORBit
on Linux
(未) (未)
omniORB
on Windows
JDK 1.2
on Windows
× (注2)× (注3)× (注3)× (注3)
注1: micoをサーバーにするとき,BOAではなくPOAを使う必要あり。BOAではクライアント側がBAD_OPERATION例外を発生する
注2: CORBA/COMM_FAILURE例外
注3: ハングアップ?

 ネームサービスを介してオブジェクトをやり取りするのは,ORBの組み合わせによって上手くいったりいかなかったりして,2000年1月現在では難しい。

RMI接続実験

 Java専用の分散技術RMI (Remote Method Invocation) のテスト。

 CORBAと同様,Linux機(JDK 1.1.6)とWindows機(JDK 1.2)の接続ができない。これがマシンを跨ぐのに失敗してるからか,バージョン間で互換性がないからかは不明。エラーメッセージからは後者のよう。

minichat

 ソケット非同期通信のテスト。サーバーはLinux,クライアントはWindows, Linux, Java版を用意した。

 Java版はスタンドアロン,アプレットのいずれとしても動作し,JDK 1.2 on Windows, JDK 1.1.6 on Linux, Netscape Navigator 4.5 on Windowsで確認した。Internet Explorer 4.0, Netscape Navigator 4.07 on Linuxでは動かなかった。IEで動かなかったのは,かなり謎。

 Java版をアプレットとして動かすとき,ユーザー名,サーバーのポート番号を決め打ちしてる(*1)ので,ソースを修正しないといけない。また,Javaアプレットはダウンロード先のホストとしか通信できないので,.classファイルをWebサーバーに置く。

 エンコーディングの変換をしてないので,異なるOS間では日本語は通らない。Linux版はEUC-JP, Windows版はShift_JISでいいんだが,Java版が難しい(*2)。

Note.

(1999.08.09追記) Windowsでの標準エンコーディングはシフトJISではない。ISO/IEC 646 IRVとJIS X 0208をエンコードした「932」。

*1: アプレットからダイアログボックスを出す方法,あるいはgetlogin()に相当する方法が分からなかった。

*2: 標準のエンコーディングがMS932, ISO8859_1, SJISと多様で,どの環境でも使えるエンコーディング,又は実行時に使えるエンコーディング一覧を取得する方法がない。Javaは内部UnicodeなのにUTF-8を指定したらJava2 VM以外例外を投げるし。自前でUTF-8変換すればいいが,今度はLinux版でiconv()がないため,EUC-JPとエンコーディング変換する標準的な方法がない。あぅ。