place は JVM をひとつ占有しますが、一台のマシン上には複 数存在させることができます。同一マシン上の別 place は、 シェルへの接続、スレッド移送などを受け付けるポート番号で 識別されます。
place には、シェルというキャラクタベースのユーザインタフェー スがあります。利用者はシェルを通じて place に様々な指示 を与えることができます。
また、place は移送したスレッドにクラス定義 (クラスファイ ル) を提供します。移送スレッドは、クラスを自身の生成元マ シンからロードしようとし、生成元マシンで動いている place が移送スレッドにクラス定義を提供します。
mobaplaceコマンドの利用法を表示します。
place がスレッド移送やシェルへの接続を待ち受けるポート番号を指定します。 デフォルト値は 10000 です。
同一マシン上で複数の place を動かす場合、それぞれのポー ト番号は最低 3 は離す必要があります。
place に対するアクセスを制御するファイルを指定します。 スレッド移送、シェル接続の双方が制御されます。 クラス定義要求は制御されません。
-aオプションでアクセス制御ファイルを指定しない 場合、place はあらゆる接続を受け付けます。
アクセス制御ファイルの文法は次の通りです。
ユーザ名を使用した認証は、シェルへの接続や移送の要求元を Authentication Server Protocol (RFC931) (tcp/113) で確認 し、行います。認証される側、つまり接続元マシンで identd が動いていない場合、そのエントリは採用されません。
アクセス制御ファイルの例
# Access control file for MOBA place # 基本的にあらゆる禁止 deny # localhost からの接続を許可 allow 127.0.0.1 # 133.9.222.0/255.255.255.192 からの接続を許可 allow 133.9.222.0/26 # murau1 上のユーザ shudoh からの接続を許可 allow murau1.muraoka.info.waseda.ac.jp shudoh
place が待ち受けるポート番号はデフォルトで 10000番です。 このポート番号は -pオプションで変更できます。% telnet placeが動いているマシン 10000 Welcome to MOBA place on マシン名(IP アドレス):ポート番号 Ready.
シェルが受け付けるコマンドは次の通りです。 シェルは省略形も受け付けます。 省略形が曖昧だった場合、次の一覧の中でより下方にあるコマンドが採用されます。
それぞれについて説明していきます。表示例
各行はlist 9170 "Thread of Counter" Mobile 4938 "ThreadName" Ready.
という表示になっています。 Mobile という属性は、そのスレッドが移送可能であることを示します。 つまり NET.shudo.moba.lang.MobaThread クラスのスレッド だということです。スレッドID "スレッド名" 属性...
クラス classname は次のいずれかでなければなりません。
クラス名 classname の後に @host を付けた場 合、クラス classname はマシン host からロー ドされます。クラス定義 (クラスファイル) は place が提供す るので、マシン host 上で place が動いている必要が あります。
place シェルの start コマンドでは、 java.lang.Runnable を実装したクラスを、移送、外 部化可能なスレッドとして起動できます。 この場合、MobaThread クラスを意識する必要はありません。
また、移送、fork の対象が
これらの組合せで、4通りのメソッドがクラス MobaThread (API doc) に用意されています。
これらは次の引数をとります。
自スレッド 他スレッド 移送 static void goTo() void moveTo() fork static void fork() void forkThisThread()
自身を fork した場合、自分が元スレッドなのかコピーなのか を判別する必要があります。この判別は、クラス MobaThread (API doc) のメソッド boolean isInternalized() で判定できます。
クラスの定義 (クラスファイル) は保存されません。 unmarshal の際に、ストリームから得られるオブジェクト群が 必要とするクラスが存在しなければ、例外が throw されます。
Java Platform Core API (標準 API) がサポートしている Object Serialization ( JDK の文書) と同等のものです。 MOBA では独自の実装となっています。利用方法は JDK のものとほぼ同じです。
パッケージNET.shudo.moba.io (API doc) に次の 2つのクラスを用意しています。
コンストラクタ 読み書き 書き出し ObjectWriter(OutputStream out) void writeObject(Object obj) 読み込み Objectreader(InputStream in) Object readObject()
クラスの定義 (クラスファイル) は保存されません。 内部化の際に、ストリームから得られるスレッドが必要とする クラスが存在しなければ、例外が throw されます。
パッケージNET.shudo.moba.io (API doc) に次の 2つのクラスを用意しています。
コンストラクタ 読み書き 書き出し ThreadWriter(OutputStream out) void writeObject(Object obj) 読み込み Threadreader(InputStream in) Object readObject()
ただし、現状、_quick命令がクラスファイルに入り 込んでしまうことがあります。_quick命令は JVM 内に閉じた最適化で生成されます。これを含むクラスファイル がロードされた場合の JVM の動作は未定義です。
_quick命令について詳しくは、 "The Java Virtual Machine Specification" を参照して下さい。日本語訳の書籍も入手可能です。
このため、JDK 1.1 以降では Class Exportation はまだ実用になりません。
パッケージNET.shudo.moba.io (API doc) に次のクラスを用意しています。
コンストラクタ Export ClassWriter(OutputStream out) void writeClass(Class clazz)
スレッドの移送、外部化を行う際は、JIT コンパイラが働かな いように設定しておく必要があります。JIT コンパイラを利用 するかしないか、JDK では、環境変数 JAVA_COMPILER で制御します。 JAVA_COMPILER が設定されていないと JIT コンパイラが働きません。
複数のスレッドが同じオブジェクトを参照している場合、一方 のスレッドが移送すると、共有されているオブジェクトは移送 先にコピーされます。これにより、プログラムのセマンティク スが変わってしまうことがあります。
複数スレッドが協調するプログラムで MOBA を利用する場合、 上に述べた移送のセマンティクスを理解しておいて下さい。
セキュリティマネージャを利用して、移送スレッドの行動を制 限する仕掛けを用意しようと考えています。