Mercurial > hg > Papers > 2022 > ikki-master
changeset 4:e950b7aaeeaa
add about Christie
author | ichikitakahiro <e165713@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 12 Jan 2022 01:52:39 +0900 |
parents | e655f81a0c76 |
children | d8f93db60366 |
files | Paper/.DS_Store Paper/chapter/4-Christie.tex Paper/fig/.DS_Store Paper/images/ChristieClass.pdf Paper/images/TopologyManager.graffle.graffle Paper/images/TopologyManager.pdf Paper/images/newGearsReletion.graffle.graffle Paper/images/newGearsReletion.pdf Paper/master_paper.pdf Paper/src/HelloWorldCodeGear.java Paper/src/StartHelloWorld.java |
diffstat | 11 files changed, 185 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/Paper/chapter/4-Christie.tex Tue Jan 11 00:39:04 2022 +0900 +++ b/Paper/chapter/4-Christie.tex Wed Jan 12 01:52:39 2022 +0900 @@ -1,12 +1,13 @@ \chapter{分散フレームワークChristie} 分散フレームワークChristieは当研究室が開発するJava言語で記述された分散フレームワークである。 Christieは将来的にGearsOSに組み込むことが考えられており、CbCと似てはいるが異なった別のGearという概念が存在している。 + また、分散処理を行う複数のノード接続を任意の形のTopologyに自動で形成してくれる機能である、TopologyManagearが存在する。 Christieではノード同士の接続を煩雑な記述を行うことなく、TopologyManagerに一任することで簡潔な記述で分散処理が行える。 \section{gear概念} -Christieのgearは四種類存在する。 +Christieのgearは四種類存在し、以下のように名付けられている。 \begin{quote} \begin{itemize} @@ -16,3 +17,148 @@ \item DataGearManager(以下DGM) \end{itemize} \end{quote} + +CodeGearはクラスやスレッドに相当する。 +DataGearは変数データであり、CodeGear内でアノテーションを用いて記述する。 +また、ChristieのDataGearはkeyとデータがペアで管理されている。 +この二点はGearsOSと同様の名称であり、 +CodeGearをDataGearを介してCodeGearへの遷移を繰り返す形がChristieの仕組みの根幹となる点がGearsOSと類似点であると言える。 + +CodeGearManagerはいわゆるノードに相当している。 +CodeGearManagerはCodeGearを管理し、CodeGearに必要なDataGearが揃った場合にそのCodeGearをWorkerで実行する。 +また、CodeGearManagerはそれぞれ独立したDataGearManagerを所持している。 +DataGearManagerはデータプールに相当しており、put操作された全てのDataGearがkeyとデータのペアで保存されている。 +また、DataGearManagerはLocalDataGearManagerとRemoteDataGearManagerに区分される。 +図\ref{fig:gearsRelation}にChristieのGearの関係図を示す。 + +\begin{figure}[tb] + \begin{center} + \includegraphics[width=150mm]{./images/newGearsReletion.pdf} + \end{center} + \caption{ChristieのそれぞれのGear関係図} + \label{fig:gearsRelation} +\end{figure} + +\section{LocalDGMとRemoteDGM} +DataGearManagerはLocalDGMとRemoteDGMの二種類が存在する。 +LocalDGMは所有しているCodeGearManager自身に対応するDGMである。 +LocalDGMにput操作を行うことで自身の持つkeyに対してDataGearを送ることができる。 + +RemoteDGMは別のCodeGearManagerが持つLocalDGMのploxyに相当する。 +つまり、RemoteDGMは別のCodeGearManagerに必ず対応しており、 +RemoteDGMにput操作すると対応したCGMが持つLocalDGMへDataGearをputすることができる。 +図\ref{fig:gearsRelation}に示す。 + +ChristieのノードどおしのやりとりはこのRemoteDGMを介して行われる。 +つまりRemoteDGMを作成することはノードどおしの接続を行うことにあたる。 +また、RemoteDGMは単方向の通信にあたるため、複数のノードを双方向で通信させたい場合は双方に相手のRemoteDGMを作る必要がある。 + + +\begin{figure}[tb] + \begin{center} + \includegraphics[width=150mm]{./images/Remote_DataGearManager.pdf} + \end{center} + \caption{RemoteDGMを介したノード接続} + \label{fig:gearsRelation} +\end{figure} + + +\section{DataGearアノテーション} +CodeGearには処理に必要なDataGearを記述する必要がある。 +DataGearの取り出し操作は以下の四つに分けられる。 + +\begin{description} +\item[Take] 先頭のDGを読み込み、そのDGを削除する、DGが複数ある場合、この動作を用いる。 +\item[Peek] 先頭のDGを読み込むが、DGが削除されない、そのため、特に操作をしない場合は同じデータを参照し続ける。 +\item[TakeFrom(Remote DGM name)] RemoteDGM nameを指定することで、その接続先(Remote)のDGMからTake操作を行える。 +\item[PeekFrom(Remote DGM name)] RemoteDGM nameを指定することで、その接続先(Remote)のDGMからPeek操作を行える。 +\end{description} + +DataGearの呼び出しはTake操作が基本となる。 +Peek操作は特定のDGを参照し続けたい場合に用いるが、Peekアノテーションを単独で用いる場合、 +処理次第では無限ループが生じてしまう場合があるため気をつける必要がある。 + + + +\section{Christieのプログラミング例} +ソースコード\ref{src:SHW}\ref{src:HWCG}にChristieの簡単なプログラム例を示す。 + +StartCodeGearを継承したソースコード\ref{src:SHW}、StartHelloWorldはCbCやC言語におけるmain部分に相当する。 +main部分ではCodeGearManagerをポート番号指定することで作成を行う。 +また、CGMに対して処理させたいCodeGearをsetupという処理でCGMが所持するThread Poolに追加、 +RemoteDGMの作成などを行う。 + +CodeGearを継承したソースコード\ref{src:HWCG}、OddCodeGearはCodeGearとなる。 +CodeGearはCGMにsetupされ、また必要なDataGearが全て揃うことで初めてCGMに実行される。 +CodeGear内部で次に処理したいCodeGearをCGMにsetupすることもできる。 + +\begin{lstlisting}[frame=lrbt,label=src:SHW,caption={StartOddEven}] +package christie.example.OddEven; + +import christie.codegear.CodeGearManager; +import christie.codegear.StartCodeGear; + +public class StartOddEven extends StartCodeGear { + + public StartOddEven(CodeGearManager cgm) { + super(cgm); + } + + public static void main(String[] args){ + int finishCount = 10; + CodeGearManager odd = createCGM(10001); + CodeGearManager even = createCGM(10002); + odd.setup(new OddCodeGear()); + even.setup(new EvenCodeGear()); + odd.createRemoteDGM("even","localhost",10002); + even.createRemoteDGM("odd","localhost", 10001); + odd.getLocalDGM().put("odd", 1); + odd.getLocalDGM().put("finishCount",finishCount); + even.getLocalDGM().put("finishCount", finishCount); + + } +} +\end{lstlisting} + +\begin{lstlisting}[frame=lrbt,label=src:HWCG,caption={OddCodeGear}] +package christie.example.OddEven; + +import christie.annotation.Peek; +import christie.annotation.Take; +import christie.codegear.CodeGear; +import christie.codegear.CodeGearManager; + +public class OddCodeGear extends CodeGear { + Take + int odd; + + Peek + int finishCount; + + Override + protected void run(CodeGearManager cgm) { + System.out.println(odd + " : odd"); + if (finishCount + 1 != odd) { + getDGM("even").put("even", odd + 1); + cgm.setup(new OddCodeGear()); + } + } +} +\end{lstlisting} + + +\section{TopologyManager} +Christieにはノード接続のTopologyを自動形成するための機能であるTopologyManagerが備わっている。 +通常の分散処理プログラムの記述の際にはノードどうしの接続形成は煩雑な記述が必要となってしまう。 +ChristieではこのTopologyManagerに通信接続を一任することにより、気軽に通信形成が行えるようになる。 +正確にはTopologyに参加を表明したノードに対して名前を与え、任意のTopologyの形に従って各ノードにRemoteDGMを作成させる。 + +Chrisitieに存在しているTopologyManagerの形成方法として静的Topoplogyと動的Topologyがある。 +静的Topologyはプログラマが任意の形のTopoplogyとノードの配線をdotファイルに記述し、TopologyManagerに参照させることで +自由な形のTopologyを形成する。 +現時点では静的TopologyでのTopology形成はdotファイルに記述した参加ノード数に実際に参加するノードの数が達していない場合、 +動作しないという制約が存在している。 + +動的TopologyはTopologyManager内にすでに設計されたTopologyの形状を選択した上で +参加を表明したノードに対して自動的にノードの配線を行う。 +例えばTreeを構成する場合、参加したノードから順番にrootから近い役割を与えていく。
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Paper/src/HelloWorldCodeGear.java Wed Jan 12 01:52:39 2022 +0900 @@ -0,0 +1,19 @@ +package christie.example.HelloWorld; + +import christie.annotation.Peek; +import christie.annotation.Take; +import christie.codegear.CodeGear; +import christie.codegear.CodeGearManager; + +public class HelloWorldCodeGear extends CodeGear { + + \@Take + String helloWorld; + + @Override + protected void run(CodeGearManager cgm) { + System.out.print(helloWorld + " "); + cgm.setup(new HelloWorldCodeGear()); + cgm.getLocalDGM().put(helloWorld,helloWorld); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Paper/src/StartHelloWorld.java Wed Jan 12 01:52:39 2022 +0900 @@ -0,0 +1,19 @@ +package christie.example.HelloWorld; + +import christie.codegear.CodeGearManager; +import christie.codegear.StartCodeGear; + +public class StartHelloWorld extends StartCodeGear { + + public StartHelloWorld(CodeGearManager cgm) { + super(cgm); + } + + public static void main(String[] args){ + CodeGearManager cgm = createCGM(10000); + cgm.setup(new HelloWorldCodeGear()); + cgm.setup(new FinishHelloWorld()); + cgm.getLocalDGM().put("helloWorld","hello"); + cgm.getLocalDGM().put("helloWorld","world"); + } +}