version 1.1, 2000/11/30 02:41:36 |
version 1.5, 2000/12/05 06:38:55 |
|
|
% $OpenXM$ |
%#!make OX-RFC-101-ja.dvi |
|
% $OpenXM: OpenXM/doc/OpenXM-specs/OX-RFC-101.tex,v 1.4 2000/12/01 08:03:48 ohara Exp $ |
\documentclass{article} |
\documentclass{article} |
%%\IfFileExists{epsfig.sty}{\usepackage{epsfig}}{} |
%%\IfFileExists{epsfig.sty}{\usepackage{epsfig}}{} |
\usepackage{html} |
\usepackage{html} |
/*&jp |
/*&jp |
\title{{\bf $B%(%s%8%s5/F0%W%m%H%3%k(B, OpenXM RFC 101 Draft}} |
\title{{\bf エンジン起動プロトコル, OpenXM RFC 101 Draft}} |
\author{ $B>.868yG$(B\thanks{{$B6bBtBg3XM}3XIt7W;;2J3X65<<(B, \htmladdnormallink{http://www.s.kanazawa.ac.jp}{http://www.s.kanazawa.ac.jp}}}} |
\author{ 小原功任\thanks{{金沢大学理学部計算科学教室, \htmladdnormallink{http://omega.s.kanazawa-u.ac.jp/ohara/}{http://omega.s.kanazawa-u.ac.jp/ohara/}}}} |
\date{ 2000$BG/(B, 11$B7n(B30$BF|(B} |
\date{ 2000年, 11月30日} |
*/ |
*/ |
/*&eg |
/*&eg |
\title{{\bf Protocol to Start Engines, OpenXM RFC 101 Draft}} |
\title{{\bf Protocol to Start Engines, OpenXM RFC 101 Draft}} |
|
|
\section{Session Management} |
\section{Session Management} |
|
|
/*&jp |
/*&jp |
$B$3$NJ8=q$G$O(B ``OpenXM RFC 100, OpenXM $B$N@_7W$H<BAu(B''\ |
この文書では ``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} |
\htmladdnormallink{http://www.math.kobe-u.ac.jp/OpenXM/OpenXM-RFC.html}{http://www.math.kobe-u.ac.jp/OpenXM/OpenXM-RFC.html} |
$B$GDj5A$5$l$?%3%s%H%m!<%k%5!<%P$rCV$-49$($k?7$7$$%3%s%H%m!<%k%5!<%P$N(B |
で定義されたコントロールサーバを置き換える新しいコントロールサーバの |
$B;EMM$r@bL@$9$k(B. |
仕様を説明する. |
*/ |
*/ |
|
|
/*&eg |
/*&eg |
Line 36 a replacement of the control server defined in |
|
Line 37 a replacement of the control server defined in |
|
|
|
/*&jp |
/*&jp |
|
|
$B2f!9$O?7$7$$%3%s%H%m!<%k%5!<%P$rDs0F$9$k!#$=$N%5%s%W%k<BAu$H$7$F(B oxc $B$,(B |
我々は新しいコントロールサーバを提案する。そのサンプル実装として oxc が |
$BDs6!$5$l$k!#?7$7$$%3%s%H%m!<%k%5!<%P$O0J2<$NE@$G=>Mh$N$b$N$H0[$J$k!#(B |
提供される。新しいコントロールサーバは以下の点で従来のものと異なる。 |
\begin{enumerate} |
\begin{enumerate} |
\item $B%3%s%H%m!<%k%5!<%P$O(B OpenXM $B%9%?%C%/%^%7%s$G$"$j!"(B |
\item コントロールサーバは OpenXM スタックマシンであり、 |
CMObject/Primitive $B$r%5%]!<%H$9$k!#(B |
CMObject/Primitive をサポートする。 |
\item $B7W;;%5!<%P$N5/F0$O%9%?%C%/%^%7%s%3%^%s%I$r2p$7$F9T$&!#(B |
\item 計算サーバの起動はスタックマシンコマンドを介して行う。 |
\item $B0l$D$N%3%s%H%m!<%k%5!<%P$+$iJ#?t$N7W;;%5!<%P$r5/F0$G$-$k!#(B |
\item 一つのコントロールサーバから複数の計算サーバを起動できる。 |
\end{enumerate} |
\end{enumerate} |
|
|
oxc $B$NF3F~$K$h$j!"$$$^$^$G$N%5!<%P$N5/F0<j=g$O%3%s%H%m!<%k%5!<%P$N5/F0$H(B |
oxc の導入により、いままでのサーバの起動手順はコントロールサーバの起動と |
$B7W;;%5!<%P$N5/F0$KJ,N%$5$l$k!#%3%s%H%m!<%k%5!<%P$r5/F0$9$k$K$O<!$N<j=g$r(B |
計算サーバの起動に分離される。コントロールサーバを起動するには次の手順を |
$B<h$k!#$^$:!"E,Ev$J%*%W%7%g%s(B($B8e=R(B)$B$r$D$1$F!"%3%s%H%m!<%k%5!<%P$r5/F0$9$k(B |
取る。まず、適当なオプション(後述)をつけて、コントロールサーバを起動する |
$B$H!"%3%s%H%m!<%k%5!<%P$O%=%1%C%H$r:n@.$7!"(Bconnect $B$9$k!#%/%i%$%"%s%H$O!"(B |
と、コントロールサーバはソケットを作成し、connect する。クライアントは、 |
listen, accept $B$9$k!#@\B38e!"%P%$%H%*!<%@$r7hDj$9$k!#%P%$%H%*!<%@$N7hDj(B |
listen, accept する。接続後、最初にバイトオーダを決定する。バイトオーダ |
$B$K$D$$$F$O(B???$B$r8+$h!#$=$N8e!"%3%s%H%m!<%k%5!<%P$OBT5!>uBV$K$O$$$k!#%3%s(B |
の決定方法については、従来のものと変更はない |
$B%H%m!<%k%5!<%P$O(B OpenXM $B%9%?%C%/%^%7%s$G$"$k$+$i!"(Bmathcap $B$N8r49$J$I$N<j(B |
(OpenXM/doc/OpenXM-specs/control.tex を見よ)。その後、コントロールサーバ |
$BB3$-$KF~$C$F$b$h$$!#(B |
は待機状態にはいる。コントロールサーバは OpenXM スタックマシンであるから、 |
|
mathcap の交換などの手続きに入ってもよい。 |
|
|
$B7W;;%5!<%P$N5/F0$O!"(Boxc $B$N%m!<%+%k4X?t(B oxc\_open $B$K$h$k!#(Boxc\_open $B$O>/(B |
\subsection{OpenXM control stack machine} |
$B$J$/$H$b(B 4 $B8D$N0z?t$r;}$D!#$9$J$o$A!"(B |
|
|
コントロールサーバは、次のスタックマシンコマンドを実装しなければならない。 |
|
それぞれのスタックコマンドの意味は、{\bf 以前のコントロールサーバとは異なる。} |
|
|
|
\begin{enumerate} |
|
\item |
\begin{verbatim} |
\begin{verbatim} |
oxc_open($B7W;;%5!<%PL>(B, $B%[%9%HL>(B, $B%]!<%HHV9f(B, $B%b!<%I(B, ...) |
SM_control_spawn_server |
\end{verbatim} |
\end{verbatim} |
$B$H$$$&7A<0$G$"$k!#$3$3$G!"!V7W;;%5!<%PL>!W!"!V%[%9%HL>!W$O(B CMO\_STRING |
新たに計算サーバを起動する。計算サーバの起動に成功すると、その ID を返す。 |
$B7?$N%*%V%8%'%/%H!"!V%]!<%HHV9f!W!"!V%b!<%I!W$O(B CMO\_INT32$B7?(B |
|
$B$N%*%V%8%'%/%H$G$"$k!#%[%9%HL>$H$$$&$N$O(BOpenXM$B%/%i%$%"%s%H$N%[(B |
|
$B%9%HL>$N$3$H$G$"$k!#%m!<%+%k4X?t$N<B9T$O(B SM\_executeFunction $B$K$h$k!#$9(B |
|
$B$J$o$A3F0z?t$r=g$K%9%?%C%/$K@Q$_!":G8e$K(BSM\_executeFunction $B$r<B9T$9$k!#(B |
|
SM\_executeStringByLocalParser $B$OMxMQ$G$-$J$$$N$GCm0U$9$k!#(B |
|
|
|
oxc\_open $B$O!"7W;;%5!<%P$N5/F0$K@.8y$7$?$i(B (CMO\_INT32, $B%5!<%P(BID) $B$r!"<:(B |
Request: |
$BGT$7$?$i%(%i!<%*%V%8%'%/%H$r%9%?%C%/$K@Q$`!#Nc$($P7W;;%5!<%P$,H/8+$G$-$J(B |
\begin{tabular}{|c|c|} \hline |
$B$+$C$?>l9g$K$O%(%i!<%*%V%8%'%/%H$r@Q$`$3$H$K$J$k!#%3%s%H%m!<%k%5!<%P$O(B |
{\tt int32 OX\_COMMAND} & {\tt int32 SM\_control\_spawn\_server} \\ |
access(2) $B$rMQ$$$F(B PATH $B$+$i7W;;%5!<%P$rC5$9!#$b$78+$D$+$i$J$1$l$P!"(Bfork |
\hline |
$B$r$;$:$K!"%(%i!<%*%V%8%'%/%H$r%9%?%C%/$K@Q$`!#(B |
\end{tabular} |
|
|
$B%3%s%H%m!<%k%5!<%P$N<B9T7A<0$O0J2<$N%*%W%7%g%s$r5v$9!#(B |
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} |
\begin{verbatim} |
--pass |
SM_control_terminate_server |
--host |
|
--port |
|
\end{verbatim} |
\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 |
/*&eg |