view presen/sigOS/sample.html @ 23:7de82f13512b default tip

last update
author Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
date Wed, 08 Jul 2015 17:34:13 +0900
parents 1f1b1f962ff1
children
line wrap: on
line source

<!DOCTYPE HTML>

<html lang="en-US">
<head>
	<title>分散フレームワークAliceの圧縮機能</title>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=1274, user-scalable=no">
	<meta name="generator" content="Slide Show (S9)">
	<meta name="author" content="照屋のぞみ">
	<link rel="stylesheet" href="themes/ribbon/styles/style.css">
</head>
<body class="list">
	<header class="caption">
		<h1>分散フレームワークAliceの圧縮機能</h1>
		<p>照屋のぞみ</p>
	</header>
	<div class="slide cover" id="Cover"><div>
		<section>
			<header>
				<h2>分散フレームワークAliceの圧縮機能</h2>
				<h3 id="author">照屋のぞみ</h3>
				<h3 id="profile">琉球大学 工学部 情報工学科 4年</h3>
			</header>
		</section>
	</div></div>

<!-- todo: add slide.classes to div -->
<!-- todo: create slide id from header? like a slug in blogs? -->

<div class="slide" id="2"><div>
		<section>
			<header>
				<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 18:01:27 +0900 with Markdown engine kramdown (1.5.0)
                  using options {}
  -->

<!-- _S9SLIDE_ -->

<ul>
  <li>当研究室が開発している並列分散フレームワークAliceではスケーラブルな分散プログラムを信頼性高く記述できる環境を実現する。</li>
  <li>Aliceのメタ計算として、通信が切断した際の処理やデータを圧縮する処理等を提供することで、プログラマがコードを大きく変更することなくプログラムの振る舞いを変えることを可能にする。</li>
</ul>



		</section>
</div></div>

<div class="slide" id="3"><div>
		<section>
			<header>
				<h1 id="data-segment--code-segment">Data Segment と Code Segment</h1>
			</header>
			<!-- _S9SLIDE_ -->

<ul>
  <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>



		</section>
</div></div>

<div class="slide" id="4"><div>
		<section>
			<header>
				<h1 id="data-segment--code-segment-1">Data Segment と Code Segment</h1>
			</header>
			<!-- _S9SLIDE_ -->

<ul>
  <li>CSはInput DS(入力されるDS)とOutput DS(出力されるDS)を持つ。</li>
  <li>CSはkeyで指定されたDSが揃うと実行されるという性質を持つ。</li>
<img src="./images/dsandcs.svg" alt="opt"  align="center"/>
</ul>


		</section>
</div></div>

<div class="slide" id="5"><div>
		<section>
			<header>
				<h1 id="codesegment">CodeSegmentの依存関係</h1>
			</header>
			<!-- _S9SLIDE_ -->

<ul>
  <li>データの依存関係のないCSは並列実行される</li>
  <li>データの依存関係がある場合は Input DS が揃うと順に実行される</li>
</ul>
<img src="./images/dsandcs2.svg" alt="opt"  align="center"/>


		</section>
</div></div>

<div class="slide" id="6"><div>
		<section>
			<header>
				<h1 id="data-segment">Data Segment</h1>
			</header>
			<!-- _S9SLIDE_ -->

<ul>
  <li>整数や文字列などの基本的なデータの集まり</li>
  <li>Aliceの場合はJavaオブジェクトに対応</li>
</ul>



		</section>
</div></div>

<div class="slide" id="7"><div>
		<section>
			<header>
				<h1 id="data-segment-manager">Data Segment Manager</h1>
			</header>
			<!-- _S9SLIDE_ -->

<ul>
  <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>
</div></div>

<div class="slide" id="8"><div>
		<section>
			<header>
				<h1 id="data-segment-manager-1">Data Segment Manager</h1>
			</header>
			<!-- _S9SLIDE_ -->

<img src="./images/remote_datasegment.svg" alt="opt" width="450px" align="right"/>
<ul>
  <li>Local DSM … 各ノード固有のデータベース。</li></br>
  <li>Remote DSM … 他のノードの Local DSM の proxy。接続しているノードの数だけ存在する。</li><br />
</ul>



		</section>
</div></div>

<div class="slide" id="9"><div>
		<section>
			<header>
				<h1 id="data-segment-">Data Segment の表現</h1>
			</header>
			<!-- _S9SLIDE_ -->

