並行プログラミング・分散オブジェクト
ソケットなどのネットワークプログラミング、分散オブジェクト (主に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-20000103.tar.gz (Linux版:omniORB, mico, ORBacus, ORBit)
- counter-win-19990502.tar.gz (Windows版:omniORB, JDK 1.2)
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をサーバーにしたとき以外はどの組み合わせでも問題なく接続できる。
| \クライアント サーバー\ | Linux | Windows | ||||
| 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) | ○ | ○ |
注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.
|
*1: アプレットからダイアログボックスを出す方法,あるいはgetlogin()に相当する方法が分からなかった。
*2: 標準のエンコーディングがMS932, ISO8859_1, SJISと多様で,どの環境でも使えるエンコーディング,又は実行時に使えるエンコーディング一覧を取得する方法がない。Javaは内部UnicodeなのにUTF-8を指定したらJava2 VM以外例外を投げるし。自前でUTF-8変換すればいいが,今度はLinux版でiconv()がないため,EUC-JPとエンコーディング変換する標準的な方法がない。あぅ。
Note.