Annotation of OpenXM/doc/OpenXM-specs/communication-model.tex, Revision 1.12
1.12 ! takayama 1: %% $OpenXM: OpenXM/doc/OpenXM-specs/communication-model.tex,v 1.11 2016/08/28 02:43:13 takayama Exp $
! 2: //&jp \section{ OpenXM の通信モデル}
1.6 noro 3: //&eg \section{ Communication model of OpenXM}
1.1 noro 4:
5: /*&jp
1.12 ! takayama 6: われわれは, 数学プロセスがメッセージを
! 7: 交換しながら計算が進行していくというモデルを想定して設計をすすめている.
! 8: 各プロセスはスタックマシンであり, これを OX スタックマシンとよぶ.
! 9: 数学プロセスの間の通信路の確保の仕方としては以下のように
! 10: いろいろな実現方法を想定している.
1.1 noro 11: \begin{enumerate}
1.12 ! takayama 12: \item ファイルを介して通信する.
! 13: \item Library として直接リンクして通信する.
! 14: \item TCP/IP ソケットの利用.
! 15: \item Remote Procedure call の利用.
1.7 takayama 16: \item JAVA RMI.
1.12 ! takayama 17: \item マルチスレッドの利用.
! 18: \item PVM ライブラリの利用.
! 19: \item MPI ライブラリの利用.
1.1 noro 20: \end{enumerate}
21:
1.12 ! takayama 22: 通信とはプロセス間のメッセージのやりとりである.
! 23: メッセージは論理的に次のような構造をもつ:
1.1 noro 24: */
25: /*&eg
1.6 noro 26: In our model of computation, mathematical processes proceed
1.1 noro 27: a computation by exchanging messages. Each process is a stack machine,
28: which is called an OX stack machine.
1.3 noro 29: The following methods are possible to realize communications between
1.1 noro 30: mathematical processes.
31: \begin{enumerate}
32: \item Communication by files.
33: \item Linking as a subroutine library.
34: \item TCP/IP streams.
35: \item Remote Procedure call.
1.7 takayama 36: \item JAVA RMI.
1.6 noro 37: \item Multi-thread.
1.1 noro 38: \item PVM library.
39: \item MPI library.
40: \end{enumerate}
41:
1.6 noro 42: In OpenXM communication means exchange of messages between processes.
1.1 noro 43: A message has the following structure:
44: */
45: /*&C
46: \begin{center}
47: \begin{tabular}{|c|c|c|}
48: \cline{1-2}
49: {\tt destination} & {\tt origin} & \multicolumn{1}{}{} \\ \hline
50: {\tt extension}&{\tt ox message\_tag}&{\tt message\_body} \\
51: \hline
52: \end{tabular}
53: \end{center}
54: */
55: /*&jp
1.12 ! takayama 56: このメッセージを, OX message (OpenXM message object) とよぶ.
! 57: OX Message はトップレベルのメッセージ object であり,
! 58: 仕様書では, さまざまなグループに属する object が登場する.
! 59: グループ名は, たとえば, OX Message/TCPIP/Primitive などと書く.
! 60: {\tt message\_body} の部分の仕様は, OX Message
! 61: の上位に位置する部分であり, SMobject または CMObject がくる.
! 62: これらの object はタグをもち, そのタグ定数は {\tt SM\_} または
! 63: {\tt CMO\_} ではじまる.
! 64: SMobject は, スタックマシンコマンドメッセージ object であり,
! 65: やはり, グループ分けされている.
! 66: 各グループ名は,
! 67: SMobject/Primitive, SMobject/Basic などと書く.
! 68: SMobject の構造は
! 69: サーバスタックマシンの節で詳しく説明する.
! 70: CMObject についてはすでに Primitive の CMObject の説明をしたが,
! 71: あとで CMObject レベル 1の説明をする.
! 72: OX Message の
! 73: {\tt ox message\_tag} の定数は {\tt OX\_} で始まる.
1.1 noro 74: */
75: /*&eg
76: We call it an OX message (OpenXM message object).
1.6 noro 77: OX message is the top level message object.
1.1 noro 78: The OX messages are classified into three types: DATA, COMMAND,
79: and SPECIAL. They are distinguished by {\tt ox message\_tag}.
80: The name of an ox message tag begins with {\tt OX\_}.
1.3 noro 81: Typical OX message tags are {\tt OX\_COMMAND} followed by
1.6 noro 82: SMobject and {\tt OX\_DATA} followed by CMObject.
1.1 noro 83: Each message object also has its tag. For SMobject, the name
1.6 noro 84: of a tag begins with {\tt SM\_}. For CMObject, the name of
1.1 noro 85: a tag begins with {\tt CMO\_}.
86: An SMobject represents a stack machine command and categorized
1.6 noro 87: into several groups such as SMobject/Primitive, SMobject/Basic.
1.1 noro 88: The details of SMobjects will be explained in Section \ref{sec:stackmachine}.
1.6 noro 89: We have already explained the Primitive CMObjects.
90: We will describe the Basic CMObjects in Section \ref{sec:basic1}.
1.1 noro 91: */
1.12 ! takayama 92: //&jp \subsection{ OX Message の 表現方法 }
1.1 noro 93: //&eg \subsection{ OX Messages }
94:
95: /*&jp
1.12 ! takayama 96: OpenXM で各プロセスは
1.1 noro 97: \begin{center}
1.12 ! takayama 98: (OXexpression を理解するスタックマシン) $+$ (xxx 言語で動くエンジン)
1.1 noro 99: \end{center}
1.12 ! takayama 100: なるハイブリッド構成である.
! 101: このプロセスを, OX スタックマシンと呼ぶ.
! 102: ここでは, OX スタックマシンとやりとりするメッセージである,
! 103: OX Message を表現するための OXexpression, および,
! 104: スタックマシンの operator に対応する, SMobject を表現するための SMexpression
! 105: を定義しよう.
! 106: OX Message を スタックマシンコマンド,
! 107: SMobject を スタックマシンオペレータともよぶ.
1.1 noro 108: */
109:
1.2 noro 110: /*&eg
1.6 noro 111: In OpenXM, each process may have a hybrid interface;
1.2 noro 112: it may accept and execute not only stack machine commands,
113: but also its original command sequences.
114: We call such a process an OX stack machine.
115: Here we introduce OXexpression and SMexpression
116: to express OX messages and SM objects respectively.
117: */
118:
1.12 ! takayama 119: //&jp \subsubsection{ OX メッセージの表現法 (Lisp 風) }
1.8 takayama 120: //&eg \subsubsection{ Expressions of OX messages (Lisp like) }
1.1 noro 121: /*&C
122: \begin{eqnarray*}
123: \mbox{OXexpression}
124: &:& \quad
125: \mbox{\tt (} \mbox{\tt OX\_tag} \
126: [\mbox{ expression}] \mbox{\tt )}\\
127: \mbox{expression}
128: &:& \quad \mbox{SMexpression} \\
129: & &|\ \mbox{CMOexpression} \\
130: \mbox{SMexpression}
131: &:& \mbox{\tt (} \mbox{\tt SM\_tag} \
132: \{ \mbox{CMOexpression} \} \mbox{\tt )}\\
133: \end{eqnarray*}
134: */
135: /*&jp
1.12 ! takayama 136: expression の各要素を区切るために {\tt ,} (コンマ) を用いてもよい.
! 137: {\tt OX\_tag} は {\tt OX\_} で始まる定数である.
! 138: {\tt SM\_tag} は {\tt SM\_} で始まるスタックマシンオペレータを識別する定数である.
! 139: 発信元 AAA, 受信先 BBB を書く必要があるときは,
! 140: From AAA, To BBB, を OXexpression の前に書く.
! 141: 必要なければ省略する.
1.1 noro 142:
1.12 ! takayama 143: たとえば, あとで説明する, CMO string ``Hello'' を スタックにプッシュする
! 144: 表現は次のように書く:
1.1 noro 145: */
1.2 noro 146:
147: /*&eg
1.6 noro 148: A comma `{\tt ,}' may be used to separate elements in an expression.
1.2 noro 149: {\tt OX\_tag} is a constant which denotes an OX message tag.
150: {\tt SM\_tag} is a constant which denotes an SM command tag.
151: If a sender AAA or a receiver BBB has to be specified,
152: 'From AAA' or 'To BBB' is written before the OXexpression.
153:
154: For example the following expression means a request to
155: push a CMO string ``Hello''.
156: */
1.1 noro 157: /*&C
158: \begin{center}
159: (OX\_DATA, (CMO\_STRING, 5, "Hello"))
160: \end{center}
161: */
162:
163:
1.6 noro 164: /*&eg
1.2 noro 165: The following expression means a request to execute
166: a local function ``hoge''.
1.1 noro 167: */
168:
169: /*&C
170: \begin{center}
1.10 takayama 171: (OX\_DATA, (CMO\_STRING, 4, "hoge"))
1.1 noro 172: \end{center}
173: \begin{center}
174: (OX\_COMMAND, SM\_executeStringByLocalParser)
175: \end{center}
176: */
177:
178: /*&jp
1.12 ! takayama 179: 標準エンコード法では, それぞれのタグは 32 bit (4 bytes) の
! 180: ネットワークバイトオーダでの整数として表現される.
1.7 takayama 181: */
182: /*&eg
1.2 noro 183: In our standard encoding method, each tag is expressed as
1.7 takayama 184: a 32 bit (4 bytes) integer with the network byte order.
185: */
186:
187: /*&C
188:
189: */
1.8 takayama 190:
1.12 ! takayama 191: //&jp \subsubsection{ OX メッセージの表現 (XML) }
1.8 takayama 192: //&eg \subsubsection{ Expression of OX messages (XML) }
1.7 takayama 193:
194: /*&jp
1.12 ! takayama 195: OX メッセージは XML で表現することも可能である. 次に例を示す.
1.7 takayama 196: */
197: /*&eg
198: OX messages can be expressed by XML. The following is an example.
199: */
200: /*&C
201: \begin{verbatim}
202: <ox>
203: <ox_data>
204: <ox_serial> <int32> 0 </int32> </ox_serial>
205: <cmo> <cmo_string>
206: <int32 for="length"> 5 </int32>
207: <string> "Hello" </string>
208: </cmo_string>
209: </cmo>
210: </ox_data>
211: <ox_command>
212: <ox_serial> <int32> 1 </int32> </ox_serial>
213: <sm_popCMO/>
214: </ox_command>
215: </ox>
216: \end{verbatim}
1.1 noro 217: */
218:
1.12 ! takayama 219: //&jp \subsection{OXexpression の 標準 encoding と TCP/IP ソケットによる実装法}
1.6 noro 220: //&eg \subsection{Standard encoding of OXexpressions and an implementation by TCP/IP sockets}
1.1 noro 221: /*&jp
1.12 ! takayama 222: 通信の実現方法は通信路のとりかたによりかわるが,
! 223: 論理構造は統一的にあつかわないといけない.
! 224: OXexpression はその論理構造を記述している.
! 225:
! 226: ここでは OXexpression の標準 encoding の概略を説明する.
! 227: この encoding 法はTCP/IP ソケット用の encoding 法として
! 228: 現在存在しているサーバに使用されている.
! 229: さらにOX スタックマシンの計算状態を制御するための, コントロールメッセージに
! 230: ついても説明する.
! 231:
! 232:
! 233: {\tt destination}, {\tt origin} の部分は, ソケットによる
! 234: peer to peer の接続なので省略する.
! 235: {\tt extension} フィールドは
! 236: {\tt message\_tag} フィールドの次にくる.
! 237: {\tt extension} フィールドは OX パケットのシリアル番号がはいる.
! 238: シリアル番号は {\tt int32} である.
! 239: この番号は, サーバがエラーを起こした場合, エラーをおこした,
! 240: OX パケットの番号を戻すのに主に利用される.
! 241: 以下 {\tt extension} フィールドは, {\tt message\_tag} の
! 242: に含まれると理解し {\tt extension} フィールドは省略する.
! 243: したがってパケットは
! 244: 次のように記述する
1.2 noro 245: */
246:
247: /*&eg
248: The logical structure of OX messages are independent of implementations
1.3 noro 249: of communication. The OXexpression represents the logical structure.
250: Here we explain an outline of the standard encoding scheme of OXexpression.
251: This encoding scheme is used to implement OpenXM protocols on TCP/IP sockets.
252: In addition, we also explain the control messages to control stack machines.
253:
254: As the socket connection is peer to peer, {\tt destination} and {\tt origin}
255: are omitted.
256: The {\tt extension} field is placed after the {\tt message\_tag} field.
257: The {\tt extension} field consists of the serial number for OX message,
258: which is {\tt int32}.
259: The serial number is used to identify an OX message which caused
260: an error on a server.
261: In the following we regard the {\tt extension} as a component of
262: the {\tt message\_tag} field and omit the {\tt extension} field.
263: Thus OX messages are represented as follows.
1.1 noro 264: */
265: /*&C
266: \begin{center}
267: \begin{tabular}{|c|c|}
268: \hline
269: {\tt ox message\_tag}&{\tt message\_body} \\
270: \hline
271: \end{tabular}
272: \end{center}
273: */
1.12 ! takayama 274: //&jp \noindent が, もっとこまかく見ると,
1.6 noro 275: //&eg \noindent More precisely it has the following representation.
1.1 noro 276: /*&C
277: \begin{center}
278: \begin{tabular}{|c|c|}
279: \hline
1.6 noro 280: {\tt ox message\_tag}, \ {\tt serial number}&{\tt message\_body} \\
1.1 noro 281: \hline
282: \end{tabular}
283: \end{center}
284: */
285: /*&jp
1.6 noro 286: \noindent
1.12 ! takayama 287: となっている.
1.1 noro 288:
1.12 ! takayama 289: グループ OX Message/TCPIP/Primitive の
! 290: {\tt ox message\_tag} としては次のものが用意されている.
1.1 noro 291: */
1.6 noro 292: //&eg \noindent As {\tt ox message\_tag} the following are provided.
1.1 noro 293:
294: /*&C
295: @plugin/oxMessageTag.h
296: \begin{verbatim}
297: #define OX_COMMAND 513
298: #define OX_DATA 514
299:
300: #define OX_DATA_WITH_LENGTH 521
301: #define OX_DATA_OPENMATH_XML 523
302: #define OX_DATA_OPENMATH_BINARY 524
303: #define OX_DATA_MP 525
304:
305: #define OX_SYNC_BALL 515
1.9 takayama 306: #define OX_NOTIFY 516
1.1 noro 307: \end{verbatim}
308: */
309:
310: /*&jp
1.12 ! takayama 311: 通信路は 2 つ用意する.
! 312: 1番目の通信路は
1.1 noro 313: \verb+ OX_COMMAND +
1.12 ! takayama 314: および
1.1 noro 315: \verb+ OX_DATA +
1.12 ! takayama 316: がながれる.
! 317: 2番目の通信路 ({\tt control}と呼ぶ) には,
! 318: \verb+ OX_COMMAND + およびそれに続くコントロールコマンド
1.1 noro 319: \verb+ SM_control_* +
1.12 ! takayama 320: またはコントロール関係のデータ, つまり header
! 321: \verb+ OX_DATA + ではじまりそれに続く CMO データ
! 322: がながれる.
! 323: これらをコントロールメッセージおよびコントロールメッセージの結果
! 324: メッセージと呼ぶ.
! 325: サンプルサーバでは, この 2 つの通信路を, 2 つのポートを用いて
! 326: 実現している.
1.1 noro 327:
328:
1.12 ! takayama 329: \verb+ OX_COMMAND + メッセージは次の形のパケットで表現される: \\
1.3 noro 330: */
331: /*&eg
1.6 noro 332: Two streams are provided for communication between a client and a server.
1.3 noro 333: One is the stream to exchange data and to send stack machine commands.
334: The other is the stream to control stack machines.
335: Messages on the latter stream are called control messages and
336: results of control messages. The sample server implements
337: the above two streams by using two ports on TCP/IP.
338:
339: The stack machine command message has the following forms: \\
1.1 noro 340: */
341: /*&C
1.6 noro 342: \noindent
1.1 noro 343: \begin{tabular}{|c|c|}
344: \hline
345: {\tt OX\_COMMAND} & {\tt int32 function\_id} \\ \hline
346: {\it message\_tag} & {\it message\_body}
347: \\ \hline
348: \end{tabular}, \quad
349: ({\tt OX\_COMMAND}, ({\tt SM\_*}))
350: \\
351: */
352:
1.12 ! takayama 353: //&jp \verb+ OX_DATA + メッセージは次の形のパケットで表現される: \\
1.3 noro 354: //&eg CMO data message has the following form:\\
1.1 noro 355: /*&C
356: \begin{tabular}{|c|c|}
357: \hline
358: {\tt OX\_DATA} & {\tt CMO data} \\ \hline
359: {\it message\_tag} & {\it message\_body}\\ \hline
360: \end{tabular}, \quad
361: ({\tt OX\_DATA}, {\sl CMObject} data)
362: \\
363: */
1.12 ! takayama 364: //&jp コントロールメッセージは次の形のパケットで表現される: \\
1.3 noro 365: //&eg The control message has the following form:\\
1.1 noro 366: /*&C
367: \begin{tabular}{|c|c|}
368: \hline
369: {\tt OX\_COMMAND} & {\tt int32 function\_id} \\ \hline
370: \end{tabular}, \quad
371: ({\tt OX\_COMMAND},({\tt SM\_control\_*}))
372: \\
373: */
374: /*&jp
1.12 ! takayama 375: コントロールメッセージは, 計算を中断したい, debug 用の スレッドを起動する,
! 376: debug モードを抜けたい, などの用途に利用する.
1.3 noro 377: */
378: /*&eg
379: The control message is used to interrupt a computation, to invoke
380: debugging threads, or to exit form the debugging mode.
381: */
1.1 noro 382:
1.12 ! takayama 383: //&jp コントロールメッセージの結果メッセージは次の形のパケットで表現される: \\
1.6 noro 384: //&eg The result of a control message has the following form:\\
1.1 noro 385: /*&C
386: \begin{tabular}{|c|c|l|}
387: \hline
388: {\tt OX\_DATA} & {\tt CMO\_INT32} & {\tt int32 data} \\ \hline
389: \end{tabular}, \quad
390: ({\tt OX\_DATA}, {\sl Integer32 } n)
391: \\
392: */
393:
394:
395: /*&jp
396: {\tt int32 function\_id}
1.12 ! takayama 397: の部分に, サーバスタックマシン の operator に対応する番号がはいる.
! 398: グループ SMobject/Primitive および SMobject/Basic に属する
! 399: タグとして以下のものがある.
1.1 noro 400: */
1.3 noro 401: /*&eg
402: {\tt int32 function\_id} is the value of a stack machine command.
1.6 noro 403: SM tags in SMobject/Primitive and SMobject/Basic and corresponding
1.3 noro 404: values are as follows.
405: */
1.1 noro 406: /*&C
407: @plugin/oxFunctionId.h
408: \begin{verbatim}
409: #define SM_popSerializedLocalObject 258
410: #define SM_popCMO 262
411: #define SM_popString 263
412:
413: #define SM_mathcap 264
414: #define SM_pops 265
415: #define SM_setName 266
416: #define SM_evalName 267
417: #define SM_executeStringByLocalParser 268
418: #define SM_executeFunction 269
419: #define SM_beginBlock 270
420: #define SM_endBlock 271
421: #define SM_shutdown 272
422: #define SM_setMathCap 273
423: #define SM_executeStringByLocalParserInBatchMode 274
424: #define SM_getsp 275
425: #define SM_dupErrors 276
426:
1.11 takayama 427: #define SM_nop 300 /* do nothing */
1.1 noro 428:
429: #define SM_control_kill 1024
430: #define SM_control_reset_connection 1030
431: \end{verbatim}
432: */
433:
1.12 ! takayama 434: //&jp \noindent たとえば,
1.6 noro 435: //&eg \noindent For example
1.5 noro 436: /*&C
1.1 noro 437: \begin{center}
438: (OX\_COMMAND, SM\_pops)
439: \end{center}
440: */
1.12 ! takayama 441: //&jp \noindent は
1.6 noro 442: //&eg \noindent is encoded as follows.
1.3 noro 443: /*&C
1.1 noro 444: \begin{center}
445: \begin{tabular}{|c|c|}
446: \hline
447: {\tt int32} 513 & {\tt int32} 265 \\
448: \hline
449: \end{tabular}
450: \end{center}
451: */
1.12 ! takayama 452: //&jp とエンコードされる.
1.3 noro 453:
1.1 noro 454: /*&jp
1.12 ! takayama 455: operator の詳細は次の節で説明する.
! 456: これらの定数の名前はインプリメントのとき短縮形で表現してもよい.
1.3 noro 457: */
458: /*&eg
1.6 noro 459: The details of the operators are described in Section \ref{sec:stackmachine}.
1.4 noro 460: Names of these constants may be represented by abbreviated forms.
1.1 noro 461: */
462:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>