持っており、パイプラインで実行される。記述は以下のようになる。どれか1つの記述から残りのコードも生成できるようにすることが望ましい。Segment(以下CS)という単位に分割してプログラミングを行う。+DSはAliceが内部にもつデータベースによって管理されている。DSに対応する一意のkeyが設定されており、そのkeyを用いてデータベースを操作する。++CSは実行に必要なDSが揃うと実行されるという性質を持ち、入力されたDSに応じた結果が出力される。データの依存関係にないCSは並列実行が可能であるため、並列度を上げるためにはCSの処理内容を細かく分割して依存するデータを少なくするのが望ましい。Computation}+AliceのComputationは、keyで指し示されるDSを待ち合わせてCSを実行させると定義できる。Computationは、AliceのComputationを支えているComputationのプログラミングと定義できる。Computationである。Aliceが動作するためにはトポロジーを決める必要がある。トポロジーの構成はAliceのComputationを支えているComputationとみなすことができる。トポロジーが決定するとそのトポロジーを構成する計算が行われる。トポロジーを指定するAPIはその構成の計算をプログラミングして変更するものである。Computationである。ComputationがAliceのComputationに影響することはない。プログラマーはCSを記述する際にトポロジーや切断、再接続という状況を予め想定した処理にする必要はない。プログラマーは目的の処理だけ記述する。Computationで指定する。+このようにプログラムすることで、通常処理と例外処理を分離することができるため、シンプルなプログラムを記述できる。Segment}+複数のスレッドから1つのデータに変更を行うためには、データの不整合を防ぐためのlockが必要になる。複数の関係のない要素を1つのデータオブジェクトで表現した場合、全ての操作でlockが必要になる。このlockがスケラビリティーを低下させる。データのサイズも並列計算には重要である。++Aliceはデータを細かく分割して記述する。その細かく分割されたデータをDSと呼ぶ。+実際には特定のオブジェクトにマッピングされ、マッピングされたクラスを通してアクセスされる。Manager}+DSは実際にはqueueに保存される。queueには対になるkeyが存在し、keyの数だけqueueが存在する。+このkeyを指定してDSの保存、取得を行う。queueの集合体はデータベースとして捉えられる。Manager(以下DSM)と呼ぶ。DSMは各ノード固有のデータベースである。DSMのproxyであり、接続しているノードの数だけ存在する。DSMに書き込まれる。APIを用いてデータベースにアクセスする。+putとupdateはDSを追加する際に、peekとtakeはDSを取得する際に使用する。val)++\end{itemize}+DSをqueueに追加するためのAPIである。引数に対応するqueueに対してDSを追加している。val)++\end{itemize}+updateもqueueに追加するためのAPIである。putとの違いは、先頭のDSを削除してからDSを追加することである。そのためAPI実行前後でqueueの中にあるDSの個数は変わらない。key)++\end{itemize}+takeはDSを読み込むためのAPIである。読み込まれたDSは削除される。(Blocking)が起こる。putやupdateによりDSに更新があった場合、takeが直ちに実行される。key)++\end{itemize}+peekもDSを読み込むAPIである。takeとの違いは読み込まれたDSが削除されないことである。Segment}+Alice上で実行されるタスクの単位がCSである。ユーザーはCSを組み合わせることでプログラミングを行う。CSをユーザーが記述する際に、内部で使用するDSの作成を記述する。DSはCSに用意されているAPIを用いて作成する。DSは、LocalかRemoteか、またkeyを指定する必要がある。poolに送られ、実行される。DSもLocalかRemoteか、またkeyを指定する必要がある。+Inputの場合はsetKeyを呼ぶ際、Outputの場合はput(またはupdate)の際にノードとkeyの指定を行っている。+しかし、どの時点でノードとkeyの指定を行えばよいか、どのようなAPIを用意するべきかは、議論の余地がある。,\ref{src:CodeSegment})。Segmentで使用するAPIを利用する事ができる。CSはどのDSにも依存しない。+このCSをmainメソッド内でnewし、executeメソッドを呼ぶことで実行を開始させることができる。\ref{src:CodeSegment})を作成している。DSMに対してDSをputしている。ods}というフィールドを用いてアクセスする。update}を実行することができる。val)++\end{itemize}+TestCodeSegmentはこの"cnt"というkeyに対して依存関係があり、8行目でupdateが行われるとTestCodeSegmentは実行される。++ソースコード\ref{src:CodeSegment}は、0から10までインクリメントする例題である。+2行目で取得されたDSが格納される受け皿を作る。DSMがもつcreateメソッド使うことで作成できる。ids}というフィールドを用いてアクセスする。++4行目から6行目はコンストラクタである。コンストラクタはオブジェクト指向のプログラミング言語で新たなオブジェクトを生成する際に呼び出されて内容の初期化を行う関数である。input1の定義が行われる。次にCSのコンストラクタが呼ばれ、CSが持つフィールド変数の定義と初期化が行われる。ids.create(CommandType.TAKE)}が行われ、input1の初期化が行われる。最後にTestCodeSegmentのコンストラクタの5行目が実行される。DSMからDSを取得している。key)++\end{itemize}+setKeyメソッドにより、どのDSMのあるkeyに対してpeekまたはtakeコマンドを実行させるかを指定できる。コマンドの結果がレスポンスとして届き次第CSは実行される。++runメソッドの内容としては10行目で取得されたDSをInteger型に変換してcountに代入している。一度TestCodeSegmentのCSが作られる。DSMに値を追加する。+13行目が終了条件であり、countの値が10になれば終了する。Segment}+DSは、アプリケーションに管理されているデータのことである。アプリケーションを構成するCSによってその値は変更される。DSは、分散フレームワークAliceが管理しているデータである。Aliceを構成するCSによってのみ、その値は変更される。DSはアプリケーションに利用することができる。CSを実行可能かどうかの状態を表す。DSの一覧が管理されている。ユーザーはこの一覧にある名前を指定することで、動的にDSの伝搬などを行うことができる。DSに付随しているものもある。DSはCS内部でReceiverという入れ物に格納される。ユーザーは、Receiverに対して操作することでDSを入手できる。+このReceiverには、fromというフィールドがあり、このDSを誰がputしたという情報が入っている。この情報をデータの伝搬する際に利用することで、DSをputしたノードに送り返すことを防ぐことができる。APIを用いて取得できる。Segment}+CSはアプリケーションを動作させるために必要なタスクであり、ユーザーによって定義される。CSはAliceを構成するタスクである。CSの群はAliceのComputationと言い換えることができる。一部のみユーザーが定義をすることができ、Aliceの挙動を変更することができる。@@+\section{AliceVNC}+AliceVNCは、当研究室で開発を行っているTreeVNCをAliceを用いて実装された、授業向け画面共有システムである。+Aliceが実用的なアプリケーションを記述する能力をもつことを確認するために作成した。++授業でVNCを使う場合、1つのコンピュータに多人数が同時につながるため、性能が大幅に落ちてしまう(図\ref{fig:vnc})。この問題をノード同士を接続させ、木構造を構成することで負荷分散を行い解決したものがTreeVNCである(図\ref{fig:treestructure})。TreeVNCは、TightVNCのソースコードを利用して開発されている。\label{chapter:chapter3}+水族館の例題によって、Aliceを用いて分散プログラムを記述可能であることを確認した。+次に実用的なアプリケーションであるTreeVNCをAlice上で実装することで、Aliceに必要な機能を洗い出した。Fileを読み込むことでTopologyを構成する。+つまり、予め参加するノードの台数が決まっている必要がある。Topologyに全ノードが参加するまでアプリケーションが起動しない。++実際のアプリケーションでは、参加するノードの数は決まっておらず、Topologyを動的に変化させる必要がある。Managerを追加した。Nodeの情報がputされ接続処理が順次行われる。DSMに対してputやpeekを行うことでのみ発生する。アプリケーション次第では長時間通信が行われない可能性がある。DSMとの接続が切れた場合、次の通信が行われるまで切断を発見することができない。接続状態ではあるが問題が発生し、応答に時間がかかる場合も考えられる。beatを送り生存確認を行う機能を持つことが望ましい。Aliveの機能を実装した。\ref{fig:keepAlive}は、keepAliveの処理をコミュニケーションダイアグラムで示したものである。+keepAliveは、タスクとタスクを実行するTaskExecuterと実行順序を管理するSchedulerによって実装されている。CREATE}があり、TaskExecuterは、タスクの種類に従って処理を行なう。DSMに対してheartbeatを送信する。PING}のタスクを作成し、Schedulerに登録する。++タスクを作成する際に実行時間の指定をする。Schedulerにタスクを登録すると、Schedulerはタスクの実行時間に従って、タスクを実行順に並び替える。PING}タスクが投入される。PING}タスクを受け取る。CLOSE}タスクが投入される。CLOSE}タスクが削除される。\ref{enum:putPingTask}に戻る。DSMの数だけ投入される。DSMのkeyの一覧が保存されている。+CreateTaskは、この一欄により動的にタスクを作成している。++以上で説明した処理の流れは、接続状態に問題がない場合である。