%#!make OX-RFC-101-ja.dvi % $OpenXM: OpenXM/doc/OpenXM-specs/OX-RFC-101.tex,v 1.7 2020/03/14 01:21:56 takayama Exp $ \documentclass{article} %%\IfFileExists{epsfig.sty}{\usepackage{epsfig}}{} \usepackage{html} /*&jp \title{{\bf エンジン起動プロトコル, OpenXM RFC 101 Draft}} \author{ 小原功任\thanks{{金沢大学理学部計算科学教室, \htmladdnormallink{http://omega.s.kanazawa-u.ac.jp/ohara/}{http://omega.s.kanazawa-u.ac.jp/ohara/}}}} \date{ 2000年, 11月30日} */ /*&eg \title{{\bf Protocol to Start Engines, OpenXM RFC 101 Draft}} \author{ Katsuyoshi Ohara\thanks{Department of Computational Science, Kanazawa University, \htmladdnormallink{http://www.s.kanazawa.ac.jp}{http://www.s.kanazawa.ac.jp}}} \date{ November 30, 2000 } */ \begin{document} \maketitle \section{Session Management} /*&jp この文書では ``OpenXM RFC 100, OpenXM の設計と実装''\ \htmladdnormallink{http://www.math.kobe-u.ac.jp/OpenXM/OpenXM-RFC.html}{http://www.math.kobe-u.ac.jp/OpenXM/OpenXM-RFC.html} で定義されたコントロールサーバを置き換える新しいコントロールサーバの 仕様を説明する. */ /*&eg This document describes a new control server specification which is intended to be a replacement of the control server defined in ``Design and implementation of OpenXM, OpenXM RFC 100''\ \htmladdnormallink{http://www.math.kobe-u.ac.jp/OpenXM/OpenXM-RFC.html}{http://www.math.kobe-u.ac.jp/OpenXM/OpenXM-RFC.html}. */ \subsection{New OpenXM control servers} /*&jp 我々は新しいコントロールサーバを提案する。そのサンプル実装として oxc が 提供される。新しいコントロールサーバは以下の点で従来のものと異なる。 \begin{enumerate} \item コントロールサーバは OpenXM スタックマシンであり、 CMObject/Primitive をサポートする。 \item 計算サーバの起動はスタックマシンコマンドを介して行う。 \item 一つのコントロールサーバから複数の計算サーバを起動できる。 \end{enumerate} oxc の導入により、いままでのサーバの起動手順はコントロールサーバの起動と 計算サーバの起動に分離される。コントロールサーバを起動するには次の手順を 取る。まず、適当なオプション(後述)をつけて、コントロールサーバを起動する と、コントロールサーバはソケットを作成し、connect する。クライアントは、 listen, accept する。接続後、最初にバイトオーダを決定する。バイトオーダ の決定方法については、従来のものと変更はない (OpenXM/doc/OpenXM-specs/control.tex を見よ)。その後、コントロールサーバ は待機状態にはいる。コントロールサーバは OpenXM スタックマシンであるから、 mathcap の交換などの手続きに入ってもよい。 \subsection{OpenXM control stack machine} コントロールサーバは、次のスタックマシンコマンドを実装しなければならない。 それぞれのスタックコマンドの意味は、{\bf 以前のコントロールサーバとは異なる。} \begin{enumerate} \item \begin{verbatim} SM_control_spawn_server \end{verbatim} 新たに計算サーバを起動する。計算サーバの起動に成功すると、その ID を返す。 Request: \begin{tabular}{|c|c|} \hline {\tt int32 OX\_COMMAND} & {\tt int32 SM\_control\_spawn\_server} \\ \hline \end{tabular} Stack before the request: \begin{tabular}{|c|c|} \hline {\sl List} Argument \\ \hline \end{tabular} Stack after the request: \begin{tabular}{|c|c|} \hline {\sl Integer32} ServerID \\ \hline \end{tabular} Output: none. Argument: \begin{tabular}{|c|c|c|} \hline {\sl List} Ports & {\sl String} ServerName & ...\\ \hline \end{tabular} Ports: \begin{tabular}{|c|c|} \hline {\sl Integer32} Port & ... \\ \hline \end{tabular} \item \begin{verbatim} SM_control_terminate_server \end{verbatim} 指定された計算サーバに SIGKILL を送る。 Request: \begin{tabular}{|c|c|} \hline {\tt int32 OX\_COMMAND} & {\tt int32 SM\_control\_terminate\_server} \\ \hline \end{tabular} Stack before the request: \begin{tabular}{|c|c|} \hline {\sl Integer32} ServerID \\ \hline \end{tabular} Output: none. \item \begin{verbatim} SM_control_kill \end{verbatim} 全ての計算サーバに SIGKILL を送る。 Request: \begin{tabular}{|c|c|} \hline {\tt int32 OX\_COMMAND} & {\tt int32 SM\_control\_kill} \\ \hline \end{tabular} Output: none. \item \begin{verbatim} SM_control_reset_connection_server \end{verbatim} 指定された計算サーバに SIGUSR1 を送る。 Request: \begin{tabular}{|c|c|} \hline {\tt int32 OX\_COMMAND} & {\tt int32 SM\_control\_reset\_connection\_server} \\ \hline \end{tabular} Stack before the request: \begin{tabular}{|c|c|} \hline {\sl Integer32} ServerID \\ \hline \end{tabular} Output: none. \item \begin{verbatim} SM_control_reset_connection \end{verbatim} 全ての計算サーバに SIGUSR1 を送る。これは下位互換性のための措置である。 Request: \begin{tabular}{|c|c|} \hline {\tt int32 OX\_COMMAND} & {\tt int32 SM\_control\_reset\_connection} \\ \hline \end{tabular} Output: none. \end{enumerate} \bigskip \bigskip \subsection{OpenXM reset protocol} OX-RFC-100 に準拠する。 \subsection{A sample implementation} \subsubsection{Command Line Arguments} コントロールサーバの実行形式は getopt(3) に ``c:p:h:x'' で指定するオプショ ンを持つ。すなわち、 \begin{verbatim} oxc -c [password] -h [hostname] -p [portnumber] -x \end{verbatim} {\tt -h} では、クライアントのホスト名を指定する。クライアントはあらかじめ、 hostname:port を開いて待ち受けなければならない。 {\tt -x} オプションはなくてもよい。-x を指定し、かつ環境変数 DISPLAY が 設定されていると、oxc は新たに端末(ウィンドウ)を作成して、メッセージをそ の端末に出力する。oxc の用いる端末の種類は環境変数OpenXM\_XTERM で指定す る。デフォルトは xterm である。 オプション {\tt -h} が指定されないときには特別な動作を行う。 \subsubsection{パイプを利用した接続} oxc はオプション {\tt -h} が指定されないときには、コマンドラインで与えら れるべき情報を、標準入力から得ようとする。ここでは、この機能について説明 する。まず、標準入力から受け取るデータは次の形式をしていなければならない。 \begin{tabular}{|c|c|c|c|c|} \hline {\sl int32} port & {\sl String} hostname & {\sl byte} 0 & {\sl String} password & {\sl byte} 0\\ \hline \end{tabular} \medskip String は C のストリングではなくて、cmo\_string のような、長さ付きの ストリングである。 \noindent データの例: \\ port = 1324 = 0x052c, hostname = ``orange'', password = ``hogehoge'' の場合 \begin{verbatim} 00 00 05 2c 00 00 00 07 6f 72 61 6e 67 65 00 00 00 00 09 68 6f 67 65 68 6f 67 65 00 \end{verbatim} さて具体的な起動プロセスは次の通りである。 \begin{enumerate} \item クライアントは pipe(2) を用いて、ファイルディスクリプタ fd0, fd1 を 手にいれる。 \item fork(2) で子プロセスを生成し、子プロセスは dup2(fd1, 0) を実行する。 これで 親プロセスの fd0 と子プロセスの 0 が接続されている。 \item 子プロセスは exec("ssh remotehost controlserver") としてリモートプロセ ス起動する。このとき、親プロセスの fd0 とリモートプロセスの 0 が接続さ れている。 \item この通信路はリモートプロセスからは標準入力として見えている。 リモートプロセスは標準入力から既に述べたフォーマットにしたがってデータを 読み込む。リモートプロセスは、そのデータを用いて connect(2) を実行する。 \end{enumerate} \subsubsection{Local Functions} コントロールサーバの各実装は、独自にローカル関数をサポートしてもよい。 実際、サンプル実装 oxc はローカル関数をサポートしている。 ここでは、oxc のローカル関数 spawn について説明しよう。 spawn は計算サーバを起動し、少なくとも 1 個の引数を持つ。この引数は SM\_control\_spawn\_server で用いられる {\sl List} Argument と同一の形式で ある。すなわち、スタックに(右がトップ) \begin{tabular}{|c|c|c|} \hline {\sl List} Argument & {\sl Integer32} 1 & {\sl String} ``spawn'' \\ \hline \end{tabular} を積み、SM\_executeFunction をコントローラに送る。 SM\_executeStringByLocalParser は利用できないので注意する。 spawn は、計算サーバの起動に成功したら (CMO\_INT32, サーバID) を、失 敗したらエラーオブジェクトをスタックに積む。例えば計算サーバが発見できな かった場合にはエラーオブジェクトを積むことになる。コントロールサーバは access(2) を用いて PATH から計算サーバを探す。もし見つからなければ、fork をせずに、エラーオブジェクトをスタックに積む。 */ /*&eg This document has not yet been translated into English from Japanese. */ \end{document}