Mercurial > hg > Papers > 2020 > itsuki-thesis
diff final_main/chapter4/chapter4.tex @ 9:a37b7bd13be9
...
author | ichikitakahiro <e165713@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 11 Feb 2020 21:59:14 +0900 |
parents | f71206f427e3 |
children | 5ddb3e41e515 |
line wrap: on
line diff
--- a/final_main/chapter4/chapter4.tex Tue Feb 11 17:44:52 2020 +0900 +++ b/final_main/chapter4/chapter4.tex Tue Feb 11 21:59:14 2020 +0900 @@ -3,55 +3,76 @@ %%文書開始**************************** \begin{document} %%************************************** -\chapter{スター型接続によるネットワーク通信} -リモートエディタのセッションに参加するノード(ユーザ)はスター型で接続を行い, リモートエディタの通信部分の障害に対する耐性を保障する. スター型とは中心となるノードから放射状に他のノードにそれぞれ一対一の接続を行う接続であり, 図:\ref{fig:star} はスター型接続をグラフ化した物である. 図で説明すると, node0がハブノード(サーバーの役割)として他のnode1, 2, 3, 4 と接続する。ここに新しくnode5が接続に加わると仮定すると, 他のノードと同様にnode0と接続する. -先行研究においてはノードの通信をリング型, つまりノード同士を円となる形で接続することで実装を試みたが, -\begin{itemize} -\item ノードごとのもつファイルの整合性の維持が難しい. -\item どこかのノード同士の通信が切断された際の再接続が難しく, また障害が全体に影響してしまう. -\item 障害からの復帰が難しい. -\end{itemize} -などの問題が見られた. リング型と比較した際のスター型の利点として, +\chapter{分散フレームワークChrisiteについて} +ここでは本研究室で開発している分散フレームワークChrisiteについて解説する. Chrisiteは複雑な分散プログラムを簡潔に書くことのできる構成となっている. + + +\section{Chrisiteとは} +ChristieはJava言語で構成された本研究室独自の分散フレームワークである。同じく本研究室で開発を行っているGearsOSのファイルシステムに組み込む予定があるため, GearsOSを構成している本研究室の独自の言語Continuation based C (以下CbC言語)とにた, Gearというプログラム概念が存在する. + \begin{itemize} -\item ノードの中心(サーバー)が正しいファイル状況を保持するため,整合性を保つことが容易である. -\item どこかのノードの接続が切断されても, 障害の範囲をそのノードのみに抑えることができる. -\item 新しいノードが参加した, もしくはノードの再接続の際にはサーバーのファイル状況を参照するのみで参加, 復帰ができる. -\end{itemize} -と言ったことが挙げられる. -TopologyManagerの接続相手にラベルをつける機能により, サーバーでは各nodeすべてをまとめて一つの名前で処理をすることができる. 反対に各ノードもラベルを利用することで, CG内に大きな工夫をつけることなくサーバーとの通信を行うことができる. \\ -懸念点として -\begin{itemize} -\item 通信がノードのみに集中するため, それを原因に遅延が発生する可能性がある. -\item サーバーと他ノードとの一対複数という通信形式から発生する, 予期せぬ編集誤差の危険性. +\item CodeGear(以下 CG) +\item DataGear(以下 DG) +\item CodeGearManager(以下 CGM) +\item DataGearManager(以下 DGM) \end{itemize} -と言った点が挙げられる. これらの発生を防ぐため, -\begin{itemize} -\item 送信するデータ量や頻度を減らす工夫などを凝らし, 通信の負荷がなるべく少ない設計を構築する. -\item サーバーを中心とした整合性維持のための設計をする. -\end{itemize} -と言った対策が考えられる. + +CodeGearはクラスやスレッドに相当しする. DataGear は変数データに相当し, javaのアノテーション機能を用いて記述する. CG内に記述したKeyに全てのDGが揃った際に初めてそのCGが動作するという仕組みになっている. CodeGearManager はいわゆるノードに相当し、CG, DG ,DGM を管理する. DataGearManager は DG を管理するもので, put という操作により DG , 要するに変数データを格納することができる。DGM の put 操作を行う際には Local と Remote と 2 つのどちらかを選び, 変数の key とデータを引数に書く. Local であれば, Local の CGM が管理している DGM に対し, DG を格納していく. Remote であれば接続した Remote 先の CGM の DGM に DG を格納できる. put 操作を行ったあとは, 対象の DGM の中に queue として保管される. \\ +DG を取り出す際には, CG 内で宣言した変数データにアノテーションをつける. DG のアノテーションには Take, Peek, TakeFrom, PeekFrom の 4 つがある. -\begin{figure}[H] -\centering - \fbox{ - \includegraphics[scale=0.7]{./images/Star-Topology.pdf} - } - \caption{スター型の接続をグラフ化した物} -\label{fig:star} -\end{figure} +\begin{description} +\item[Take] 先頭のDGを読み込み, そのDGを削除する. DGが複数ある場合, この動作を用いる. +\item[Peek] 先頭のDGを読み込むが, DGが削除されない. そのため, 特に操作をしない場合は同じデータを参照し続ける. +\item[TakeFrom(Remote DGM name)] Takeと同様に読み込んだ後, DGを削除する. Remote DGM nameを指定することで, その接続先(Remote)のDGMからTake操作を行える. +\item[PeekFrom(Remote DGM name)] Peekと同様に読み込み後もDGが削除されないが, Remote DGM nameを指定することで, その接続先(Remote)のDGMからPeek操作を行える. +\end{description} -\newpage +\section{プログラムの例} +以下のソースコード\ref{code:nStartHelloWorld} , \ref{code:HelloWorldCodeGear}のプログラムはChrisitieの基本動作となる DGM による put 操作を用いた hello world の出力プログラムである. メソッド sreateCGM でポート番号を指定した上で CGM を作成しする. CGM にCG (クラスファイル)を指定した上でsetupすることでCGMが CGを動作させることができる. HelloWorldCodeGear()とFinishHelloWorld()がここではCGに当たる. HelloWorldCodeGear() クラスには String型の"helloWorld" という key が用意され, "helloWorld"に入力された DG(String型の変数データ) をprint するコードである. "helloWorld" に hello と worldというDGをputすることで出力結果がhello world となる. +\lstinputlisting[caption=StartHelloWorld,label=code:nStartHelloWorld]{./src/HelloWorld/StartHelloWorld.java} -%%文書終了**************************** -\end{document} +\lstinputlisting[caption=HelloWorldCodeGear,label=code:HelloWorldCodeGear]{./src/HelloWorld/HelloWorldCodeGear.java} + +CGM は起動し続けていると処理が自動的に終了しないという問題点がある. そこで役目がなくなったCGM を終了させるための処理を行わなければならない. CGMを終了させるためのプログラムはソースコード\ref{code:FinishHelloWorld} であり, 二つのkeyが揃ったらcgm.getLocalDGM().finish() の処理でcgmを終了させるよう記述されている. + +\lstinputlisting[caption=FinishHelloWorld, label=code:FinishHelloWorld]{./src/FinishHelloWorld.java} +\section{TopologyManager について} +ここではChrstie上でノード同士の接続をより簡潔にするために使われるTopologyManagerという機能について説明する. +TopologyManagerとはTopologyを形成するために, 参加を表明したノード, TopologyNodeにlabel を与え, 必要があればノード同士の配線も自動で行う機能である. +TopologyManagerのTopologyの形成方法として静的Topologyと動的Topologyの二つの方法がある. 静的Topologyはソースコード: \ref{code:dotFile} のようなdotファイルを与えることでノードの接続を図 \ref{fig:dot} のように接続することができる. 例えばnode0 からはnode1 はright という名前で参照することができ, それぞれのノードが同じCG を実行してもlabel の与え方次第で想定したDG の差し合いを実現することができる. 静的Topologyはdotファイルのノード数と同等のTopologyNodeがあって初めて, CodeGear が実行され, ノード数が合わないとエラーが表示 +される. + +\lstinputlisting[caption=ringを構成するdotファイル, label=code:dotFile]{./src/ring.dot} + +\begin{figure}[H] +\centering + \fbox{ + \includegraphics[scale=1]{./images/ring.pdf} + } +\caption{ソースコード \ref{code:dotFile} のdotファイルを図示化したもの} +\label{fig:dot} +\end{figure} + +動的Topologyは参加を表明したノードを順番にTopologyの構成要素として接続していく物である. 現在時点で実装済みのTreeの構成を例とすると + +\begin{enumerate} +\item 参加したノードを順にroot(根)に近い要素として接続する. +\item Topologyの要素に構成されたノードはそれぞれ親, 子のノードを特定の名前(parent, child[n])で参照できる. +\item 途中参加したノードは, 木の末端要素として接続する. +\end{enumerate} +以上の形でTopologyが形成される. \\ +コード:\ref{code:SRTE} はTopologyManagerを使用してTopologyを構成するコードである. String型のリスト(今回はmanagerArg)に構成したいTopologyの形状をdotファイル, もしくは実装済みの動的Topologyの構成型を設定し, TopologyManagerCondfigを起動することでTopologyManagerが起動できる. ソースコードではTreeを構成しており, for文でnodeNum 個分のノードを生成し, それぞれmanagerPortを記憶させている. これによりノードすべてがTopologyManagerによりTreeの構成要素として接続される. + +\lstinputlisting[caption=TopologyManagerによるTree型Topologyを構成するコード, label=code:SRTE]{./src/StartPrefixTree.java} + +現状では通信アルゴリズムの構成のため, dotファイルにより接続を行なっているが, 最終的にはStar型の動的Topology機能を作成し, 途中で参加してきたノードを接続が行えるようにする必要がある. - - - +%%文書終了**************************** +\end{document} \ No newline at end of file