<ul>
  <li>DSは複数の表現を同時に持っており、現在は3種類の表現がある。
    <ol>
      <li>一般的な Java のクラスオブジェクト</li>
      <li>MessagePack for Java でシリアライズ化されたバイナリオブジェクト。Remoteとの通信の際に用いる。</li>
      <li>2 を圧縮したバイナリオブジェクト。圧縮機能の一部として今回追加。  </li>
    </ol>
  </li>
</ul>



		</section>
</div></div>

<div class="slide" id="10"><div>
		<section>
			<header>
				<h1 id="messagepack">MessagePackとは</h1>
			</header>
			<!-- _S9SLIDE_ -->

<ul>
  <li>Sadayuki Furuhashiが開発したシリアライズのための機能をまとめたオープンソースライブラリ。</li>
  <li>シリアライズ/デシリアライズを高速に行うことができ、整数、浮動小数点数、Boolean、文字列、配列、連想配列、nilをバイト列にシリアライズできる。</li>
  <li>JSONのようにプログラミング言語に依存しないデータの表現形式として使用できる。</li>
</ul>



		</section>
</div></div>

<div class="slide" id="11"><div>
		<section>
			<header>
				<h1 id="cs--input-ds-">CS と Input DS の対応付け</h1>
			</header>
			<!-- _S9SLIDE_ -->

<ul>
  <li>setKey()にtakeコマンドを待ち合わせすることで Input DS を指定する</li>
  <li>実際にtakeしたデータを参照するときには、asClass()を用いて任意のJavaのオブジェクトとして扱えるようにする  </li>
</ul>



		</section>
</div></div>


<div class="slide" id="12"><div>
		<section>
			<header>
				<h1 id="cs--">Code Segment の 例</h1>
			</header>
<span>2つのノード間で、RemoteDSMからデータをtakeしインクリメントしてLocalDSMにputを10回繰り返す</span>
<img src="./images/remoteTest.svg" alt="opt" align="center"/>
</div></div>

<div class="slide" id="13"><div>
		<section>
			<header>
				<h1 id="cs--">Code Segment の 例</h1>
			</header>
<span>2つのノード間で、RemoteDSMからデータをtakeしインクリメントしてLocalDSMにputを10回繰り返す</span>
<img src="./pictures/remoteTest2.svg" alt="opt" align="center"/>
</div></div>


<div class="slide" id="14"><div>
		<section>
			<header>
				<h1 id="cs--">Code Segment の 例</h1>
			</header>
<span>Start CS で 最初の DS をputする</span>
<pre><code style="font-size:13pt"  lang="java">
public class StartCodeSegment extends CodeSegment {
    @Override
    public void run() {
		<span style="color:red;">ods.put("local", "num", 0);</span>

		Increment nextCS = new Increment();
		nextCS.receiver.setKey("remote", "num");
    }
}
</code></pre>
		</section>
</div></div>


<div class="slide" id="15"><div>
		<section>
			<header>
				<h1 id="cs--">Code Segment の 例</h1>
			</header>
<span>次に実行するインクリメントのCSを作成する</span>
<pre><code style="font-size:13pt"  lang="java">
public class StartCodeSegment extends CodeSegment {
    @Override
    public void run() {
		ods.put("local", "num", 0);

		<span style="color:red;">Increment nextCS = new Increment();</span>
		nextCS.receiver.setKey("remote", "num");
    }
}
</code></pre>
		</section>
</div></div>


<div class="slide" id="17"><div>
		<section>
			<header>
				<h1 id="cs--">Code Segment の 例</h1>
			</header>
<span>作成したnextCSに対してsetKey()でDSM名とkeyを指定し、内部でtakeを行う。</span>
<pre><code style="font-size:13pt"  lang="java">
public class StartCodeSegment extends CodeSegment {
    @Override
    public void run() {
		ods.put("local", "num", 0);

		Increment nextCS = new Increment();
		<span style="color:red;">nextCS.receiver.setKey("remote", "num");</span>
    }
}
</code></pre>
		</section>
</div></div>


<div class="slide" id="18"><div>
		<section>
			<header>
				<h1 id="cs--">Code Segment の 例</h1>
			</header>
<span>takeでCSにInput DSを対応づけ、DSを格納するReceiverを用意がされる。</span>
<pre><code style="font-size:13pt"  lang="java">
public class Increment extends CodeSegment {
	<span style="color:red;">public Receiver receiver = ids.create(CommandType.TAKE);</span>
    @Override
    public void run() {
        int num = this.r.asClass(Integer.class);
		num++;
		if (num == 10) System.exit(0);
		ods.put("local", "num", num);
		Increment nextCS = new RemoteIncrement();
		nextCS.receiver.setKey("remote", "num");
    }
}
</code></pre>
		</section>
