Mercurial > hg > Papers > 2015 > nozomi-sigos
comparison presen/sigOS/sample.markdown @ 14:99e5104997b7
add compress part
author | Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 24 May 2015 17:56:24 +0900 |
parents | c0fe42a8808d |
children | 696a908208c8 |
comparison
equal
deleted
inserted
replaced
13:c0fe42a8808d | 14:99e5104997b7 |
---|---|
48 <td style="border:1px solid #000000;"> take</td> | 48 <td style="border:1px solid #000000;"> take</td> |
49 <td style="border:1px solid #000000;">データを取得する。取得したデータはDSMから削除される。</td> | 49 <td style="border:1px solid #000000;">データを取得する。取得したデータはDSMから削除される。</td> |
50 </tr> | 50 </tr> |
51 </table> | 51 </table> |
52 | 52 |
53 # Aliceの概要(4) - Data Segment の表現 | |
54 * 一般的な Java のクラスオブジェクト | |
55 * LocalDSM に put された場合は一般的な Java のクラスオブジェクトとして enQueue される。 | |
56 * MessagePack を用いて変換した byte[]で表現されたバイナリオブジェクト | |
57 * RemoteDSM に put された場合は通信時に byteArray に変換されたバイナリオブジェクトが enQueue される。 | |
53 | 58 |
54 # Aliceの概要(4) - Code Segment | 59 # Aliceの概要(5) - Code Segment |
55 * Alice上で実行されるタスクの単位を Code Segment(CS) と呼ぶ。 | 60 * Alice上で実行されるタスクの単位を Code Segment(CS) と呼ぶ。 |
56 * 複数のDSが入力され、その結果をDSとして出力するfunctionと捉えられる。 | 61 * 複数のDSが入力され、その結果をDSとして出力するfunctionと捉えられる。 |
62 * CS をユーザーが記述する際には CS を継承して記述することにより CS で使用する API を利用する事ができる。 | |
63 | |
64 # Aliceの概要(5) - Code Segment | |
57 * 入力されるDSをInput DS、出力されるDSをOutput DSと呼ぶ。 | 65 * 入力されるDSをInput DS、出力されるDSをOutput DSと呼ぶ。 |
58 * keyで指定されたDSが揃うと実行されるという性質を持つ。 | 66 * keyで指定されたDSが揃うと実行されるという性質を持つ。 |
59 ![opt](./images/dsandcs.svg) | 67 ![opt](./images/dsandcs.svg) |
60 | 68 |
61 # Aliceの概要(5) - CodeSegmentの依存関係 | 69 # Aliceの概要(6) - CodeSegmentの依存関係 |
62 * データの依存関係にないCSは並列実行される | 70 * データの依存関係にないCSは並列実行される |
63 * データの依存関係がある場合は依存を解決した順に実行される | 71 * データの依存関係がある場合は依存を解決した順に実行される |
64 * 並列度あげるために、処理を細かく記述し、依存するDSを少なくする | 72 * 並列度あげるために、処理を細かく記述し、依存するDSを少なくする |
65 ![opt](./images/dsandcs2.svg) | 73 ![opt](./images/dsandcs2.svg) |
66 | 74 |
67 # AliceのMeta Computation | 75 # AliceのMeta Computation(1/2) |
68 * 並列指向プログラミング言語 Erlang では、分散環境の構築等の処理は全てプログラマが記述しなければいけない。 | 76 * 並列指向プログラミング言語 Erlang では、分散環境の構築等の処理は全てプログラマが記述しなければいけない。 |
69 * Aliceではプログラマが記述する部分を *Computation*、Aliceが提供するComputationを支える部分を *Meta Computation* として分けて捉えている。 | 77 * Aliceではプログラマが記述する部分を *Computation*、Aliceが提供するComputationを支える部分を *Meta Computation* として分けて捉えている。 |
78 * 分散環境の構築等の処理等は全てMeta Computationが行うためプログラマがシンプルに分散プログラムを記述できる環境を提供している。 | |
70 | 79 |
71 # AliceのMeta Computation | 80 # AliceのMeta Computation(2/2) |
72 * AliceのComputation | 81 * AliceのComputation |
73 * keyによりData Segmentを待ち合わせてCode Segmentを実行する | 82 * keyによりData Segmentを待ち合わせてCode Segmentを実行する |
74 | 83 |
75 * AliceのMeta Computation | 84 * AliceのMeta Computation |
76 * Javaで記述したAliceの実装システム | 85 * Javaで記述したAliceの実装システム |
77 | 86 |
78 * Aliceの機能を追加するということはMeta Computationを追加すると言い換えられる | 87 * Aliceの機能を追加するということは Meta Computation を追加すると言い換えられる |
79 * Meta ComputationもCSとDSにより表現されており、それぞれMeta CSとMeta DSと呼ぶ。 | 88 * Meta Computation も CS と DS により表現されており、それぞれMeta CSとMeta DSと呼ぶ。 |
89 | |
90 # AliceVNC | |
91 * 研究室では授業向け画面共有システム TreeVNC の開発を行っている。 | |
92 * 授業で VNC を使う場合、1つ のコンピュータに多人数が同時につながるため、性能が大幅に落ちる | |
93 * TreeVNCではノード同士を接続させ、木構造を構成することで負荷分散を行う | |
94 ![opt](./images/treeVNC.svg) | |
80 | 95 |
81 # Alice の新機能 | 96 # Alice の新機能 |
82 実用的なアプリケーションであるTreeVNCの実装で必要となった以下の機能をMeta Computation として実装した。 | 97 * Alice が実用的なアプリケーションを記述する能力をもつことを確認するために、TreeVNC を Alice を用いて実装した AliceVNC の作成を行った。 |
83 * flip機能 … Input DS を Output DSとして転送する | 98 * AliceVNCの実装で必要となった以下の機能をMeta Computation として実装した。 |
84 * 圧縮機能 … DS Managerの指定によってDSの表現を切り替える | 99 * flip機能 … Input DS を Output DS として転送する |
100 * 圧縮機能 … DS Manager の指定によってDSの表現を切り替える | |
85 | 101 |
86 # flip機能 | 102 # flip機能 |
87 | 103 |
88 # 圧縮機能 | 104 # 圧縮機能 |
105 * AliceVNCは、ノードは受け取った画面データを描画すると同時に、子ノードの Remote DSM に送信する。 | |
106 * ノードは DS を受信するとそれを一度解凍して画面を表示し、再圧縮して子ノードに送信する。 | |
107 * 圧縮状態のまま子ノードに送信ができれば、解凍・再圧縮するオーバーヘッドを無くすことができる。 | |
89 | 108 |
90 # API設計 | 109 # 圧縮機能 - Data Segmentの表現の変更 |
91 * put(String "compressed" + managerKey, String key, Object val) | 110 1つの Data Segment に対し以下の3種類の表現を同時に持たせ、必要に応じた形式で DS を扱う。 |
92 * take(String "compressed" + managerKey, String key) | 111 1. 一般的な Java のクラスオブジェクト |
112 2. MessagePack for Java でシリアライズ化され たバイナリオブジェクト | |
113 3. 2 を圧縮したバイナリオブジェクト | |
114 | |
115 # 圧縮機能 - Data Segmentの表現の変更 | |
116 ```java | |
117 public class ReceiveData { | |
118 private Object val = null; | |
119 private byte[] messagePack = null; | |
120 private byte[] zMessagePack = null; | |
121 } | |
122 ``` | |
123 | |
124 # 圧縮機能 - DSMの追加 | |
125 * Local と Remote それぞれに圧縮表現を扱う Compressed DSM を追加した。 | |
126 * Compressed DSM にputする場合 | |
127 * DS が圧縮表現を持っていればそれをputする | |
128 * 持っていなければその時点で圧縮表現を作ってputする | |
129 | |
130 # 圧縮機能 - 任意の表現でDSを取得 | |
131 * ReceiveData内にあるDSのcastメソッドであるasClass()を用いる | |
132 ```java | |
133 public <T> T asClass(Class<T> clazz) { | |
134 if (val != null) { return (T) val; } | |
135 | |
136 if (zMessagePack != null && messagePack == null) { | |
137 messagePack = unzip(zMessagePack, dataSize); | |
138 } | |
139 | |
140 return packer.read(messagePack, clazz); | |
141 } | |
142 ``` | |
143 | |
144 # 圧縮機能 - API設計 | |
145 通常のデータを扱う場合 | |
146 * put(String managerKey, String key, Object val) | |
147 * take(String managerKey, String key) | |
148 | |
149 圧縮表現のデータを扱う場合 | |
150 * put(String **"compressed"** + managerKey, String key, Object val) | |
151 * take(String **"compressed"** + managerKey, String key) | |
152 | |
153 # 圧縮機能 - 通信プロトコルの変更 | |
154 Remote から put されたデータは必ずシリアライズ化されており byteArray で表現される。 | |
155 データの 表現に圧縮した byteArray を追加したため、Remote から put された byteArray が圧縮されているのかそ うでないのかを判断する必要がある。 | |
156 | |
157 # 圧縮機能の評価 | |
158 RingRelayTest | |
159 | |
160 # まとめ | |
161 * Alice が実用的なアプリケーションを記述するための Meta Computation として、データに多態性を持たせ、指定するDSMによってデータ表 現を変える機能を実装した。 | |
162 * これによりユーザが記述する Computation 部分を大きく変えずに自由度の高い通信を行うことが可能になった。 | |
163 * 同様の手法により、暗号形式・JSON 形式など複数のデータ表現を扱えるように拡張できる。 | |
164 * 今後の課題としては、圧縮機能を AliceVNC で用 いることで有効性を測る必要がある。 |