ユーザガイド

MOBA の利用法を説明します。

place

place は移送スレッドが活動する場です。 mobaplace コマンドで起動します。
place は JVM をひとつ占有しますが、一台のマシン上には複 数存在させることができます。同一マシン上の別 place は、 シェルへの接続、スレッド移送などを受け付けるポート番号で 識別されます。

place には、シェルというキャラクタベースのユーザインタフェー スがあります。利用者はシェルを通じて place に様々な指示 を与えることができます。

また、place は移送したスレッドにクラス定義 (クラスファイ ル) を提供します。移送スレッドは、クラスを自身の生成元マ シンからロードしようとし、生成元マシンで動いている place が移送スレッドにクラス定義を提供します。


コマンドラインオプション

mobaplace コマンドは、次に挙げる起動時オプションを受け付けます。 これらについて説明していきます。

シェル

place は、 キャラクタベースのユーザインタフェース、 シェルを用意しています。 シェルには telnet で接続します。
% telnet placeが動いているマシン 10000
Welcome to MOBA place on マシン名(IP アドレス):ポート番号
Ready.
place が待ち受けるポート番号はデフォルトで 10000番です。 このポート番号は -pオプションで変更できます。

シェルが受け付けるコマンドは次の通りです。 シェルは省略形も受け付けます。 省略形が曖昧だった場合、次の一覧の中でより下方にあるコマンドが採用されます。

それぞれについて説明していきます。

API

次のプログラミングインタフェースを説明します。 javadoc コマンドで生成した API ドキュメント もあります。

前提

移送や外部化が可能なのは、クラス NET.shudo.moba.lang.MobaThread (API doc) およびそのサブクラスのインスタンスです。 移送させたいスレッドは、通常の java.lang.Thread ではなく、 クラス MobaThread を使って作っておきます。

place シェルの start コマンドでは、 java.lang.Runnable を実装したクラスを、移送、外 部化可能なスレッドとして起動できます。 この場合、MobaThread クラスを意識する必要はありません。


スレッド移送, fork

スレッドがネットワークを越える操作には次の 2つがあります。 移送では、スレッドは移動して元の居場所から消えます。 fork では、別マシン上に元のスレッドのコピーが作成され、元のスレッドも残ります。

また、移送、fork の対象が

のどちらなのかを選べます。

これらの組合せで、4通りのメソッドがクラス MobaThread (API doc) に用意されています。

自スレッド他スレッド
移送 static void goTo() void moveTo()
fork static void fork() void forkThisThread()
これらは次の引数をとります。
  1. 移送先マシン : String型のホスト名か java.net.InetAddress型の IP アドレス。
  2. 移送先ポート番号 : int 型。省略可。
または NET.shudo.moba.lang.PlaceAddress型 (API doc) で移送先を示してもよいです。

自身を fork した場合、自分が元スレッドなのかコピーなのか を判別する必要があります。この判別は、クラス MobaThread (API doc) のメソッド boolean isInternalized() で判定できます。


Object Marshalling

オブジェクト (のグラフ) をストリームに流し込んだり (marshal)、 ストリームから元のオブジェクトを得たり (unmarshal) できます。

クラスの定義 (クラスファイル) は保存されません。 unmarshal の際に、ストリームから得られるオブジェクト群が 必要とするクラスが存在しなければ、例外が throw されます。

Java Platform Core API (標準 API) がサポートしている Object Serialization ( JDK の文書) と同等のものです。 MOBA では独自の実装となっています。利用方法は JDK のものとほぼ同じです。

パッケージNET.shudo.moba.io (API doc) に次の 2つのクラスを用意しています。

ObjectWriter
基本型またはオブジェクトのグラフをストリームに書き出します。
ObjectReader
ストリームから基本型やオブジェクトのグラフを再構成します。
使用法は次の通りです。
コンストラクタ 読み書き
書き出し ObjectWriter(OutputStream out) void writeObject(Object obj)
読み込み Objectreader(InputStream in) Object readObject()

スレッド外部化

スレッドをストリームに流し込んだり (外部化)、 ストリームから元のスレッドを得たり (内部化) できます。 実行中の状態が保存されます。

クラスの定義 (クラスファイル) は保存されません。 内部化の際に、ストリームから得られるスレッドが必要とする クラスが存在しなければ、例外が throw されます。

パッケージNET.shudo.moba.io (API doc) に次の 2つのクラスを用意しています。

ThreadWriter
スレッドをストリームに書き出します。
ThreadReader
ストリームからスレッドを再構成します。
それぞれ、Object Marshalling のクラス ObjectWriterObjectReader を継承しています。使用法もそれぞれのスーパークラスと同じです。
コンストラクタ 読み書き
書き出し ThreadWriter(OutputStream out) void writeObject(Object obj)
読み込み Threadreader(InputStream in) Object readObject()

Class Exportation

クラス定義の JVM 外表現、つまりクラスファイルを JVM 内の情報から再構成します。

ただし、現状、_quick命令がクラスファイルに入り 込んでしまうことがあります。_quick命令は JVM 内に閉じた最適化で生成されます。これを含むクラスファイル がロードされた場合の JVM の動作は未定義です。

_quick命令について詳しくは、 "The Java Virtual Machine Specification" を参照して下さい。日本語訳の書籍も入手可能です。

このため、JDK 1.1 以降では Class Exportation はまだ実用になりません

パッケージNET.shudo.moba.io (API doc) に次のクラスを用意しています。

ClassWriter
クラスファイルを JVM 内から再構成し、ストリームに書き出します。
使用法は、各種出力ストリームと同じです。
コンストラクタ Export
ClassWriter(OutputStream out) void writeClass(Class clazz)

注意事項

MOBA を利用する際、知っておくべきことを述べます。

JIT コンパイラ

残念ながら、現在の MOBA は JIT コンパイラと同時に利用できません。 JIT コンパイルされたコードの実行中は、プログラムカウンタ がプロセッサネイティブなコードを指してしまうからです。

スレッドの移送、外部化を行う際は、JIT コンパイラが働かな いように設定しておく必要があります。JIT コンパイラを利用 するかしないか、JDK では、環境変数 JAVA_COMPILER で制御します。 JAVA_COMPILER が設定されていないと JIT コンパイラが働きません。


コピーによる移送

外部化、移送の際、対象スレッドから到達し得るオブジェクト はすべて外部化、移送されます。つまり、 オブジェクトの値をコピーすることで移送を実現 しています。

複数のスレッドが同じオブジェクトを参照している場合、一方 のスレッドが移送すると、共有されているオブジェクトは移送 先にコピーされます。これにより、プログラムのセマンティク スが変わってしまうことがあります。

複数スレッドが協調するプログラムで MOBA を利用する場合、 上に述べた移送のセマンティクスを理解しておいて下さい。


移送先マシンの安全性

mobaplace コマンドの -a オプション で、 place へのアクセス制限が可能です。 しかし、一旦移送を 受け入れたスレッドの行動は制限されていません

セキュリティマネージャを利用して、移送スレッドの行動を制 限する仕掛けを用意しようと考えています。


Back to


首藤 一幸
<shudoh at muraoka.info.waseda.ac.jp>