</div></div>


<div class="slide" id="19"><div>
		<section>
			<header>
				<h1 id="cs--">Code Segment の 例</h1>
			</header>
<span>受け取ったDSをasClass()でInt型として取り出す</span>
<pre><code style="font-size:13pt"  lang="java">
public class Increment extends CodeSegment {
	public Receiver receiver = ids.create(CommandType.TAKE);
    @Override
    public void run() {
		<span style="color:red;">int num = this.receiver.asClass(Integer.class);</span>
		num++;
		if (num == 10) System.exit(0);
		ods.put("local", "num", num);
		Increment nextCS = new RemoteIncrement();
		nextCS.receiver.setKey("remote", "num");
    }
}
</code></pre>
		</section>
</div></div>


<div class="slide" id="20"><div>
		<section>
			<header>
				<h1 id="cs--">Code Segment の 例</h1>
			</header>
<span>インクリメントする</span>
<pre><code style="font-size:13pt"  lang="java">
public class Increment extends CodeSegment {
	public Receiver receiver = ids.create(CommandType.TAKE);
    @Override
    public void run() {
		int num = this.receiver.asClass(Integer.class);
		<span style="color:red;">num++;</span>
		if (num == 10) System.exit(0);
		ods.put("local", "num", num);
		Increment nextCS = new RemoteIncrement();
		nextCS.receiver.setKey("remote", "num");
    }
}
</code></pre>
		</section>
</div></div>



<div class="slide" id="21"><div>
		<section>
			<header>
				<h1 id="cs--">Code Segment の 例</h1>
			</header>
<span>numが10であれば終了する</span>
<pre><code style="font-size:13pt"  lang="java">
public class Increment extends CodeSegment {
	public Receiver receiver = ids.create(CommandType.TAKE);
    @Override
    public void run() {
		int num = this.receiver.asClass(Integer.class);
		num++;
		<span style="color:red;">if (num == 10) System.exit(0);</span>
		ods.put("local", "num", num);
		Increment nextCS = new RemoteIncrement();
		nextCS.receiver.setKey("remote", "num");
    }
}
</code></pre>
		</section>
</div></div>

<div class="slide" id="22"><div>
		<section>
			<header>
				<h1 id="cs--">Code Segment の 例</h1>
			</header>
<span>インクリメントした結果をLocal DSMにputする</span>
<pre><code style="font-size:13pt"  lang="java">
public class Increment extends CodeSegment {
	public Receiver receiver = ids.create(CommandType.TAKE);
    @Override
    public void run() {
		int num = this.receiver.asClass(Integer.class);
		num++;
		if (num == 10) System.exit(0);
		<span style="color:red;">ods.put("local", "num", num);</span>
		Increment nextCS = new RemoteIncrement();
		nextCS.receiver.setKey("remote", "num");
    }
}
</code></pre>
		</section>
</div></div>


<div class="slide" id="23"><div>
		<section>
			<header>
				<h1 id="cs--">Code Segment の 例</h1>
			</header>
<span>次に実行するインクリメントCSを作成する</span>
<pre><code style="font-size:13pt"  lang="java">
public class Increment extends CodeSegment {
	public Receiver receiver = ids.create(CommandType.TAKE);
    @Override
    public void run() {
		int num = this.receiver.asClass(Integer.class);
		num++;
		if (num == 10) System.exit(0);
		ods.put("local", "num", num);
		<span style="color:red;">Increment nextCS = new RemoteIncrement();</span>
		nextCS.receiver.setKey("remote", "num");
    }
}
</code></pre>
		</section>
</div></div>

<div class="slide" id="24"><div>
		<section>
			<header>
				<h1 id="cs--">Code Segment の 例</h1>
			</header>
<span>作成したnextCSにkeyを指定してtakeを行わせる。以下繰り返し。</span>
<pre><code style="font-size:13pt"  lang="java">
public class Increment extends CodeSegment {
	public Receiver receiver = ids.create(CommandType.TAKE);
    @Override
    public void run() {
		int num = this.receiver.asClass(Integer.class);
		num++;
		if (num == 10) System.exit(0);
		ods.put("local", "num", num);
		Increment nextCS = new RemoteIncrement();
		<span style="color:red;">nextCS.receiver.setKey("remote", "num");</span>
    }
}
</code></pre>
		</section>
</div></div>

<div class="slide" id="25"><div>
		<section>
			<header>
				<h1 id="treevnc">TreeVNC</h1>
			</header>
			<!-- _S9SLIDE_ -->
