Mercurial > hg > Papers > 2009 > rep-verify-sigos
comparison rep-verify-sigos.ind @ 3:f1214f4b5933
figure
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 26 Mar 2009 10:31:47 +0900 |
parents | ac15ac2df491 |
children | 8e30bfb5deb6 |
comparison
equal
deleted
inserted
replaced
2:ac15ac2df491 | 3:f1214f4b5933 |
---|---|
22 複数人が同じテキストを共有して編集するプロトコルは、 | 22 複数人が同じテキストを共有して編集するプロトコルは、 |
23 さまざまなものが提案されているが、汎用エディタに実装 | 23 さまざまなものが提案されているが、汎用エディタに実装 |
24 する前堤のプロトコルはほとんどない。Remote Editing Protocol | 24 する前堤のプロトコルはほとんどない。Remote Editing Protocol |
25 では、複数のSession Managerと、リング状のSession の上に | 25 では、複数のSession Managerと、リング状のSession の上に |
26 編集コマンドを循環させる方法を取っている。 | 26 編集コマンドを循環させる方法を取っている。 |
27 | |
28 <center><img src="fig/editor_to_editor2.pdf" alt="REPでの相互接続"></center> | |
27 | 29 |
28 この方法を採用した理由はいくつがある。 | 30 この方法を採用した理由はいくつがある。 |
29 集中サーバを用いない\underline{分散実装}が一つの前堤になっている。 | 31 集中サーバを用いない\underline{分散実装}が一つの前堤になっている。 |
30 Session Manager 自体が分散していて、Session Manager は、 | 32 Session Manager 自体が分散していて、Session Manager は、 |
31 (分離されたMergerを除けば)編集コマンドを中継するだけである。 | 33 (分離されたMergerを除けば)編集コマンドを中継するだけである。 |
65 は自動的に決まったポートを通してSMに接続(join/put)する。このようにすれば、 | 67 は自動的に決まったポートを通してSMに接続(join/put)する。このようにすれば、 |
66 エディタ上でホスト名を入力する必要はない。一つのホスト上では、 | 68 エディタ上でホスト名を入力する必要はない。一つのホスト上では、 |
67 単一のSMに複数のエディタが接続する。離れたホスト同士のエディタを | 69 単一のSMに複数のエディタが接続する。離れたホスト同士のエディタを |
68 接続する場合は、まず、それぞれのホスト同士のSMを接続する。そして、 | 70 接続する場合は、まず、それぞれのホスト同士のSMを接続する。そして、 |
69 それぞれエディタがSMに接続した後で、ホスト間の接続を選択(select)する。 | 71 それぞれエディタがSMに接続した後で、ホスト間の接続を選択(select)する。 |
72 <center><img src="fig/one_session_manager.pdf" alt="Session Managerの導入"></center> | |
70 | 73 |
71 ---Session managerの接続protocol | 74 ---Session managerの接続protocol |
72 | 75 |
73 SM同士の接続は、{\tt sm\_join}コマンドをSMに送ることによる。 | 76 SM同士の接続は、{\tt sm\_join}コマンドをSMに送ることによる。 |
74 接続により、接続したSM間でuniqueな session manager id | 77 接続により、接続したSM間でuniqueな session manager id |
79 が発行される場合もあるので、リングを避けるために、 | 82 が発行される場合もあるので、リングを避けるために、 |
80 {\tt sm\_join} はmaster SMまで転送される。自分自身に | 83 {\tt sm\_join} はmaster SMまで転送される。自分自身に |
81 {\tt sm\_join} が戻って来た場合は、その{\tt sm\_join} は | 84 {\tt sm\_join} が戻って来た場合は、その{\tt sm\_join} は |
82 廃棄される。現在は、既にsession/editorを持つSMは、他のSMに | 85 廃棄される。現在は、既にsession/editorを持つSMは、他のSMに |
83 接続することは出来ない。 | 86 接続することは出来ない。 |
87 <center><img src="fig/many_session_manager.pdf" alt="Session Manager同士の接続"></center> | |
84 | 88 |
85 ---Session 接続 protocol | 89 ---Session 接続 protocol |
86 | 90 |
87 SMに接続したエディタは、自分の既にオープンしたファイルを持って接続する | 91 SMに接続したエディタは、自分の既にオープンしたファイルを持って接続する |
88 {\tt put}と、他のエディタへ空のバッファを接続する{\tt join}の二種類の | 92 {\tt put}と、他のエディタへ空のバッファを接続する{\tt join}の二種類の |
103 によって、すべてのSMに通知される。このファイルの編集に参加したい場合は、 | 107 によって、すべてのSMに通知される。このファイルの編集に参加したい場合は、 |
104 まず、Editorを空のバッファの状態でSMに{\tt join}コマンドで接続する。 | 108 まず、Editorを空のバッファの状態でSMに{\tt join}コマンドで接続する。 |
105 すると、{\tt put}と同様に{\tt join}したEditorがすべてのSM上に通知される。 | 109 すると、{\tt put}と同様に{\tt join}したEditorがすべてのSM上に通知される。 |
106 SMのGUI上の操作{\tt select}により、{\tt put}されたファイルと{\tt join} | 110 SMのGUI上の操作{\tt select}により、{\tt put}されたファイルと{\tt join} |
107 したEditorが結びつけられる。 | 111 したEditorが結びつけられる。 |
112 <center><img src="fig/sm_join.pdf" alt="join コマンド"></center> | |
108 | 113 |
109 {\tt select}操作では、{\tt join}したEditorと{\tt put}したエディタを | 114 {\tt select}操作では、{\tt join}したEditorと{\tt put}したエディタを |
110 探し出す必要がある。そのために、SM木上にSM同士に到達するための | 115 探し出す必要がある。そのために、SM木上にSM同士に到達するための |
111 routing tableを構築している。これは、{\tt sm\_join}時に作成される。 | 116 routing tableを構築している。これは、{\tt sm\_join}時に作成される。 |
112 まず{\tt put}したEditorを探し、見つかったら{\tt select\_ack}を、 | 117 まず{\tt put}したEditorを探し、見つかったら{\tt select\_ack}を、 |
116 | 121 |
117 {\tt join}したエディタは空のバッファを持っているので、Session master | 122 {\tt join}したエディタは空のバッファを持っているので、Session master |
118 ({\tt put}したEditor)に、必要な編集行を要求する{\tt sync}コマンドを | 123 ({\tt put}したEditor)に、必要な編集行を要求する{\tt sync}コマンドを |
119 session ring に送る。Session master は、次のEditor Command を使って | 124 session ring に送る。Session master は、次のEditor Command を使って |
120 必要な行を送信する。 | 125 必要な行を送信する。 |
126 <center><img src="fig/use_case_put_join_over_sm.pdf" alt="Session Managerを介したエディタの接続"></center> | |
121 | 127 |
122 ---Editor Command | 128 ---Editor Command |
123 | 129 |
124 Editorのコマンドは、すべて、{\tt insert},{\tt delete} に分解される。 | 130 Editorのコマンドは、すべて、{\tt insert},{\tt delete} に分解される。 |
125 SM上での混乱を避けるために、Editorが直接SMに送ったユーザが生成した | 131 SM上での混乱を避けるために、Editorが直接SMに送ったユーザが生成した |
166 受け取った Editor Command をキューに入れておく。 | 172 受け取った Editor Command をキューに入れておく。 |
167 (2) 戻って来たタイミングで、キュー上のEditor Commandを、eid とCommandの | 173 (2) 戻って来たタイミングで、キュー上のEditor Commandを、eid とCommandの |
168 順序を基にソートする。 | 174 順序を基にソートする。 |
169 (3) Editor Command がなくても、他のEditorからCommand を受け取ったら、 | 175 (3) Editor Command がなくても、他のEditorからCommand を受け取ったら、 |
170 NOP Command を生成して、それが戻って来た時にソートを行なう。 | 176 NOP Command を生成して、それが戻って来た時にソートを行なう。 |
177 | |
178 <center><img src="fig/new_merge.pdf" alt="Session Ring上のREPコマンドの送信"></center> | |
171 | 179 |
172 この手法では、EditorがN個あるSessionの場合、一つのEditor Commandに対して、N-1 | 180 この手法では、EditorがN個あるSessionの場合、一つのEditor Commandに対して、N-1 |
173 個のNOP Command が生成される。 | 181 個のNOP Command が生成される。 |
174 | 182 |
175 そこで、以下のようなMerge Protocol (C)を導入する。(1) Editor Command | 183 そこで、以下のようなMerge Protocol (C)を導入する。(1) Editor Command |
206 この時に、ユーザが編集コマンドを割り込ませる可能性がある。 | 214 この時に、ユーザが編集コマンドを割り込ませる可能性がある。 |
207 | 215 |
208 これを防ぐ一つの方法は、Merge 作業が始まった段階で、ユーザ入力を | 216 これを防ぐ一つの方法は、Merge 作業が始まった段階で、ユーザ入力を |
209 block してやれば良い(a)。もう一つの方法は、ユーザ入力の割り込みが | 217 block してやれば良い(a)。もう一つの方法は、ユーザ入力の割り込みが |
210 あった場合は、その入力込みで、もう一度、ソートを実行すれば良い(b)。 | 218 あった場合は、その入力込みで、もう一度、ソートを実行すれば良い(b)。 |
219 これはリマージと呼ばれる。 | |
220 | |
221 <center><img src="fig/remerge.pdf" alt="リマージ"></center> | |
211 | 222 |
212 Merge 作業中には、他のSM/Editorからの入力をblockすることは問題ない。 | 223 Merge 作業中には、他のSM/Editorからの入力をblockすることは問題ない。 |
213 それは、もともと非同期で動作しており、遅延は許容されるように | 224 それは、もともと非同期で動作しており、遅延は許容されるように |
214 なっている。 | 225 なっている。 |
215 | 226 |
290 このように簡単に証明することは出来ない。そこで、 | 301 このように簡単に証明することは出来ない。そこで、 |
291 モデル検査器であるJava PathFinder\cite{}を用いる。 | 302 モデル検査器であるJava PathFinder\cite{}を用いる。 |
292 | 303 |
293 --Protocol の実装 | 304 --Protocol の実装 |
294 | 305 |
295 Session Manager | 306 Session Manager はJava 1.5で実装されており、 Ecplise は Java によるPlug-in |
296 | 307 となっている。 Emacs は、従来はCで書いたクライアントを接続していたが、 |
297 Ecplise Plug-in | 308 今は、すべて Emacs Lisp で書かれている。 Vim は、C で記述されており、 |
298 | 309 Merger もCで記述されていたが、今回の実装で取り外された。 |
299 Emacs | 310 |
300 | 311 今回の実装では、Editor 側の実装のコストが削減されており、Merge Protocol |
301 Vim | 312 部分でCで150行程度が削減されている。Editor 側の実装は、Editor Command を |
313 {\tt insert, delete} に分解する部分の実装が大半である。 | |
314 | |
315 Editor 側で実装する必要があるのは、表\ref{tb:sync}の機能である。 | |
316 \end{table} | |
317 \begin{table}[htdp] | |
318 \caption{Editor 側での実装} | |
319 \begin{center} | |
320 \begin{tabular}{|l|l|} | |
321 \hline | |
322 1 & 編集機能の{\tt user\_insert,user\_detele}への分解と、分解したEditor Command の送信 \\ | |
323 \hline | |
324 2 & {\tt join,put} Command のUI部分と、Command の送信 \\ | |
325 \hline | |
326 3 & {\tt join,put} Command のUI部分と、Command の送信 \\ | |
327 \hline | |
328 4 & {\tt join\_ack,put\_ack} の受け取りとsid,eidの設定 \\ | |
329 \hline | |
330 5 & 外部からのEditor Commandの非同期受け取りと実行 \\ | |
331 \hline | |
332 6 & {\tt sync} Command を受け取った場合の{\tt user\_insert,user\_detele}の生成 | |
333 \hline | |
334 7 & Merge 時のlock (optional) \\ | |
335 \hline | |
336 7 & {\tt quit} Command \\ | |
337 \hline | |
338 \end{tabular} | |
339 \end{center} | |
340 \label{tb:sync} | |
341 \end{table}% | |
342 | |
343 ファイルのオープン/セーブなどの機能はREPには含まれていない。Master Editor | |
344 も、それ以外のEditorも任意の時点でのローカルなセーブが可能である。 | |
345 版管理なども、REP以外の部分で対応する。 | |
346 | |
347 外部からのEditor Command を受け取った場合のカーソルなどの制御は、規定されて | |
348 いない。移動した場合が便利な場合と、そうでない場合があると思われる。 | |
302 | 349 |
303 --Socket Simulator | 350 --Socket Simulator |
304 | 351 |
305 Java Pathfinder による検証 | 352 Java Pathfinder による検証を行なうために、直接、Socketを経由せずに、 |
353 Thread を通して通信を行なうライブラリを作成した。 | |
354 | |
355 このライブラリは、最初、java.nio互換ではなく作成し、Merge Protocol | |
356 (A)及び(B)の動作をJava PathFinder で確認した。編集結果の同一性を | |
357 調べるために、Session 内の Editor のquit プロトコルを実装している。 | |
358 | |
359 まず、 {\tt quit } Command がSessin ring に送られ、各Editorは、 | |
360 {\tt quit}を受け取ると、自分のユーザ編集コマンドを停止する。その編集を | |
361 終了した後、{\tt quit}を返す。{\tt quit}を受け取った後も、他の | |
362 Editor からのEditor Commandは来る可能性がある。{\tt quit}を最初に | |
363 送ったEditorに{\tt quit}が戻ると、今度は{\tt quit2}をSession Ring | |
364 に流す。これより後に、ユーザ編集コマンドが来ることはない。Editor は | |
365 自分の待っているEditor Commandのackがすべて来るのを確認してから、 | |
366 {\tt quit2}を次へ渡す。{\tt quit2}を渡した後は、Editor Command は | |
367 来ないので、終了して良い。最初のEditorへ{\tt quit2}が戻った時点で、 | |
368 すべての編集が終了する。 | |
369 | |
370 この時に、Editor のバッファを比較して、 | |
371 すべてのEditorのバッファが同じならば、正しくプロトコルが動いた | |
372 ことになる。これをJava PathFinderで検証を行なう。 | |
373 | |
374 | |
375 (C)の実装を、実際のSession Manager 上で検証するために、java.nio と | |
376 Thread による通信のシミュレーションを切替えることが可能なライブラリ | |
377 を作成した。実際のSession Manager に対する Java PathFinder での | |
378 実行確認は、計算時間の制約により、まだ、可能とはなっていない。 | |
306 | 379 |
307 --検証とデバッグ | 380 --検証とデバッグ |
308 | 381 |
382 (A)のプロトコルがEditor 二つで動作すること、及び、(B)のプロトコル | |
383 が複数のEditorで動作することを Java PathFinder で確認することが | |
384 出来た。 | |
385 | |
386 (C)は、実際のSession Managerの実装を含む検証となるので、よりハードルが | |
387 高い。現状では、Java PathFinder での動作確認は出来ていない。 | |
388 | |
389 Java PathFinder でvimやEmacsを含む検証は可能とはなっていないが、 | |
390 Sample Editor をJava で実装することにより、Java PathFinderでの | |
391 Merge Protocolの検証が可能となっている。 | |
392 | |
393 実際には、vim やEmacs などのEditor側の実装が正しいかどうかを調べる | |
394 ことも重要である。それは、Merge Protocolを切った状態で、Javaの | |
395 Sample Editor に対する動作を確認することで調べることが出来る。 | |
396 | |
397 | |
309 --比較 | 398 --比較 |
399 | |
400 類似のProject としては、GroupKit \cite{}, Soba Project\cite{} がある。 | |
401 vim やEmacs などのOpen source editor の実装を含むのが、REPの特徴 | |
402 である。 | |
403 | |
404 また、Java で実装されていて、Session Manager 部分、Editor の改変部分、 | |
405 Eclipse plugin のすべてが、LGPLで公開されているのも独自な特徴の | |
406 一つである。 | |
407 | |
408 GroupKit はtcl/tkで記述されており、検証などが困難だが、REPでは、 | |
409 Java の部分をJava PathFinder で検証することが可能だと思われる。 | |
410 しかし、現状では、まだ、検証までには至っていない。 | |
411 | |
412 GroupKit などで使われているマルチメディア編集の同期は、Masterが | |
413 一つ存在し、それに対するCommandの発行と、MasterからのCommandの | |
414 マルチキャストで実現されている\cite{}。REPでは、マルチキャスト | |
415 ではなく、Session ring によって同期を実現している。Ring は、 | |
416 遅く信頼性に欠ける部分があるが、ネットワークに対する負荷が | |
417 軽いと言う特徴がある。(C)のMerge Protocolを使うことにより、 | |
418 o(n)のパケットで同期を行なうことが出来る。また、マルチキャスト | |
419 を避けているので、WANなどの遅延が大きい部分に複数のストリーム | |
420 を張る必要がないという特徴がある。 | |
421 | |
422 また、Session Manager 上には、Editor Bufferが存在しないので、 | |
423 大きなファイルを編集する場合でも、Session Manager のメモリを | |
424 消費することはない。 | |
425 | |
426 --最後に | |
427 | |
428 このプロジェクトは、sourceforge を通じて公開\cite{}されており、まだ、 | |
429 開発途上となっている。 | |
430 | |
431 残念ながら、実際のSession Manager 上でのJava Pathfinder での検証は | |
432 まだ、出来てはないが、通信ライブラリ上での処理をatomicにするなどの | |
433 工夫で可能になると期待している。 | |
434 | |
435 | |
436 | |
437 |