Mercurial > hg > Papers > 2009 > rep-verify-sigos
diff 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 |
line wrap: on
line diff
--- a/rep-verify-sigos.ind Thu Mar 26 03:33:07 2009 +0900 +++ b/rep-verify-sigos.ind Thu Mar 26 10:31:47 2009 +0900 @@ -25,6 +25,8 @@ では、複数のSession Managerと、リング状のSession の上に 編集コマンドを循環させる方法を取っている。 +<center><img src="fig/editor_to_editor2.pdf" alt="REPでの相互接続"></center> + この方法を採用した理由はいくつがある。 集中サーバを用いない\underline{分散実装}が一つの前堤になっている。 Session Manager 自体が分散していて、Session Manager は、 @@ -67,6 +69,7 @@ 単一のSMに複数のエディタが接続する。離れたホスト同士のエディタを 接続する場合は、まず、それぞれのホスト同士のSMを接続する。そして、 それぞれエディタがSMに接続した後で、ホスト間の接続を選択(select)する。 +<center><img src="fig/one_session_manager.pdf" alt="Session Managerの導入"></center> ---Session managerの接続protocol @@ -81,6 +84,7 @@ {\tt sm\_join} が戻って来た場合は、その{\tt sm\_join} は 廃棄される。現在は、既にsession/editorを持つSMは、他のSMに 接続することは出来ない。 +<center><img src="fig/many_session_manager.pdf" alt="Session Manager同士の接続"></center> ---Session 接続 protocol @@ -105,6 +109,7 @@ すると、{\tt put}と同様に{\tt join}したEditorがすべてのSM上に通知される。 SMのGUI上の操作{\tt select}により、{\tt put}されたファイルと{\tt join} したEditorが結びつけられる。 +<center><img src="fig/sm_join.pdf" alt="join コマンド"></center> {\tt select}操作では、{\tt join}したEditorと{\tt put}したエディタを 探し出す必要がある。そのために、SM木上にSM同士に到達するための @@ -118,6 +123,7 @@ ({\tt put}したEditor)に、必要な編集行を要求する{\tt sync}コマンドを session ring に送る。Session master は、次のEditor Command を使って 必要な行を送信する。 +<center><img src="fig/use_case_put_join_over_sm.pdf" alt="Session Managerを介したエディタの接続"></center> ---Editor Command @@ -169,6 +175,8 @@ (3) Editor Command がなくても、他のEditorからCommand を受け取ったら、 NOP Command を生成して、それが戻って来た時にソートを行なう。 +<center><img src="fig/new_merge.pdf" alt="Session Ring上のREPコマンドの送信"></center> + この手法では、EditorがN個あるSessionの場合、一つのEditor Commandに対して、N-1 個のNOP Command が生成される。 @@ -208,6 +216,9 @@ これを防ぐ一つの方法は、Merge 作業が始まった段階で、ユーザ入力を block してやれば良い(a)。もう一つの方法は、ユーザ入力の割り込みが あった場合は、その入力込みで、もう一度、ソートを実行すれば良い(b)。 +これはリマージと呼ばれる。 + +<center><img src="fig/remerge.pdf" alt="リマージ"></center> Merge 作業中には、他のSM/Editorからの入力をblockすることは問題ない。 それは、もともと非同期で動作しており、遅延は許容されるように @@ -292,18 +303,135 @@ --Protocol の実装 -Session Manager +Session Manager はJava 1.5で実装されており、 Ecplise は Java によるPlug-in +となっている。 Emacs は、従来はCで書いたクライアントを接続していたが、 +今は、すべて Emacs Lisp で書かれている。 Vim は、C で記述されており、 +Merger もCで記述されていたが、今回の実装で取り外された。 -Ecplise Plug-in +今回の実装では、Editor 側の実装のコストが削減されており、Merge Protocol +部分でCで150行程度が削減されている。Editor 側の実装は、Editor Command を +{\tt insert, delete} に分解する部分の実装が大半である。 -Emacs +Editor 側で実装する必要があるのは、表\ref{tb:sync}の機能である。 +\end{table} +\begin{table}[htdp] +\caption{Editor 側での実装} +\begin{center} +\begin{tabular}{|l|l|} +\hline +1 & 編集機能の{\tt user\_insert,user\_detele}への分解と、分解したEditor Command の送信 \\ +\hline +2 & {\tt join,put} Command のUI部分と、Command の送信 \\ +\hline +3 & {\tt join,put} Command のUI部分と、Command の送信 \\ +\hline +4 & {\tt join\_ack,put\_ack} の受け取りとsid,eidの設定 \\ +\hline +5 & 外部からのEditor Commandの非同期受け取りと実行 \\ +\hline +6 & {\tt sync} Command を受け取った場合の{\tt user\_insert,user\_detele}の生成 +\hline +7 & Merge 時のlock (optional) \\ +\hline +7 & {\tt quit} Command \\ +\hline +\end{tabular} +\end{center} +\label{tb:sync} +\end{table}% -Vim +ファイルのオープン/セーブなどの機能はREPには含まれていない。Master Editor +も、それ以外のEditorも任意の時点でのローカルなセーブが可能である。 +版管理なども、REP以外の部分で対応する。 + +外部からのEditor Command を受け取った場合のカーソルなどの制御は、規定されて +いない。移動した場合が便利な場合と、そうでない場合があると思われる。 --Socket Simulator -Java Pathfinder による検証 +Java Pathfinder による検証を行なうために、直接、Socketを経由せずに、 +Thread を通して通信を行なうライブラリを作成した。 + +このライブラリは、最初、java.nio互換ではなく作成し、Merge Protocol +(A)及び(B)の動作をJava PathFinder で確認した。編集結果の同一性を +調べるために、Session 内の Editor のquit プロトコルを実装している。 + +まず、 {\tt quit } Command がSessin ring に送られ、各Editorは、 +{\tt quit}を受け取ると、自分のユーザ編集コマンドを停止する。その編集を +終了した後、{\tt quit}を返す。{\tt quit}を受け取った後も、他の +Editor からのEditor Commandは来る可能性がある。{\tt quit}を最初に +送ったEditorに{\tt quit}が戻ると、今度は{\tt quit2}をSession Ring +に流す。これより後に、ユーザ編集コマンドが来ることはない。Editor は +自分の待っているEditor Commandのackがすべて来るのを確認してから、 +{\tt quit2}を次へ渡す。{\tt quit2}を渡した後は、Editor Command は +来ないので、終了して良い。最初のEditorへ{\tt quit2}が戻った時点で、 +すべての編集が終了する。 + +この時に、Editor のバッファを比較して、 +すべてのEditorのバッファが同じならば、正しくプロトコルが動いた +ことになる。これをJava PathFinderで検証を行なう。 + + +(C)の実装を、実際のSession Manager 上で検証するために、java.nio と +Thread による通信のシミュレーションを切替えることが可能なライブラリ +を作成した。実際のSession Manager に対する Java PathFinder での +実行確認は、計算時間の制約により、まだ、可能とはなっていない。 --検証とデバッグ +(A)のプロトコルがEditor 二つで動作すること、及び、(B)のプロトコル +が複数のEditorで動作することを Java PathFinder で確認することが +出来た。 + +(C)は、実際のSession Managerの実装を含む検証となるので、よりハードルが +高い。現状では、Java PathFinder での動作確認は出来ていない。 + +Java PathFinder でvimやEmacsを含む検証は可能とはなっていないが、 +Sample Editor をJava で実装することにより、Java PathFinderでの +Merge Protocolの検証が可能となっている。 + +実際には、vim やEmacs などのEditor側の実装が正しいかどうかを調べる +ことも重要である。それは、Merge Protocolを切った状態で、Javaの +Sample Editor に対する動作を確認することで調べることが出来る。 + + --比較 + +類似のProject としては、GroupKit \cite{}, Soba Project\cite{} がある。 +vim やEmacs などのOpen source editor の実装を含むのが、REPの特徴 +である。 + +また、Java で実装されていて、Session Manager 部分、Editor の改変部分、 +Eclipse plugin のすべてが、LGPLで公開されているのも独自な特徴の +一つである。 + +GroupKit はtcl/tkで記述されており、検証などが困難だが、REPでは、 +Java の部分をJava PathFinder で検証することが可能だと思われる。 +しかし、現状では、まだ、検証までには至っていない。 + +GroupKit などで使われているマルチメディア編集の同期は、Masterが +一つ存在し、それに対するCommandの発行と、MasterからのCommandの +マルチキャストで実現されている\cite{}。REPでは、マルチキャスト +ではなく、Session ring によって同期を実現している。Ring は、 +遅く信頼性に欠ける部分があるが、ネットワークに対する負荷が +軽いと言う特徴がある。(C)のMerge Protocolを使うことにより、 +o(n)のパケットで同期を行なうことが出来る。また、マルチキャスト +を避けているので、WANなどの遅延が大きい部分に複数のストリーム +を張る必要がないという特徴がある。 + +また、Session Manager 上には、Editor Bufferが存在しないので、 +大きなファイルを編集する場合でも、Session Manager のメモリを +消費することはない。 + +--最後に + +このプロジェクトは、sourceforge を通じて公開\cite{}されており、まだ、 +開発途上となっている。 + +残念ながら、実際のSession Manager 上でのJava Pathfinder での検証は +まだ、出来てはないが、通信ライブラリ上での処理をatomicにするなどの +工夫で可能になると期待している。 + + + +