<img src="./images/treeVNC.svg" alt="opt" align="right"/>
<ul>
  <li>Aliceを用いて実装する実用的な分散プログラムの例題</li>
  <li>当研究室で開発したノードを木構造に配置して負荷分散を行う授業向け画面共有システム</li>
  <li>TightVNCがもとになっている</li>
</ul>



		</section>
</div></div>

<div class="slide" id="26"><div>
		<section>
			<header>
				<h1 id="computation">Computation</h1>
			</header>
			<!-- _S9SLIDE_ -->

<ul>
  <li>Aliceでは、計算の本質的な処理をComputatin、Computationとは直接関係ないが別のレベルでそれを支える処理をMeta Computationとして分けて考える。</li>
  <li>Alice の Computationは、keyによりDSを待ち合わせ、DSが揃ったCSを並列に実行する処理。</li>
  <li>TreeVNC の Computationは、VNCサーバからデータを受け取って表示する処理。</li>
</ul>



		</section>
</div></div>

<div class="slide" id="27"><div>
		<section>
			<header>
				<h1 id="meta-computation">Meta Computation</h1>
			</header>
			<!-- _S9SLIDE_ -->

<ul>
  <li>通信の切断・再接続時の処理や分散トポロジーの構成、データの表現形式の選択など、Computationを支えている処理。</li>
  <li>TreeVNCの場合、VNCサーバのデータを各VNCノードにコピーする処理。</li>
  <li>Aliceの機能を追加するということは Meta Computation を追加すると言い換えられる</li>
</ul>



		</section>
</div></div>

<div class="slide" id="28"><div>
		<section>
			<header>
				<h1 id="treevncalicemeta-computation">TreeVNCで用いるAliceのMeta Computation</h1>
			</header>
			<!-- _S9SLIDE_ -->

<ul>
  <li>TreeTopologyの構成</li>
  <li>ノード間通信の切断時・再接続時の処理</li>
  <li>データの圧縮</li>
  <li>子ノードへのデータの複製</li>
</ul>



		</section>
</div></div>

<div class="slide" id="29"><div>
		<section>
			<header>
				<h1 id="dsmapi">データの転送 - DSMとAPIの追加</h1>
			</header>
			<!-- _S9SLIDE_ -->

<ul>
  <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>



		</section>
</div></div>

<div class="slide" id="30"><div>
		<section>
			<header>
				<h1 id="section-1">データの転送 - データ表現の自動生成</h1>
			</header>
			<!-- _S9SLIDE_ -->

<ul>
  <li>DS が圧縮表現を持っていれはそれをそのまま子ノードにputする</li>
  <li>持っていなければその時点でCompressed DSM内部で圧縮表現を生成してputする</li>
  <li>DS はオブジェクト表現と圧縮表現を同時にもつため、TreeVNCでは受け取った画面データを伸長をした後、転送のために再圧縮することはない。</li>
</ul>



		</section>
</div></div>

<div class="slide" id="31"><div>
		<section>
			<header>
				<h1 id="section-2">データの受け取り - 任意の形式での取得</h1>
			</header>
			<!-- _S9SLIDE_ -->

<ul>
  <li>圧縮表現で画面データ受け取り、Compressed DSM 内に格納。</li>
  <li>TightVNCが画面表示のためにデータを必要としたときに、 asClass() を用いて任意の形式でデータを取り出す。</li>
  <li>asClass() は DS のcastメソッドであり、内部で伸長と MessagePack での変換を行う。</li>
</ul>



		</section>
</div></div>

<div class="slide" id="32"><div>
		<section>
			<header>
				<h1 id="alice">データの受け取り - Aliceの通信パケット変更</h1>
			</header>
			<!-- _S9SLIDE_ -->

<ul>
  <li>通信ヘッダにデータの状態を表すフラグを追加したことで、受け取ったデータを適切な形式でDSM内に格納できる。</li>
  <li>圧縮前と圧縮後のデータサイズを入れたことにより、受け取ったデータの適切な伸長が可能。</li>
<table style="border-collapse: collapse;border:1px solid #000000;">
	<td style="border:1px solid #000000;padding:5px;"> serialized </td>
	<td style="border:1px solid #000000;padding:5px;">データ本体のシリアライズ状態を示す</td>

	<tr>
	<td style="border:1px solid #000000;padding:5px;"> compressed </td>
	<td style="border:1px solid #000000;padding:5px;">データ本体の圧縮状態を示す</td>
	</tr>
	<tr>
	<td style="border:1px solid #000000;padding:5px;"> objectDataSize </td>
	<td style="border:1px solid #000000;padding:5px;">圧縮前のオブジェクトのデータサイズを表す</td>
	</tr>
	<tr>
	<td style="border:1px solid #000000;padding:5px;"> dataSize </td>
	<td style="border:1px solid #000000;padding:5px;">送信するDSのデータサイズを表す</td>
	</tr>
