Mercurial > hg > Papers > 2015 > nozomi-sigos
changeset 18:20c9082b212d
change2
author | Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 25 May 2015 18:03:58 +0900 |
parents | a26eacfb4922 |
children | a348947a5c61 |
files | presen/sigOS/sample.html presen/sigOS/sample.markdown |
diffstat | 2 files changed, 311 insertions(+), 291 deletions(-) [+] |
line wrap: on
line diff
--- a/presen/sigOS/sample.html Mon May 25 03:29:25 2015 +0900 +++ b/presen/sigOS/sample.html Mon May 25 18:03:58 2015 +0900 @@ -30,21 +30,20 @@ <div class="slide" id="2"><div> <section> <header> - <h1 id="section">研究背景(1/2)</h1> + <h1 id="section">研究目的</h1> </header> <!-- === begin markdown block === generated by markdown/1.2.0 on Ruby 2.1.0 (2013-12-25) [x86_64-darwin13.0] - on 2015-05-25 00:09:22 +0900 with Markdown engine kramdown (1.5.0) + on 2015-05-25 18:01:27 +0900 with Markdown engine kramdown (1.5.0) using options {} --> <!-- _S9SLIDE_ --> <ul> - <li>信頼性とスケーラビリティに優れた分散プログラムをプログラマが一から記述することは容易ではない。</li> - <li>本研究室ではデータを <em>Data Segment</em> 、タスクを <em>Code Segment</em> という単位で分割して記述する<strong>並列分散フレームワークAlice</strong>の開発を行っている。</li> - <li>Aliceは分散環境の構築のためのAPIが提供されており、スケーラブルな分散プログラムを信頼性高く記述できる環境を実現する。 </li> + <li>当研究室が開発している並列分散フレームワークAliceではスケーラブルな分散プログラムを信頼性高く記述できる環境を実現する。</li> + <li>Aliceのメタ計算として、通信が切断した際の処理やデータを圧縮する処理等を提供することで、プログラマがコードを大きく変更することなくプログラムの振る舞いを変えることを可能にする。</li> </ul> @@ -55,13 +54,14 @@ <div class="slide" id="3"><div> <section> <header> - <h1 id="section-1">研究背景(1/2)</h1> + <h1 id="data-segment--code-segment">Data Segment と Code Segment</h1> </header> <!-- _S9SLIDE_ --> <ul> - <li>水族館の例題等において、Aliceが分散プログラムを記述する能力を有することは確認された。</li> - <li>実用的な分散プログラムを作成するためには、圧縮形式のデータで通信する機能等が必要だとわかった。</li> + <li>Aliceではデータを <strong>Data Segment(DS)</strong> 、タスクを <strong>Code Segment(CS)</strong> という単位に分割してプログラミングを行う。</li> + <li>AliceはJavaで実装されており、CS をユーザーが記述する際には CodeSegment.class を継承することで CS で使用する API を利用する事ができる。</li> + <li>DSはAliceが内部にもつデータベースにより管理されており、CSはDSに対応する一意のkeyを使ってDSを操作する。</li> </ul> @@ -72,12 +72,14 @@ <div class="slide" id="4"><div> <section> <header> - <h1 id="section-2">研究目的</h1> + <h1 id="data-segment--code-segment-1">Data Segment と Code Segment</h1> </header> <!-- _S9SLIDE_ --> <ul> - <li>Aliceに圧縮機能等を追加することにより、Data Segmentの多態性を実現しノード間通信における自由度の向上を図る。 </li> + <li>CSはInput DS(入力されるDS)とOutput DS(出力されるDS)を持つ。</li> + <li>CSはkeyで指定されたDSが揃うと実行されるという性質を持つ。 +<img src="./images/dsandcs.svg" alt="opt" /></li> </ul> @@ -88,13 +90,14 @@ <div class="slide" id="5"><div> <section> <header> - <h1 id="alice1---data-segment">Aliceの概要(1) - Data Segment</h1> + <h1 id="codesegment">CodeSegmentの依存関係</h1> </header> <!-- _S9SLIDE_ --> <ul> - <li>複数の関係のない要素を1つのデータオブジェクトで表現した場合、全ての操作でlockが必要になり、スケラビリティーを低下させる。</li> - <li>Alice はデータを細かく分割して記述する。その分割されたデータを <strong>Data Segment(DS)</strong> と呼ぶ。</li> + <li>データの依存関係にないCSは並列実行される</li> + <li>データの依存関係がある場合は Input DS が揃うと順に実行される +<img src="./images/dsandcs2.svg" alt="opt" /></li> </ul> @@ -105,14 +108,13 @@ <div class="slide" id="6"><div> <section> <header> - <h1 id="alice2---data-segment-manager">Aliceの概要(2) - Data Segment Manager</h1> + <h1 id="data-segment">Data Segment</h1> </header> <!-- _S9SLIDE_ --> <ul> - <li>DS は queue に保存される。queue には対 になる key し、 key を指定して DS の保存、取得を行う。</li> - <li>queue の集合体であるデータベースデータベースを Alice では DS Manager(DSM) と呼ぶ。<br /> -<img src="./pictures/dsm.svg" alt="opt" /></li> + <li>整数や文字列などの基本的なデータの集まり</li> + <li>Aliceの場合はJavaオブジェクトに対応</li> </ul> @@ -123,16 +125,21 @@ <div class="slide" id="7"><div> <section> <header> - <h1 id="alice2---data-segment-manager-1">Aliceの概要(2) - Data Segment Manager</h1> + <h1 id="data-segment-manager">Data Segment Manager</h1> </header> <!-- _S9SLIDE_ --> <ul> - <li>Local DSM … 各ノード固有のデータベース。</li> - <li>Remote DSM … 他のノードの Local DSM の proxy。接続しているノードの数だけ存在。<br /> - <img src="./images/remote_datasegment.svg" alt="opt" width="450px" /></li> + <li>DS の集合体であるデータベースを Alice では DS Manager(DSM) と呼ぶ。 </li> + <li>DSM 内の DS には対になる String型のkey が存在し、 DSM 名と key を指定しすることで DS の保存、取得を行う。</li> + <li>DS の追加<br /> + put(String managerKey, String key, Object val) </li> + <li>DS の取得<br /> + take(String managerKey, String key) </li> </ul> +<!--![opt](./images/dsm.svg)--> + </section> @@ -141,30 +148,15 @@ <div class="slide" id="8"><div> <section> <header> - <h1 id="alice3---data-segment-api">Aliceの概要(3) - Data Segment API</h1> + <h1 id="data-segment-manager-1">Data Segment Manager</h1> </header> <!-- _S9SLIDE_ --> -<p>DSMに対して以下のコマンドを送り操作できる </p> - -<table style="border-collapse: collapse;border:1px solid #000000;"> - <tr> - <td style="border:1px solid #000000;"> put</td> - <td style="border:1px solid #000000;">データを追加する</td> - </tr> - <tr> - <td style="border:1px solid #000000;"> update </td> - <td style="border:1px solid #000000;">データを更新する</td> - </tr> - <tr> - <td style="border:1px solid #000000;"> peek</td> - <td style="border:1px solid #000000;">データを取得する</td> - </tr> - <tr> - <td style="border:1px solid #000000;"> take</td> - <td style="border:1px solid #000000;">データを取得する。取得したデータはDSMから削除される。</td> - </tr> -</table> + <img src="./images/remote_datasegment.svg" alt="opt" width="450px" rightmargin="0"/></li> +<ul> + <li>Local DSM … 各ノード固有のデータベース。</li> + <li>Remote DSM … 他のノードの Local DSM の proxy。接続しているノードの数だけ存在する。<br /> +</ul> @@ -174,20 +166,17 @@ <div class="slide" id="9"><div> <section> <header> - <h1 id="alice4---data-segment-">Aliceの概要(4) - Data Segment の表現</h1> + <h1 id="data-segment-">Data Segment の表現</h1> </header> <!-- _S9SLIDE_ --> <ul> - <li>一般的な Java のクラスオブジェクト - <ul> - <li>LocalDSM に put された場合は一般的な Java のクラスオブジェクトとして enQueue される。</li> - </ul> - </li> - <li>MessagePack を用いて変換した byte[]で表現されたバイナリオブジェクト - <ul> - <li>RemoteDSM に put された場合は通信時に byteArray に変換されたバイナリオブジェクトが enQueue される。</li> - </ul> + <li>DSは複数の表現を同時に持っており、現在は3種類の表現がある。 + <ol> + <li>一般的な Java のクラスオブジェクト</li> + <li>MessagePack for Java でシリアライズ化されたバイナリオブジェクト。Remoteとの通信の際に用いる。</li> + <li>2 を圧縮したバイナリオブジェクト。圧縮機能の一部として今回追加。 </li> + </ol> </li> </ul> @@ -199,14 +188,14 @@ <div class="slide" id="10"><div> <section> <header> - <h1 id="alice5---code-segment">Aliceの概要(5) - Code Segment</h1> + <h1 id="messagepack">MessagePackとは</h1> </header> <!-- _S9SLIDE_ --> <ul> - <li>Alice上で実行されるタスクの単位を <strong>Code Segment(CS)</strong> と呼ぶ。</li> - <li>複数のDSが入力され、その結果をDSとして出力するfunctionと捉えられる。</li> - <li>CS をユーザーが記述する際には CS を継承して記述することにより CS で使用する API を利用する事ができる。</li> + <li>Sadayuki Furuhashiが開発したシリアライズのための機能をまとめたオープンソースライブラリ。</li> + <li>シリアライズ/デシリアライズを高速に行うことができ、整数、浮動小数点数、Boolean、文字列、配列、連想配列、nilをバイト列にシリアライズできる。</li> + <li>JSONのようにプログラミング言語に依存しないデータの表現形式として使用できる。</li> </ul> @@ -217,14 +206,13 @@ <div class="slide" id="11"><div> <section> <header> - <h1 id="alice5---code-segment-1">Aliceの概要(5) - Code Segment</h1> + <h1 id="cs--input-ds-">CS と Input DS の対応付け</h1> </header> <!-- _S9SLIDE_ --> <ul> - <li>入力されるDSをInput DS、出力されるDSをOutput DSと呼ぶ。</li> - <li>keyで指定されたDSが揃うと実行されるという性質を持つ。 -<img src="./images/dsandcs.svg" alt="opt" /></li> + <li>setKey()にtakeコマンドをセットすることで Input DS を指定する</li> + <li>実際にtakeしたデータを参照するときには、asClass()を用いて任意のJavaのオブジェクトとして扱えるようにする </li> </ul> @@ -235,16 +223,28 @@ <div class="slide" id="12"><div> <section> <header> - <h1 id="alice6---codesegment">Aliceの概要(6) - CodeSegmentの依存関係</h1> + <h1 id="cs--">CS の 例</h1> </header> <!-- _S9SLIDE_ --> -<ul> - <li>データの依存関係にないCSは並列実行される</li> - <li>データの依存関係がある場合は依存を解決した順に実行される</li> - <li>並列度あげるために、処理を細かく記述し、依存するDSを少なくする -<img src="./images/dsandcs2.svg" alt="opt" /></li> -</ul> +<p lang="java">RemoteDSM から DSをtakeし、LocalDSM に put を10回繰り返す</p> +<pre><code>public class RemoteIncrement extends CodeSegment { + + public Receiver num = ids.create(CommandType.TAKE); + + @Override + public void run() { + int num = this.num.asClass(Integer.class); + if (num == 10) System.exit(0); + + RemoteIncrement cs = new RemoteIncrement(); + cs.num.setKey("remote", "num"); + + ods.put("local", "num", num); + } + +} +</code></pre> @@ -254,14 +254,15 @@ <div class="slide" id="13"><div> <section> <header> - <h1 id="alicemeta-computation12">AliceのMeta Computation(1/2)</h1> + <h1 id="treevnc">TreeVNC</h1> </header> <!-- _S9SLIDE_ --> <ul> - <li>並列指向プログラミング言語 Erlang では、分散環境の構築等の処理は全てプログラマが記述しなければいけない。</li> - <li>Aliceではプログラマが記述する部分を <em>Computation</em>、Aliceが提供するComputationを支える部分を <em>Meta Computation</em> として分けて捉えている。</li> - <li>分散環境の構築等の処理等は全てMeta Computationが行うためプログラマがシンプルに分散プログラムを記述できる環境を提供している。</li> + <li>Aliceを用いて実装する実用的な分散プログラムの例題</li> + <li>当研究室で開発したノードを木構造に配置して負荷分散を行う授業向け画面共有システム</li> + <li>TightVNCがもとになっている<br /> +<img src="./images/treeVNC.svg" alt="opt" /></li> </ul> @@ -272,23 +273,14 @@ <div class="slide" id="14"><div> <section> <header> - <h1 id="alicemeta-computation22">AliceのMeta Computation(2/2)</h1> + <h1 id="computation">Computation</h1> </header> <!-- _S9SLIDE_ --> <ul> - <li>AliceのComputation - <ul> - <li>keyによりData Segmentを待ち合わせてCode Segmentを実行する</li> - </ul> - </li> - <li>AliceのMeta Computation - <ul> - <li>Javaで記述したAliceの実装システム</li> - </ul> - </li> - <li>Aliceの機能を追加するということは Meta Computation を追加すると言い換えられる</li> - <li>Meta Computation も CS と DS により表現される。</li> + <li>Aliceでは、計算の本質的な処理をComputatin、Computationとは直接関係ないが別のレベルでそれを支える処理をMeta Computationとして分けて考える。</li> + <li>Alice の Computationは、keyによりDSを待ち合わせ、DSが揃ったCSを並列に実行する処理。</li> + <li>TreeVNC の Computationは、VNCサーバからデータを受け取って表示する処理。</li> </ul> @@ -299,13 +291,14 @@ <div class="slide" id="15"><div> <section> <header> - <h1 id="alicevnc">AliceVNC</h1> + <h1 id="meta-computation">Meta Computation</h1> </header> <!-- _S9SLIDE_ --> <ul> - <li>研究室では授業向け画面共有システムTreeVNCではノード同士を接続させ、木構造を構成することで負荷分散を行う -<img src="./images/treeVNC.svg" alt="opt" /></li> + <li>通信の切断・再接続時の処理や分散トポロジーの構成、データの表現形式の選択など、Computationを支えている処理。</li> + <li>TreeVNCの場合、VNCサーバのデータを各VNCノードにコピーする処理。</li> + <li>Aliceの機能を追加するということは Meta Computation を追加すると言い換えられる</li> </ul> @@ -316,18 +309,15 @@ <div class="slide" id="16"><div> <section> <header> - <h1 id="alice-">Alice の新機能</h1> + <h1 id="treevncalicemeta-computation">TreeVNCで用いるAliceのMeta Computation</h1> </header> <!-- _S9SLIDE_ --> <ul> - <li>Alice が実用的なアプリケーションを記述する能力をもつことを確認するため、TreeVNC を Alice を用いて実装した AliceVNC の作成を行った。</li> - <li>AliceVNCの実装で必要となった以下の機能をMeta Computation として実装した。<br /> - <ul> - <li>転送機能 … Input DS を Output DS として転送する</li> - <li>圧縮機能 … DS Manager の指定によってDSの表現を切り替える</li> - </ul> - </li> + <li>TreeTopologyの構成</li> + <li>ノード間通信の切断時・再接続時の処理</li> + <li>データの圧縮</li> + <li>子ノードへのデータの複製</li> </ul> @@ -338,14 +328,15 @@ <div class="slide" id="17"><div> <section> <header> - <h1 id="section-3">転送機能</h1> + <h1 id="dsmapi">データの転送 - DSMとAPIの追加</h1> </header> <!-- _S9SLIDE_ --> <ul> - <li>通常、Input DSに変更を加えOutput DSとして出力する場合DSのコピーが行われる。</li> - <li>AliceVNCのようにInput DS をそのまま子ノードに Output DS として出力する場合、コピーを行なうのは無駄。</li> - <li>Input DSをコピーせずそのままOutput DSに渡すMeta Computationとして転送機能を実装した。</li> + <li>Local と Remote それぞれに圧縮表現を扱う Compressed DSM を追加。</li> + <li>指定する DSM を Compressed DSM に変えるだけで扱うデータ表現を変更できる<br /> + put(String <strong>“compressed”</strong> + managerKey, String key, Object val)<br /> + take(String <strong>“compressed”</strong> + managerKey, String key) </li> </ul> @@ -356,14 +347,15 @@ <div class="slide" id="18"><div> <section> <header> - <h1 lang="java" id="section-4">転送機能</h1> + <h1 id="section-1">データの転送 - データ表現の自動生成</h1> </header> <!-- _S9SLIDE_ --> -<pre><code> public void flip(Receiver receiver) { - DataSegment.getLocal().put(receiver.key, receiver.getReceiveData(), null); - } -</code></pre> +<ul> + <li>DS が圧縮表現を持っていれはそれをそのまま子ノードにputする</li> + <li>持っていなければその時点でCompressed DSM内部で圧縮表現を生成してputする</li> + <li>DS はオブジェクト表現と圧縮表現を同時にもつため、TreeVNCでは受け取った画面データを伸長をした後、転送のために再圧縮することはない。</li> +</ul> @@ -373,14 +365,14 @@ <div class="slide" id="19"><div> <section> <header> - <h1 id="section-5">圧縮機能</h1> + <h1 id="section-2">データの受け取り - 任意の形式での取得</h1> </header> <!-- _S9SLIDE_ --> <ul> - <li>AliceVNCは、ノードは受け取った画面データを描画すると同時に、子ノードの Remote DSM に送信する。</li> - <li>ノードは DS を受信するとそれを一度解凍して画面を表示し、再圧縮して子ノードに送信する。</li> - <li>圧縮状態のまま子ノードに送信ができれば、解凍・再圧縮するオーバーヘッドを無くすことができる。</li> + <li>圧縮表現で画面データ受け取り、Compressed DSM 内に格納。</li> + <li>TightVNCが画面表示のためにデータを必要としたときに、 asClass() を用いて任意の形式でデータを取り出す。</li> + <li>asClass() は DS のcastメソッドであり、内部で伸長と MessagePack での変換を行う。</li> </ul> @@ -391,14 +383,32 @@ <div class="slide" id="20"><div> <section> <header> - <h1 id="data-segment">圧縮機能 - Data Segmentの表現の変更</h1> + <h1 id="alice">データの受け取り - Aliceの通信パケット変更</h1> </header> <!-- _S9SLIDE_ --> -<p>1つの Data Segment に対し以下の3種類の表現を同時に持たせ、必要に応じた形式で DS を扱う。 - 1. 一般的な Java のクラスオブジェクト - 2. MessagePack for Java でシリアライズ化され たバイナリオブジェクト - 3. 2 を圧縮したバイナリオブジェクト</p> +<ul> + <li>通信ヘッダにデータの状態を表すフラグを追加したことで、受け取ったデータを適切な形式でDSM内に格納できる。</li> + <li>圧縮前と圧縮後のデータサイズを入れたことにより、受け取ったデータの適切な伸長が可能。</li> +</ul> + +<table style="border-collapse: collapse;border:1px solid #000000;"> + <td style="border:1px solid #000000;"> serialized </td> + <td style="border:1px solid #000000;">データ本体のシリアライズ状態を示す</td> + + <tr> + <td style="border:1px solid #000000;"> compressed </td> + <td style="border:1px solid #000000;">データ本体の圧縮状態を示す</td> + </tr> + <tr> + <td style="border:1px solid #000000;"> objectDataSize </td> + <td style="border:1px solid #000000;">圧縮前のオブジェクトのデータサイズを表す</td> + </tr> + <tr> + <td style="border:1px solid #000000;"> dataSize </td> + <td style="border:1px solid #000000;">送信するDSのデータサイズを表す</td> + </tr> +</table> @@ -408,16 +418,18 @@ <div class="slide" id="21"><div> <section> <header> - <h1 lang="java" id="data-segment-1">圧縮機能 - Data Segmentの表現の変更</h1> + <h1 id="alice1---erlang">Aliceと他言語等との比較(1) - Erlang</h1> </header> <!-- _S9SLIDE_ --> -<pre><code> public class ReceiveData { - private Object val = null; - private byte[] messagePack = null; - private byte[] zMessagePack = null; - } -</code></pre> +<ul> + <li> + <p>ネットワークに依存しない通信が可能</p> + </li> + <li> + <p>Topologyは自分で管理</p> + </li> +</ul> @@ -427,18 +439,17 @@ <div class="slide" id="22"><div> <section> <header> - <h1 id="dsm">圧縮機能 - DSMの追加</h1> + <h1 id="alice1---linda">Aliceと他言語等との比較(1) - Linda</h1> </header> <!-- _S9SLIDE_ --> <ul> - <li>Local と Remote それぞれに圧縮表現を扱う Compressed DSM を追加した。</li> - <li>Compressed DSM にputする場合 - <ul> - <li>DS が圧縮表現を持っていればそれをputする</li> - <li>持っていなければその時点で圧縮表現を作ってputする</li> - </ul> + <li>keyでタプルというデータの集合を管理している</li> + <li> + <p>in/outでAliceのput/takeに対応する操作を行う</p> </li> + <li>タスクはinで単一のタプルを待つ</li> + <li>MetaComputationがない</li> </ul> @@ -449,23 +460,17 @@ <div class="slide" id="23"><div> <section> <header> - <h1 id="ds">圧縮機能 - 任意の表現でDSを取得</h1> + <h1 id="alice1---corba">Aliceと他言語等との比較(1) - Corba</h1> </header> <!-- _S9SLIDE_ --> -<ul lang="java"> - <li>ReceiveData内にあるDSのcastメソッドであるasClass()を用いる</li> +<ul> + <li> + <p>オブジェクト間のRPC</p> + </li> + <li>DSがない。keyという概念がない。</li> + <li>データの待ち合わせがない</li> </ul> -<pre><code> public <T> T asClass(Class<T> clazz) { - if (val != null) { return (T) val; } - - if (zMessagePack != null && messagePack == null) { - messagePack = unzip(zMessagePack, dataSize); - } - - return packer.read(messagePack, clazz); - } -</code></pre> @@ -475,17 +480,20 @@ <div class="slide" id="24"><div> <section> <header> - <h1 id="api">圧縮機能 - API設計</h1> + <h1 id="alice1---http">Aliceと他言語等との比較(1) - HTTP</h1> </header> <!-- _S9SLIDE_ --> -<p>通常のデータを扱う場合<br /> -* put(String managerKey, String key, Object val)<br /> -* take(String managerKey, String key)</p> - -<p>圧縮表現のデータを扱う場合<br /> -* put(String <strong>“compressed”</strong> + managerKey, String key, Object val)<br /> -* take(String <strong>“compressed”</strong> + managerKey, String key)</p> +<ul> + <li>get/putで通信を行う</li> + <li> + <p>URLがデータベースのkeyとなる</p> + </li> + <li>MIME形式で送信。複数の表現を持つMeta Computationがない。 </li> + <li>セッション管理はクライアント自身がやる </li> + <li>並列処理できない </li> + <li>get/putをRPC的に扱わない</li> +</ul> @@ -495,13 +503,22 @@ <div class="slide" id="25"><div> <section> <header> - <h1 id="section-6">圧縮機能 - 通信プロトコルの変更</h1> + <h1 id="treevncalicetreevnc">TreeVNCとAliceを用いたTreeVNCの比較</h1> </header> <!-- _S9SLIDE_ --> <ul> - <li>Remote から put されたデータは必ずシリアライズ化されており byteArray で表現される。</li> - <li>圧縮した byteArray の追加により、Remote から put された byteArray が圧縮されているのか判断する必要がある。</li> + <li> + <p>TreeVNC<br /> + 通信プロトコルを定義や圧縮を自前で行う<br /> + 通信スレッドを複数作成<br /> + 様々な部分で通信APIを呼び出す </p> + </li> + <li> + <p>Aliceを用いたTreeVNC<br /> + Aliceと接続する最小限の変更<br /> + 木の構成部分や圧縮形式での通信はMeta Computation </p> + </li> </ul> @@ -512,15 +529,31 @@ <div class="slide" id="26"><div> <section> <header> - <h1 id="section-7">圧縮機能 - 通信プロトコルの変更</h1> + <h1 id="treevncalicetreevnc-1">TreeVNCとAliceを用いたTreeVNCの比較</h1> </header> <!-- _S9SLIDE_ --> <ul> - <li>Alice の通信におけるヘッダにあたる CommandMessage.classに <strong>シリアライズ状態表すフラグ</strong>と、<strong>圧縮状態を表すフラク</strong> を追加</li> - <li>これにより put された DSM はフラグに応じた適切な形式で格納できる。</li> + <li>TightVNCからのコードの増加量</li> + <li>Aliceを用いれば通常の TreeVNC の 20% の行数で記述できる。</li> </ul> +<table style="border-collapse: collapse;border:1px solid #000000;"> + <th style="border:1px solid #000000;padding:5px 15px 5px 15px;"></th> + <th style="border:1px solid #000000;padding:5px 15px 5px 15px;"> 行数 </th> + <th style="border:1px solid #000000;padding:5px 15px 5px 15px;">単語数</th> + <tr> + <td style="border:1px solid #000000;padding:5px 15px 5px 15px;"> TreeVNC </td> + <td style="border:1px solid #000000;padding:5px 15px 5px 15px;">5049</td> + <td style="border:1px solid #000000;padding:5px 15px 5px 15px;">14191</td> + </tr> + <tr> + <td style="border:1px solid #000000;padding:5px 15px 5px 15px;"> Aliceを用いたTreeVNC </td> + <td style="border:1px solid #000000;padding:5px 15px 5px 15px;">989</td> + <td style="border:1px solid #000000;padding:5px 15px 5px 15px;">2355</td> + </tr> +</table> + </section> @@ -529,98 +562,15 @@ <div class="slide" id="27"><div> <section> <header> - <h1 id="section-8">圧縮機能 - 通信プロトコルの変更</h1> - </header> - <!-- _S9SLIDE_ --> - - -<pre lang="java"><code> public class CommandMessage { - public int type; - public int seq; - public String key; - public boolean quickFlag = false; - public boolean serialized = false; - public boolean compressed = false; - public int dataSize = 0; - } -</code></pre> -<p></p> - - - - </section> -</div></div> - -<div class="slide" id="28"><div> - <section> - <header> - <h1 id="section-9">圧縮機能 - 通信プロトコルの変更</h1> - </header> - <!-- _S9SLIDE_ --> - -<table style="border-collapse: collapse;border:1px solid #000000;"> - <tr> - <td style="border:1px solid #000000;"> type</td> - <td style="border:1px solid #000000;">CommandType PEEK, PUT などを表す</td> - </tr> - <tr> - <td style="border:1px solid #000000;"> seq </td> - <td style="border:1px solid #000000;">DS の待ち合わせを行っている CS を表す unique number</td> - </tr> - <tr> - <td style="border:1px solid #000000;"> key </td> - <td style="border:1px solid #000000;">どの Key に対して操作を行うか指定する</td> - </tr> - <tr> - <td style="border:1px solid #000000;"> quickFlag </td> - <td style="border:1px solid #000000;">SEDA を挟まず Command を処理を行うかを示す</td> - </tr> - <tr> - <td style="border:1px solid #000000;"> serialized </td> - <td style="border:1px solid #000000;">データ本体のシリアライズ状態を示す</td> - </tr> - <tr> - <td style="border:1px solid #000000;"> compressed </td> - <td style="border:1px solid #000000;">データ本体の圧縮状態を示す</td> - </tr> - <tr> - <td style="border:1px solid #000000;"> dataSize </td> - <td style="border:1px solid #000000;">圧縮前のデータサイズを表す</td> - </tr> -</table> - - - - </section> -</div></div> - -<div class="slide" id="29"><div> - <section> - <header> - <h1 id="section-10">圧縮機能の評価</h1> - </header> - <!-- _S9SLIDE_ --> - -<p>RingRelayTest<br /> -<img src="./images/topologyring.svg" alt="opt" /></p> - - - - </section> -</div></div> - -<div class="slide" id="30"><div> - <section> - <header> - <h1 id="section-11">まとめ</h1> + <h1 id="section-3">まとめ</h1> </header> <!-- _S9SLIDE_ --> <ul> - <li>Alice が実用的なアプリケーションを記述するための Meta Computation として、データに多態性を持たせ、指定するDSMによってデータ表 現を変える機能を実装した。</li> + <li>Alice が実用的なアプリケーションを記述するための Meta Computation として、データに多態性を持たせ、指定するDSMによってデータ表現を変える機能を実装した。</li> <li>これによりユーザが記述する Computation 部分を大きく変えずに自由度の高い通信を行うことが可能になった。</li> <li>同様の手法により、暗号形式・JSON 形式など複数のデータ表現を扱えるように拡張できる。</li> - <li>今後の課題としては、圧縮機能を AliceVNC で用 いることで有効性を測る必要がある。</li> + <li>今後の課題としては、圧縮機能を TreeVNC で用 いることで有効性を測る必要がある。</li> </ul> <!-- === end markdown block === -->
--- a/presen/sigOS/sample.markdown Mon May 25 03:29:25 2015 +0900 +++ b/presen/sigOS/sample.markdown Mon May 25 18:03:58 2015 +0900 @@ -3,82 +3,96 @@ profile:琉球大学 工学部 情報工学科 4年 # 研究目的 -* 並列分散フレームワークAliceではスケーラブルな分散プログラムを信頼性高く記述できる環境を実現する。 -* Aliceのメタ計算として通信が切断した際の処理やデータを圧縮する処理等を提供することで、プログラマがコードを大きく変更することなくプログラムの振る舞いを変えることを可能にする。 +* 当研究室が開発している並列分散フレームワークAliceではスケーラブルな分散プログラムを信頼性高く記述できる環境を実現する。 +* Aliceのメタ計算として、通信が切断した際の処理やデータを圧縮する処理等を提供することで、プログラマがコードを大きく変更することなくプログラムの振る舞いを変えることを可能にする。 -# Aliceの概要(1) - Data Segment と Code Segment +# Data Segment と Code Segment * Aliceではデータを **Data Segment(DS)** 、タスクを **Code Segment(CS)** という単位に分割してプログラミングを行う。 * AliceはJavaで実装されており、CS をユーザーが記述する際には CodeSegment.class を継承することで CS で使用する API を利用する事ができる。 * DSはAliceが内部にもつデータベースにより管理されており、CSはDSに対応する一意のkeyを使ってDSを操作する。 -# Aliceの概要(2) - Data Segment と Code Segment -* CSはInput DS(入力されるDS)とOutput DS(出力されるDS)と呼ぶ。 +# Data Segment と Code Segment +* CSはInput DS(入力されるDS)とOutput DS(出力されるDS)を持つ。 * CSはkeyで指定されたDSが揃うと実行されるという性質を持つ。 ![opt](./images/dsandcs.svg) -# Aliceの概要(3) - CodeSegmentの依存関係 +# CodeSegmentの依存関係 * データの依存関係にないCSは並列実行される * データの依存関係がある場合は Input DS が揃うと順に実行される ![opt](./images/dsandcs2.svg) -# Aliceの概要(4) - Data Segment +# Data Segment * 整数や文字列などの基本的なデータの集まり * Aliceの場合はJavaオブジェクトに対応 -# Aliceの概要(5) - Data Segment Manager +# Data Segment Manager * DS の集合体であるデータベースを Alice では DS Manager(DSM) と呼ぶ。 -* DSM 内の DS には対になる String型のkey が存在し、 key を指定しすることで DS の保存、取得を行う。 -![opt](./pictures/dsm.svg) +* DSM 内の DS には対になる String型のkey が存在し、 DSM 名と key を指定しすることで DS の保存、取得を行う。 +* DS の追加 + put(String managerKey, String key, Object val) +* DS の取得 + take(String managerKey, String key) -# Aliceの概要(6) - Data Segment Manager +<!--![opt](./images/dsm.svg)--> + +# Data Segment Manager * Local DSM … 各ノード固有のデータベース。 * Remote DSM … 他のノードの Local DSM の proxy。接続しているノードの数だけ存在する。 - ![opt](./images/remote_datasegment.svg){:width="450px"} + ![opt](./images/remote_datasegment.svg){:width="450px"} + -# Aliceの概要(7) - Data Segment API -DSM に対して DSM の名前と DS を指し示すkey を指定することで操作を行う -* DS の追加 - put(String managerKey, String key, Object val) -* DS の取得 - take(String managerKey, String key) - -# Aliceの概要(8) - Data Segment の表現 -DSは複数の表現(多態性)を同時に持つ -1. 一般的な Java のクラスオブジェクト -2. MessagePack for Java でシリアライズ化されたバイナリオブジェクト。Remoteとの通信の際に用いる。 -3. 2 を圧縮したバイナリオブジェクト。圧縮機能の一部として今回追加。 +# Data Segment の表現 +* DSは複数の表現を同時に持っており、現在は3種類の表現がある。 + 1. 一般的な Java のクラスオブジェクト + 2. MessagePack for Java でシリアライズ化されたバイナリオブジェクト。Remoteとの通信の際に用いる。 + 3. 2 を圧縮したバイナリオブジェクト。圧縮機能の一部として今回追加。 # MessagePackとは -シリアライズのための機能をまとめたライブラリであり、プログラミング言語に依存しないデータの表現形式として使用できる。 +* Sadayuki Furuhashiが開発したシリアライズのための機能をまとめたオープンソースライブラリ。 +* シリアライズ/デシリアライズを高速に行うことができ、整数、浮動小数点数、Boolean、文字列、配列、連想配列、nilをバイト列にシリアライズできる。 +* JSONのようにプログラミング言語に依存しないデータの表現形式として使用できる。 -# Aliceの概要(9) - Code Segment +# CS と Input DS の対応付け * setKey()にtakeコマンドをセットすることで Input DS を指定する -* 実際にtakeしたデータを参照するときには、asClass()を用いて任意のJavaのオブジェクトとして扱えるようにする +* 実際にtakeしたデータを参照するときには、asClass()を用いて任意のJavaのオブジェクトとして扱えるようにする -# Computation と Meta Computation -* Aliceでは、計算の本質的な処理をComputatin、Computationとは直接関係ないが別のレベルでそれを支える処理をMeta Computationとして考える -* これにより通常処理と例外処理を分離できるためシンプルなプログラムが記述可能 +# CS の 例 +RemoteDSM から DSをtakeし、LocalDSM に put を10回繰り返す +```java +public class RemoteIncrement extends CodeSegment { -# Alice の Computation -* keyによりDSを待ち合わせ、DSが揃ったCSを並列に実行する -* VNCの場合、VNCサーバからデータを受け取って表示する処理 + public Receiver num = ids.create(CommandType.TAKE); + + @Override + public void run() { + int num = this.num.asClass(Integer.class); + if (num == 10) System.exit(0); -# Alice の Meta Computation -* 通信の切断・再接続時の処理や分散トポロジーの構成、データの表現形式の選択など、Computationを支えている処理。 -* VNCの場合、VNCサーバのデータを各VNCノードにコピーする処理。 -* Aliceの機能を追加するということは Meta Computation を追加すると言い換えられる + RemoteIncrement cs = new RemoteIncrement(); + cs.num.setKey("remote", "num"); + ods.put("local", "num", num); + } -# AliceのMeta Computation(1/2) -* Aliceではプログラマが記述する部分を *Computation*、Aliceが提供するComputationを支える部分を *Meta Computation* として分けて捉えている。 -* 分散環境の構築等の処理等は全てMeta Computationが行うためプログラマがシンプルに分散プログラムを記述できる環境を提供している。 +} +``` # TreeVNC -* AliceのMeta Computationを用いて実装する実用的な分散プログラムの例題 -* 本研究室で開発したノードを木構造に配置して負荷分散を行う授業向け画面共有システム -* TightVNCがもとになっており、この部分がComputationと言える +* Aliceを用いて実装する実用的な分散プログラムの例題 +* 当研究室で開発したノードを木構造に配置して負荷分散を行う授業向け画面共有システム +* TightVNCがもとになっている ![opt](./images/treeVNC.svg) +# Computation +* Aliceでは、計算の本質的な処理をComputatin、Computationとは直接関係ないが別のレベルでそれを支える処理をMeta Computationとして分けて考える。 +* Alice の Computationは、keyによりDSを待ち合わせ、DSが揃ったCSを並列に実行する処理。 +* TreeVNC の Computationは、VNCサーバからデータを受け取って表示する処理。 + +# Meta Computation +* 通信の切断・再接続時の処理や分散トポロジーの構成、データの表現形式の選択など、Computationを支えている処理。 +* TreeVNCの場合、VNCサーバのデータを各VNCノードにコピーする処理。 +* Aliceの機能を追加するということは Meta Computation を追加すると言い換えられる + # TreeVNCで用いるAliceのMeta Computation * TreeTopologyの構成 * ノード間通信の切断時・再接続時の処理 @@ -86,12 +100,11 @@ * 子ノードへのデータの複製 -# TreeVNCでの圧縮 Meta Computation # データの転送 - DSMとAPIの追加 -* Local と Remote それぞれに圧縮表現を扱う Compressed DSM を追加した。 -* 指定する DSM を Compressed DSM に変えるだけで扱うデータ表現を変更できる - put(String **"compressed"** + managerKey, String key, Object val) - take(String **"compressed"** + managerKey, String key) +* Local と Remote それぞれに圧縮表現を扱う Compressed DSM を追加。 +* 指定する DSM を Compressed DSM に変えるだけで扱うデータ表現を変更できる + put(String **"compressed"** + managerKey, String key, Object val) + take(String **"compressed"** + managerKey, String key) # データの転送 - データ表現の自動生成 * DS が圧縮表現を持っていれはそれをそのまま子ノードにputする @@ -101,11 +114,12 @@ # データの受け取り - 任意の形式での取得 * 圧縮表現で画面データ受け取り、Compressed DSM 内に格納。 * TightVNCが画面表示のためにデータを必要としたときに、 asClass() を用いて任意の形式でデータを取り出す。 -* asClass() は DS のcastメソッドであり、伸長と MessagePack での変換を行う。 +* asClass() は DS のcastメソッドであり、内部で伸長と MessagePack での変換を行う。 -# データの受け取り - Aliceの通信パケットの変更 +# データの受け取り - Aliceの通信パケット変更 * 通信ヘッダにデータの状態を表すフラグを追加したことで、受け取ったデータを適切な形式でDSM内に格納できる。 * 圧縮前と圧縮後のデータサイズを入れたことにより、受け取ったデータの適切な伸長が可能。 + <table style="border-collapse: collapse;border:1px solid #000000;"> <td style="border:1px solid #000000;"> serialized </td> <td style="border:1px solid #000000;">データ本体のシリアライズ状態を示す</td> @@ -124,7 +138,63 @@ </tr> </table> -# Aliceと他言語等との比較 +# Aliceと他言語等との比較(1) - Erlang +* ネットワークに依存しない通信が可能 + +* Topologyは自分で管理 + +# Aliceと他言語等との比較(1) - Linda +* keyでタプルというデータの集合を管理している +* in/outでAliceのput/takeに対応する操作を行う + +* タスクはinで単一のタプルを待つ +* MetaComputationがない + +# Aliceと他言語等との比較(1) - Corba +* オブジェクト間のRPC + +* DSがない。keyという概念がない。 +* データの待ち合わせがない + +# Aliceと他言語等との比較(1) - HTTP +* get/putで通信を行う +* URLがデータベースのkeyとなる + +* MIME形式で送信。複数の表現を持つMeta Computationがない。 +* セッション管理はクライアント自身がやる +* 並列処理できない +* get/putをRPC的に扱わない + + +# TreeVNCとAliceを用いたTreeVNCの比較 +* TreeVNC + 通信プロトコルを定義や圧縮を自前で行う + 通信スレッドを複数作成 + 様々な部分で通信APIを呼び出す + +* Aliceを用いたTreeVNC + Aliceと接続する最小限の変更 + 木の構成部分や圧縮形式での通信はMeta Computation + +# TreeVNCとAliceを用いたTreeVNCの比較 +* TightVNCからのコードの増加量 +* Aliceを用いれば通常の TreeVNC の 20% の行数で記述できる。 + +<table style="border-collapse: collapse;border:1px solid #000000;"> + <th style="border:1px solid #000000;padding:5px 15px 5px 15px;"></th> + <th style="border:1px solid #000000;padding:5px 15px 5px 15px;"> 行数 </th> + <th style="border:1px solid #000000;padding:5px 15px 5px 15px;">単語数</th> + <tr> + <td style="border:1px solid #000000;padding:5px 15px 5px 15px;"> TreeVNC </td> + <td style="border:1px solid #000000;padding:5px 15px 5px 15px;">5049</td> + <td style="border:1px solid #000000;padding:5px 15px 5px 15px;">14191</td> + </tr> + <tr> + <td style="border:1px solid #000000;padding:5px 15px 5px 15px;"> Aliceを用いたTreeVNC </td> + <td style="border:1px solid #000000;padding:5px 15px 5px 15px;">989</td> + <td style="border:1px solid #000000;padding:5px 15px 5px 15px;">2355</td> + </tr> +</table> # まとめ * Alice が実用的なアプリケーションを記述するための Meta Computation として、データに多態性を持たせ、指定するDSMによってデータ表現を変える機能を実装した。