</table>
</ul>


		</section>
</div></div>

<div class="slide" id="33"><div>
		<section>
			<header>
				<h1 id="alice1---erlang">Aliceと他言語等との比較(1) - Erlang</h1>
			</header>
			<!-- _S9SLIDE_ -->

<ul>
  <li>	タスクをプロセスと呼ばれるメモリを共有しないスレッドに分割  </li>
<li>	共有メモリにアクセスするためのメモリロックの仕組みを必要としない	  </li>
	<li>ネットワークに依存しない通信が可能</li><!--Erlangはフォールトレランスと呼ばれる障害耐性を備え、システムを稼働させたまま部分停止・修復ができる-->

</br>
	<li><p>Topologyの構成等は自分で管理</p></li>
</ul>



		</section>
</div></div>

<div class="slide" id="34"><div>
		<section>
			<header>
				<h1 id="alice1---linda">Aliceと他言語等との比較(2) - Linda</h1>
			</header>
			<!-- _S9SLIDE_ -->

<ul>
  <li>idでタプルというデータの集合を管理している</li>
  <li>
    <p>in/outでAliceのput/takeに対応する操作を行う</p>
  </li>
  <li>タスクはinで単一のタプルを待つ</li>
  <li>MetaComputationがない</li>
</ul>



		</section>
</div></div>

<div class="slide" id="35"><div>
		<section>
			<header>
				<h1 id="alice1---corba">Aliceと他言語等との比較(3) - CORBA</h1>
			</header>
			<!-- _S9SLIDE_ -->

<ul>
  <li>
    <p>オブジェクト間のRPC仕様</p>
  </li>
  <li>DSがない。keyという概念がない。</li>
  <li>データの待ち合わせがない</li>
</ul>



		</section>
</div></div>

<div class="slide" id="36"><div>
		<section>
			<header>
				<h1 id="alice1---http">Aliceと他言語等との比較(4) - HTTP</h1>
			</header>
			<!-- _S9SLIDE_ -->

<ul>
  <li>get/putで通信を行うRESTfulアーキテクチャ</li>
  <li>
    <p>URLがデータベースのkeyとなる</p>
  </li>
  <li>MIME形式で送信。複数の表現を持つMeta Computationがない。  </li>
  <li>セッション管理はクライアント自身がやる  </li>
  <li>並列処理できない  </li>
</ul>



		</section>
</div></div>

<div class="slide" id="37"><div>
		<section>
			<header>
				<h1 id="treevncalicetreevnc">TreeVNCとAliceを用いたTreeVNCの比較</h1>
			</header>
			<!-- _S9SLIDE_ -->

<ul>
  <li>
    <p>TreeVNC<br />
  通信プロトコルを定義や圧縮を自前で行う<br />
  通信スレッドを複数作成<br />
  様々な部分で通信APIを呼び出す  </p>
  </li>
  <li>
    <p>Aliceを用いたTreeVNC<br />
  Aliceと接続する最小限の変更<br />
  木の構成部分や圧縮形式での通信はMeta Computation  </p>
  </li>
</ul>



		</section>
</div></div>

<div class="slide" id="38"><div>
		<section>
			<header>
				<h1 id="treevncalicetreevnc-1">TreeVNCとAliceを用いたTreeVNCの比較</h1>
			</header>
			<!-- _S9SLIDE_ -->

<ul>
  <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>
</div></div>

<div class="slide" id="39"><div>
		<section>
			<header>
				<h1 id="section-3">まとめ</h1>
			</header>
			<!-- _S9SLIDE_ -->

<ul>
  <li>Alice が実用的なアプリケーションを記述するための Meta Computation として、データに多態性を持たせ、指定するDSMによってデータ表現を変える機能を実装した。</li>
  <li>これによりユーザが記述する Computation 部分を大きく変えずに自由度の高い通信を行うことが可能になった。</li>
  <li>同様の手法により、暗号形式・JSON 形式など複数のデータ表現を扱えるように拡張できる。</li>
  <li>今後の課題としては、圧縮機能を TreeVNC で用 いることで有効性を測る必要がある。</li>
</ul>
<!-- === end markdown block === -->

		</section>
</div></div>


	<script src="scripts/script.js"></script>
	<!-- Copyright © 2010–2011 Vadim Makeev, http://pepelsbey.net/ -->
</body>
</html>