comparison slide/thesis.pdf.html @ 28:7174f22ed695

tweak
author ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
date Thu, 10 Feb 2022 23:55:41 +0900
parents 3f39907150c5
children bca6c79006cf
comparison
equal deleted inserted replaced
27:3f39907150c5 28:7174f22ed695
61 </tr> 61 </tr>
62 <tr> 62 <tr>
63 <td> 63 <td>
64 <div align="left"> 64 <div align="left">
65 Takahiro Ikki, Shinji Kono 65 Takahiro Ikki, Shinji Kono
66 琉球大学 66 琉球大学理工学研究科情報工学専攻
67 <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:100%;height:0.2em;"> 67 <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:100%;height:0.2em;">
68 </div> 68 </div>
69 </td> 69 </td>
70 </tr> 70 </tr>
71 </table> 71 </table>
73 73
74 74
75 <div class='slide'> 75 <div class='slide'>
76 76
77 <!-- _S9SLIDE_ --> 77 <!-- _S9SLIDE_ -->
78 <h2 id="gearsosのファイルシステムの設計方針">GearsOSのファイルシステムの設計方針</h2> 78 <h2 id="gearsosのファイルシステムの設計と実装">GearsOSのファイルシステムの設計と実装</h2>
79 <ul> 79 <ul>
80 <li>GearsOSはGearという単位で記述が行われているOSプロジェクトである</li> 80 <li>DataGearとCodeGearという単位を用いるOS</li>
81 <li>GearsOSのファイルシステムも同様にDataGearの単位で構成したい</li> 81 <li>従来のファイルシステムには型とTransactionが無い</li>
82 <li>GearsOSのファイルシステムの設計と実装を行った</li> 82 <li>DataGear単位のTransactionとしてファイルシステムを設計</li>
83 <li>ファイルに取り扱うデータに対応した複数のストリームを持たせたい 83 <li>APIとしてTake/Put/Peekを採用した</li>
84 <ul> 84 <li>通信としてもDBアクセスとしても使える(メモリからSSDへの通信に見える)</li>
85 <li>従来では異なるデータでも単一のストリームから入力される</li> 85 <li>本研究ではsocket baseな通信とWordCountの例題を作成した</li>
86 </ul> 86 </ul>
87 </li> 87
88 <li>GearsOSには将来的にアプリケーションが担う重要な機能をOSに取り込みたい 88
89 <ul> 89
90 <li>ファイルの型認識</li> 90 </div>
91 <li>バックアップ</li> 91
92 </ul> 92 <div class='slide'>
93 </li> 93 <!-- _S9SLIDE_ -->
94 </ul> 94 <h2 id="gearsosの基本単位">GearsOSの基本単位</h2>
95 95 <ul>
96
97
98 </div>
99
100 <div class='slide'>
101 <!-- _S9SLIDE_ -->
102 <h2 id="gearsosのgear概念12">GearsOSのGear概念(1/2)</h2>
103 <ul>
104 <li>関数でなくGearという単位を用いて記述する</li>
105 <li>Gearは関数と異なり、スタックを持たないため軽量継続と呼ぶ</li>
106 <li>CodeGear 96 <li>CodeGear
107 <ul> 97 <ul>
108 <li>従来のThreadにあたる</li> 98 <li>実行Codeの単位</li>
99 <li>入力DataGearと出力DataGearを持つ</li>
109 <li>goto文(jump命令)を使って遷移する</li> 100 <li>goto文(jump命令)を使って遷移する</li>
101 <li>実行単位は途中で割り込まれたりしない(Atmocity)</li>
110 </ul> 102 </ul>
111 </li> 103 </li>
112 <li>DataGear 104 <li>DataGear
113 <ul> 105 <ul>
114 <li>従来の変数データにあたる</li> 106 <li>Cの構造体に相当する</li>
115 </ul> 107 <li>ノーマルレベルでは変更されない(関数型プログラミング)</li>
116 </li> 108 </ul>
117 </ul> 109 </li>
118 110 <li>C言語を拡張する形でCbC言語により実装される(gcc/llvm)</li>
119 111 </ul>
120 112
121 </div> 113
122 114
123 <div class='slide'> 115 </div>
124 <!-- _S9SLIDE_ --> 116
125 <h2 id="gearsosのgear概念22">GearsOSのGear概念(2/2)</h2> 117 <div class='slide'>
126 <ul> 118 <!-- _S9SLIDE_ -->
127 <li>CodeGearは処理を行う際、DataGearを参照し処理を行う(InputDataGear)</li> 119 <h2 id="codegearとdatagear">CodeGearとDataGear</h2>
128 <li>CodeGearは処理の終了後、以降に必要なデータをDataGearとして出力する(OutputDataGear)</li> 120 <ul>
121 <li>InputDataGearを受け取って、CodeGearが処理し、OutputDataGearを出力する</li>
122 <li>OutputDataGearは次のCodeGearのInputDataGearとなる</li>
123 <li>ファイルシステムではDataGearをkeyで待ち合わせる</li>
129 </ul> 124 </ul>
130 <div style="text-align: center;"> 125 <div style="text-align: center;">
131  <img src="images/cg-dg.pdf" alt="cgdgの関係図" width="600" /> 126  <img src="images/cg-dg.pdf" alt="cgdgの関係図" width="600" />
132 </div> 127 </div>
133 128
137 132
138 <div class='slide'> 133 <div class='slide'>
139 <!-- _S9SLIDE_ --> 134 <!-- _S9SLIDE_ -->
140 <h2 id="gearsosのinterface">GearsOSのInterface</h2> 135 <h2 id="gearsosのinterface">GearsOSのInterface</h2>
141 <ul> 136 <ul>
142 <li>Object型指向の仕組み</li> 137 <li>JavaのInterfaceに相当する</li>
143 <li>APIとなるCodeGearとその参照するDataGearを宣言する</li> 138 <li>APIとなるCodeGearの名前と型を書く(__next(…)が継続)</li>
144 <li>DataGear/CodeGearの一時的な置き場としての役割を持つ 139 <li>引数渡しの構造体として使う(引数はすべてここに定義される必要がある)
145 <pre><code>typedef struct Tree&lt;&gt;{ 140 <pre><code>typedef struct Tree&lt;&gt;{
146 union Data* tree; 141 union Data* tree;
147 struct Node* node; 142 struct Node* node;
148 __code put(Impl* tree,Type* node, __code next(...)); 143 __code put(Impl* tree,Type* node, __code next(...));
149 __code get(Impl* tree, Type* node, __code next(...)); 144 __code get(Impl* tree, Type* node, __code next(...));
158 153
159 </div> 154 </div>
160 155
161 <div class='slide'> 156 <div class='slide'>
162 <!-- _S9SLIDE_ --> 157 <!-- _S9SLIDE_ -->
163 <h2 id="gearsosのimplement">GearsOSのImplement</h2> 158 <h2 id="interfaceの呼び出し">Interfaceの呼び出し</h2>
164 <ul> 159 <ul>
165 <li>Interfaceを継承した実装の型定義ファイルである</li> 160 <li>createで作成する(通常の関数呼び出し)</li>
166 <li>実装で使われるデータ構造を記述する 161 <li>DataGearとして作成する場合はnewを使う</li>
167 <pre><code> typedef struct SynchronizedQueue &lt;&gt; impl Queue { 162 <li>gotoでputAPIを呼び出す(nextは継続)</li>
168 struct Element* top; 163 <li>InterfaceなどのDataGearはプロセスに相当するContextにすべて格納される
169 struct Element* last; 164 <pre><code>struct Queue* queue = createSychronizedQueue(context);
170 struct Atomic* atomic; 165 struct Task* task = new Task();
171 } SynchronizedQueue; 166 goto queue-&gt;put(task, next(...));
172 </code></pre> 167 </code></pre>
173 </li> 168 </li>
174 </ul> 169 </ul>
175 170
176 171
177 172
178 </div> 173 </div>
179 174
180 <div class='slide'> 175 <div class='slide'>
181 <!-- _S9SLIDE_ --> 176 <!-- _S9SLIDE_ -->
182 <h2 id="interfaceの呼び出し">Interfaceの呼び出し</h2> 177 <h2 id="interfaceの実装">Interfaceの実装</h2>
183 <ul> 178 <ul>
184 <li>インターフェースは以下の記述で実装と呼び出しを行う 179 <li>Interfaceの実装に使われるデータ構造を記述するImplementがある</li>
185 <pre><code>struct Queue* queue = new Queue(); 180 <li>実装で使われるDataGearを記述する(ヒープに確保される)</li>
186 queue = createSychronizedQueue(context); 181 <li>create時にAPIを実装するCodeGearをInterfaceの構造体に代入される
182 <pre><code>typedef struct SynchronizedQueue &lt;&gt; impl Queue {
183 struct Element* top;
184 struct Element* last;
185 struct Atomic* atomic;
186 } SynchronizedQueue;
187 </code></pre> 187 </code></pre>
188 </li> 188 </li>
189 </ul> 189 </ul>
190 190
191 <pre><code>goto queue-&gt;put(task, next(...)); 191
192 </code></pre> 192
193 193 </div>
194 194
195 195 <div class='slide'>
196 </div> 196 <!-- _S9SLIDE_ -->
197 197 <h2 id="codegearとdatagearにはメタレベルなものが存在する">CodeGearとDataGearにはメタレベルなものが存在する</h2>
198 <div class='slide'> 198 <ul>
199 <!-- _S9SLIDE_ --> 199 <li>メタレベルな記述はトランスコンパイラにより自動生成される(記述することも可能)</li>
200 <h2 id="メタレベルのgear13">メタレベルのGear(1/3)</h2> 200 <li>CodeGearの前後にMetaなCodeGearが挿入される</li>
201 <ul>
202 <li>CodeGearとDataGearにはユーザーが記述しない、メタレベルのものが存在する
203 <ul>
204 <li>メタレベルな記述はトランスコンパイラにより自動生成される</li>
205 </ul>
206 </li>
207 </ul> 201 </ul>
208 <div style="text-align: center;"> 202 <div style="text-align: center;">
209  <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800" /> 203  <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800" />
210 </div> 204 </div>
211 205
213 207
214 </div> 208 </div>
215 209
216 <div class='slide'> 210 <div class='slide'>
217 <!-- _S9SLIDE_ --> 211 <!-- _S9SLIDE_ -->
218 <h2 id="メタレベルのgear23">メタレベルのGear(2/3)</h2> 212 <h2 id="stubcodegearとgoto-meta">stubCodeGearとgoto meta</h2>
219 <ul> 213 <ul>
220 <li>MetaCodeGear 214 <li>ContextからInputDataGearを取り出す(stubCodeGear)</li>
221 <ul> 215 <li>OutputDataGearをContextに書き込み、次のCodeGearを呼び出す(goto meta)</li>
222 <li>CodeGearの処理前と処理後に参照される</li> 216 <li>stubCodeGear/goto metaは変更可能(メタプログラミング)</li>
223 <li>Input/OutputDataGearを引き渡す</li>
224 <li>CodeGear処理前に呼ばれるものを特にstubCodeGearと呼ぶ</li>
225 </ul>
226 </li>
227 </ul> 217 </ul>
228 <div style="text-align: center;"> 218 <div style="text-align: center;">
229  <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800" /> 219  <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800" />
230 </div> 220 </div>
231 221
233 223
234 </div> 224 </div>
235 225
236 <div class='slide'> 226 <div class='slide'>
237 <!-- _S9SLIDE_ --> 227 <!-- _S9SLIDE_ -->
238 <h2 id="メタレベルのgear33">メタレベルのGear(3/3)</h2>
239 <ul>
240 <li>MetaDataGear
241 <ul>
242 <li>MetaCodeGearにて参照されるDataGear</li>
243 </ul>
244 </li>
245 </ul>
246 <div style="text-align: center;">
247  <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800" />
248 </div>
249
250
251
252 </div>
253
254 <div class='slide'>
255 <!-- _S9SLIDE_ -->
256 <h2 id="gearsosのファイルシステムの設計">GearsOSのファイルシステムの設計</h2> 228 <h2 id="gearsosのファイルシステムの設計">GearsOSのファイルシステムの設計</h2>
257 <ul> 229 <ul>
258 <li>DataGearの単位でデータを操作したい</li> 230 <li>DataGearの単位でデータを操作したい</li>
259 <li>通信データに対応した複数のストリームを持ちたい</li> 231 <li>通信データに対応した複数のストリームを持つ</li>
260 <li>Transaction(マクロレベル)で操作したい 232 <li>Transactionとしてatomicに操作したい
261 <ul> 233 <ul>
262 <li>従来のファイルシステムは一部の操作のみTransactionである</li> 234 <li>従来のファイルシステムはTransactionはUserレベルで実装される</li>
263 </ul> 235 </ul>
264 </li> 236 </li>
265 <li>ファイルそのものが通信を担当する 237 <li>ファイル操作と通信を同じAPIで実現する
266 <ul> 238 <ul>
267 <li>ChristieのDataGearManagerを参考にする</li> 239 <li>ChristieのDataGearManagerを参考にする</li>
268 </ul> 240 <li>Take/Put/Peek</li>
269 </li> 241 </ul>
270 </ul> 242 </li>
271 243 </ul>
272 244
273 245
274 </div> 246
275 247 </div>
276 <div class='slide'> 248
277 <!-- _S9SLIDE_ --> 249 <div class='slide'>
278 <h2 id="gearsosのファイルデータ操作13">GearsOSのファイルデータ操作(1/3)</h2> 250 <!-- _S9SLIDE_ -->
279 <ul> 251 <h2 id="takeputpeek">Take/Put/Peek</h2>
280 <li>GearsOSはDataGearのやりとりでプログラムが構成される 252 <ul>
281 <ul> 253 <li>ファイルはQueueで構成される</li>
282 <li>ファイルシステムも同様の実装にしたい = DataGear単位で操作したい</li> 254 <li>putでQueueに追加</li>
283 </ul> 255 <li>takeでQueueからの取り出し</li>
284 </li> 256 <li>peekでQueueから取り出さない読み出し</li>
285 </ul> 257 </ul>
286 <div style="text-align: center;"> 258 <div style="text-align: center;">
287  <img src="images/QueueElement.pdf" alt="Queueの構造" width="800" /> 259  <img src="images/QueueElement.pdf" alt="Queueの構造" width="800" />
288 </div> 260 </div>
289 261
291 263
292 </div> 264 </div>
293 265
294 <div class='slide'> 266 <div class='slide'>
295 <!-- _S9SLIDE_ --> 267 <!-- _S9SLIDE_ -->
296 <h2 id="gearsosのファイルデータ操作23">GearsOSのファイルデータ操作(2/3)</h2>
297 <ul>
298 <li>GearsOSのファイルデータは任意の型を持った構造体で実装される(ファイルレコード)</li>
299 <li>レコードは決められた順番で連続しており、Queueに保存される</li>
300 </ul>
301 <div style="text-align: center;">
302  <img src="images/QueueElement.pdf" alt="Queueの構造" width="800" />
303 </div>
304
305
306
307 </div>
308
309 <div class='slide'>
310 <!-- _S9SLIDE_ -->
311 <h2 id="gearsosのファイルデータ操作33">GearsOSのファイルデータ操作(3/3)</h2>
312 <ul>
313 <li>構造体の型を判別することで処理の切り替えが行える</li>
314 </ul>
315 <div style="text-align: center;">
316  <img src="images/QueueElement.pdf" alt="Queueの構造" width="800" />
317 </div>
318
319
320
321 </div>
322
323 <div class='slide'>
324 <!-- _S9SLIDE_ -->
325 <h2 id="gearsfsのトランザクション">GearsFSのトランザクション</h2> 268 <h2 id="gearsfsのトランザクション">GearsFSのトランザクション</h2>
326 <ul> 269 <ul>
327 <li>GearsOSのDataGear操作はマクロな操作である 270 <li>GearsOSのCodeGear操作はatomicなので割り込まれない
328 <ul> 271 <ul>
329 <li>よってCodeGearはTransactionである</li> 272 <li>atomicityはOSが保証する</li>
330 </ul> 273 <li>これによりTake/Put/PeekがTransactionであることを保証する</li>
331 </li> 274 </ul>
332 <li>ファイルシステム操作もCodeGearで記述されるためTransactionとなる</li> 275 </li>
333 <li>トランザクションな操作によってファイルシステムの整合性の保守が行いやすい</li>
334 </ul> 276 </ul>
335 277
336 278
337 279
338 </div> 280 </div>
339 281
340 <div class='slide'> 282 <div class='slide'>
341 <!-- _S9SLIDE_ --> 283 <!-- _S9SLIDE_ -->
342 <h2 id="queueによるgearsosのファイル">QueueによるGearsOSのファイル</h2> 284 <h2 id="queueによるgearsosのファイル">QueueによるGearsOSのファイル</h2>
343 <ul> 285 <ul>
344 <li>GearsOSのファイルはファイルレコードを保持するQueueとなる</li> 286 <li>GearsOSのファイルはDataGearを保持するQueueとなる</li>
345 <li>デバイスへの保存はQueueを保存すればよい</li> 287 <li>オンメモリのファイルに相当する</li>
346 <li>ファイルはQueueなのでファイルのAPIは大きく二つとなる 288 <li>Queueをデバイスにcopyして持続性を実現する</li>
347 <ul> 289 <li>書き込み先はDataGearManagerで選択する</li>
348 <li>Put</li> 290 </ul>
349 <li>Take</li> 291
350 </ul> 292
351 </li> 293
352 </ul> 294 </div>
353 295
354 296 <div class='slide'>
355 297 <!-- _S9SLIDE_ -->
356 </div> 298 <h2 id="putのimplementation">PutのImplementation</h2>
357 299 <ul>
358 <div class='slide'> 300 <li>QueueのElementをnewで作成する</li>
359 <!-- _S9SLIDE_ --> 301 <li>Queueのリンクを構築する</li>
360 <h2 id="queueapi--put-">QueueAPI -Put-</h2> 302 <li>継続nextに跳ぶ
361 <ul> 303 <pre><code>__code putSingleLinkedQueue(struct SingleLinkedQueue* queue, union Data* data, __code next(...)) {
362 <li>Put 304 Element* element = new Element();
363 <ul> 305 element-&gt;data = data;
364 <li>Queueに対してファイルレコードを入力する</li> 306 element-&gt;next = NULL;
365 <li>ファイルの変更をレコードとして書き込む 307 queue-&gt;last-&gt;next = element;
366 <pre><code>__code putSingleLinkedQueue(struct SingleLinkedQueue* queue, union Data* data, __code next(...)) { 308 queue-&gt;last = element;
367 Element* element = new Element(); 309 goto next(...);
368 element-&gt;data = data;
369 element-&gt;next = NULL;
370 queue-&gt;last-&gt;next = element;
371 queue-&gt;last = element;
372 goto next(...);
373 } 310 }
374 </code></pre> 311 </code></pre>
375 </li> 312 </li>
376 </ul> 313 </ul>
377 </li> 314
378 </ul> 315
379 316
380 317 </div>
381 318
382 </div> 319 <div class='slide'>
383 320 <!-- _S9SLIDE_ -->
384 <div class='slide'> 321 <h2 id="takeのimplementation">TakeのImplementation</h2>
385 <!-- _S9SLIDE_ --> 322 <ul>
386 <h2 id="queueapi--take-">QueueAPI -Take-</h2> 323 <li>QueueからElement経由でDataGearを取り出す</li>
387 <ul> 324 <li>Queueのリンクを修正し、nextでデータを引き渡す</li>
388 <li>Take 325 <li>Elementには任意の型のDataGearが格納されている
389 <ul> 326 <pre><code>__code takeSingleLinkedQueue(struct SingleLinkedQueue* queue, __code next(union Data* data, ...)) {
390 <li>Queueからファイルレコードを取り出す</li> 327 printf("take\n");
391 <li>Queue内のレコードをループで全て取り出せば良い 328 struct Element* top = queue-&gt;top;
392 <pre><code>__code takeSingleLinkedQueue(struct SingleLinkedQueue* queue, __code next(union Data* data, ...)) { 329 struct Element* nextElement = top-&gt;next;
393 printf("take\n"); 330 if (queue-&gt;top == queue-&gt;last) {
394 struct Element* top = queue-&gt;top; 331 data = NULL;
395 struct Element* nextElement = top-&gt;next; 332 } else {
396 if (queue-&gt;top == queue-&gt;last) { 333 queue-&gt;top = nextElement;
397 data = NULL; 334 data = nextElement-&gt;data;
398 } else { 335 }
399 queue-&gt;top = nextElement; 336 goto next(data, ...);
400 data = nextElement-&gt;data;
401 }
402 goto next(data, ...);
403 } 337 }
404 </code></pre> 338 </code></pre>
405 </li> 339 </li>
406 </ul>
407 </li>
408 </ul>
409
410
411
412 </div>
413
414 <div class='slide'>
415 <!-- _S9SLIDE_ -->
416 <h2 id="ファイル通信の構成">ファイル通信の構成</h2>
417 <ul>
418 <li>GearsOSのファイルは大域的に解放された資源としたい
419 <ul>
420 <li>ファイル自信を通信そのものとして実装する</li>
421 <li>Streamに対しsocket接続により遠隔にアクセスする</li>
422 </ul>
423 </li>
424 <li>分散フレームワークChristieのDataGearManagerの仕組みを利用する</li>
425 </ul> 340 </ul>
426 341
427 342
428 343
429 </div> 344 </div>
430 345
431 <div class='slide'> 346 <div class='slide'>
432 <!-- _S9SLIDE_ --> 347 <!-- _S9SLIDE_ -->
433 <h2 id="datagearmanager">DataGearManager</h2> 348 <h2 id="datagearmanager">DataGearManager</h2>
434 <ul> 349 <ul>
435 <li>分散フレームワークChristieの仕組みの一つ</li> 350 <li>Take/Put/PeekはDataGearManagerに対して行う</li>
436 <li>keyとvalueの組み合わせとなるDataGearを保持するデータプール</li> 351 <li>メモリ上のQueueはLocalDGMになる</li>
437 <li>ChristieではCodeGearManagerと呼ばれるノードがCodeGearとDataGearを管理する</li> 352 <li>RemoteDGMは他のノードやプロセスあるいはストレージデバイスをあらわす</li>
438 <li>LocalDGMはノード本体に対応するデータプールである 353 <li>一つのDataGearManager上に複数のQueueがあり、keyで識別する</li>
439 <ul> 354 <li>RemoteDGMに書き込むと相手のLocalDGMに書き込まれる</li>
440 <li>CodeGearはLocalDGMに対してDataGearを参照する</li> 355 <li>Take/Peekは書き込みを待ち合わせる</li>
441 </ul> 356 <li>複数のTakeを待ち合わせることができる</li>
442 </li>
443 <li>RemoteDGMは接続する相手ノードに対応するデータプールproxyである
444 <ul>
445 <li>RemoteDGMに対してDataGearを書き込むことで、対応するノードのLocalDGMにデータが書き込まれる</li>
446 </ul>
447 </li>
448 </ul> 357 </ul>
449 358
450 359
451 360
452 </div> 361 </div>
454 <div class='slide'> 363 <div class='slide'>
455 <!-- _S9SLIDE_ --> 364 <!-- _S9SLIDE_ -->
456 <h2 id="datagearmanagerによる通信構成">DataGearManagerによる通信構成</h2> 365 <h2 id="datagearmanagerによる通信構成">DataGearManagerによる通信構成</h2>
457 <ul> 366 <ul>
458 <li>任意の相手のRemoteDGMを作成することでTopologyが形成される</li> 367 <li>任意の相手のRemoteDGMを作成することでTopologyが形成される</li>
368 <li>手元のRemoteDGMに書き込むと相手のLocalDGMに書き込まれる</li>
369 <li>RemoteDGMはproxyとして動作する</li>
370 <li>この構成は分散フレームワークChristie(当研究室作成)と同じ</li>
459 </ul> 371 </ul>
460 <div style="text-align: center;"> 372 <div style="text-align: center;">
461  <img src="images/Remote_DataGearManager.pdf" alt="RemoteDGMの関係図" width="800" /> 373  <img src="images/Remote_DataGearManager.pdf" alt="RemoteDGMの関係図" width="800" />
462 </div> 374 </div>
463 375
465 377
466 </div> 378 </div>
467 379
468 <div class='slide'> 380 <div class='slide'>
469 <!-- _S9SLIDE_ --> 381 <!-- _S9SLIDE_ -->
470 <h2 id="gearsos上のsocket通信">GearsOS上のsocket通信</h2> 382 <h2 id="socket通信によるremotedgmの実装">socket通信によるRemoteDGMの実装</h2>
471 <ul> 383 <ul>
472 <li>GearsOS上のsocket通信を実装したい</li> 384 <li>GearsOSはUnix上の言語フレームワークとして実装されている</li>
473 <li>Queueをsocketに接続し、簡易的なAPIの記述をした 385 <li>Unixのsocket通信を使ってQueueのputを実装する</li>
474 <ul>
475 <li>Localなqueueに対してRemoteのqueueがソケット接続を行う
476 <pre><code>typedef struct CQueue&lt;&gt;{
477 union Data* cQueue;
478 union Data* data;
479
480 __code whenEmpty(...);
481 __code whenEOF(...);
482 __code clear(Impl* cQueue, __code next(...));
483 __code put(Impl* cQueue, union Data* data, __code next(...));
484 __code take(Impl* cQueue, __code next(union Data* data, ...));
485 __code isEmpty(Impl* cQueue, __code next(...), __code whenEmpty(...));
486 __code getData(Impl* cQueue, __code next(...), __code whenEOF(...));
487 __code next(...);
488 } CQueue;
489 </code></pre>
490 </li>
491 </ul>
492 </li>
493 </ul>
494
495
496
497 </div>
498
499 <div class='slide'>
500 <!-- _S9SLIDE_ -->
501 <h2 id="senddata-codegear">sendData CodeGear</h2>
502 <ul>
503 <li>proxy側はQueueにputされたDataをsocketで送信する</li> 386 <li>proxy側はQueueにputされたDataをsocketで送信する</li>
504 <li>送信されたDataはLocal側でgetDataAPIで取り出される 387 <li>送信されたDataはLocal側でgetDataAPIで取り出される</li>
388 <li>send/recvはUnixのAPI
505 <pre><code>__code sendDataRemoteDGMQueue(struct RemoteDGMQueue* cQueue, union Data* data, __code next(...), __code whenError(...)){ 389 <pre><code>__code sendDataRemoteDGMQueue(struct RemoteDGMQueue* cQueue, union Data* data, __code next(...), __code whenError(...)){
506 char recv_buf; 390 char recv_buf;
507 int send_size, recv_size; 391 int send_size, recv_size;
508 392
509 send_size = send(cQueue-&gt;socket, data, sizeof(union Data), 0); 393 send_size = send(cQueue-&gt;socket, data, sizeof(union Data), 0);
519 403
520 </div> 404 </div>
521 405
522 <div class='slide'> 406 <div class='slide'>
523 <!-- _S9SLIDE_ --> 407 <!-- _S9SLIDE_ -->
524 <h2 id="getdata-codegear">getData CodeGear</h2> 408 <h2 id="受信側の実装">受信側の実装</h2>
525 <ul> 409 <ul>
526 <li>ファイル本体(Local側)はsocketからDataを取り出す</li> 410 <li>ファイル本体(Local側)はsocketからDataを取り出す</li>
527 <li>取り出されたデータはQueueにputされる 411 <li>取り出されたデータはQueueにputされる
528 <pre><code>__code getDataLocalDGMQueue(struct LocalDGMQueue* cQueue, __code next(...), __code whenError(...)){ 412 <pre><code>__code getDataLocalDGMQueue(struct LocalDGMQueue* cQueue, __code next(...), __code whenError(...)){
529 int recv_size, send_size; 413 int recv_size, send_size;
548 <!-- _S9SLIDE_ --> 432 <!-- _S9SLIDE_ -->
549 <h2 id="複数のストリームから構成されるファイル">複数のストリームから構成されるファイル</h2> 433 <h2 id="複数のストリームから構成されるファイル">複数のストリームから構成されるファイル</h2>
550 <ul> 434 <ul>
551 <li>入力されるデータに応じた個別のstreamを備えたい 435 <li>入力されるデータに応じた個別のstreamを備えたい
552 <ul> 436 <ul>
553 <li>streamと入力されたデータの処理を直接結びつけたい</li> 437 <li>例えばUSBは複数のチャネルを持つ</li>
554 </ul> 438 <li>メタデータの取り出しは別streamになる</li>
555 </li> 439 <li>通信として使う場合に複数のプロトコルがある方が良い(FTP)</li>
556 <li>最低でもInput/OutputStreamの二つが必要となる</li> 440 </ul>
557 <li>ファイルは複数のStreamを持ったリストとして実装する</li> 441 </li>
558 <li>Streamはkey nameを持ち、keyでアクセスを行う</li> 442 <li>Streamはkey nameを持ち、keyでアクセスを行う</li>
559 </ul> 443 <li>赤黒木を用いる</li>
560
561
562
563 </div>
564
565 <div class='slide'>
566 <!-- _S9SLIDE_ -->
567 <h2 id="複数のストリームを持つファイルの設計">複数のストリームを持つファイルの設計</h2>
568 <ul>
569 <li>Queueのリストとして赤黒木を用いる
570 <ul>
571 <li>key/value storeなアクセスを行うことができる</li>
572 <li>GearsOS上にすでに実装が行われている</li>
573 </ul>
574 </li>
575 <li>DataのTake/Put時には必ずkey nameの指定が必要となる</li> 444 <li>DataのTake/Put時には必ずkey nameの指定が必要となる</li>
576 </ul> 445 </ul>
577 446
578 447
579 448
580 </div> 449 </div>
581 450
582 <div class='slide'> 451 <div class='slide'>
583 <!-- _S9SLIDE_ --> 452 <!-- _S9SLIDE_ -->
584 <h2 id="リスト単位の通信の構成">リスト単位の通信の構成</h2> 453 <h2 id="socketを使ったremotedgm">socketを使ったRemoteDGM</h2>
585 <ul> 454 <ul>
586 <li>指定したkeyのQueueが探索で返される</li> 455 <li>RemoteDGMに書き込みが行われるとsocketで通信が起きる</li>
587 <li>proxyの場合、どのkeyに対してどんなDataを書き込んだかを通信で送信する</li> 456 <li>受信側はLocalDGMにDataGearを書き込む</li>
588 </ul> 457 </ul>
589 <div style="text-align: center;"> 458 <div style="text-align: center;">
590  <img src="images/socketCom.pdf" alt="socketを通じたレコード送信" width="800" /> 459  <img src="images/socketCom.pdf" alt="socketを通じたレコード送信" width="800" />
591 </div> 460 </div>
592 461
594 463
595 </div> 464 </div>
596 465
597 <div class='slide'> 466 <div class='slide'>
598 <!-- _S9SLIDE_ --> 467 <!-- _S9SLIDE_ -->
599 <h2 id="wordcount例題による通信apiの構築">wordCount例題による通信APIの構築</h2> 468 <h2 id="wordcountの例題">wordCountの例題</h2>
600 <ul> 469 <ul>
601 <li>DataGearManagerによるファイル通信APIはWordCount例題を目指して設計した 470 <li>ファイル内の文字列を1行づつ受け取り、文字列,行数をカウントする例題</li>
602 <ul>
603 <li>ファイル内の文字列を1行づつ受け取り、文字列,行数をカウントする例題</li>
604 </ul>
605 </li>
606 <li>文字列送信側とCount側を別ノード上で行うことで、ファイルの呼び出しと通信処理が構成できる</li> 471 <li>文字列送信側とCount側を別ノード上で行うことで、ファイルの呼び出しと通信処理が構成できる</li>
472 <li>RemoteDGMへの書き込みで通信する</li>
473 <li>acknowredgeを逆方向のRemoteDGMによる通信で実現する(現在は直接送信)</li>
607 </ul> 474 </ul>
608 <div style="text-align: center;"> 475 <div style="text-align: center;">
609  <img src="images/slideGearsWC.pdf" alt="リモートDGMによるWordCount" width="800" /> 476  <img src="images/slideGearsWC.pdf" alt="リモートDGMによるWordCount" width="800" />
610 </div> 477 </div>
611 478
684 <ul> 551 <ul>
685 <li>keyアクセスが行えるQueueのリスト</li> 552 <li>keyアクセスが行えるQueueのリスト</li>
686 <li>リスト単位での通信の記述</li> 553 <li>リスト単位での通信の記述</li>
687 </ul> 554 </ul>
688 </li> 555 </li>
689 </ul>
690
691
692
693 </div>
694
695 <div class='slide'>
696 <!-- _S9SLIDE_ -->
697 <h2 id="gearsosの生成形の問題点">GearsOSの生成形の問題点</h2>
698 <ul>
699 <li>GearsOSのメタレベルの処理の記述はトランスコンパイラにより行われる</li>
700 <li>場合によりメタレベルの記述を行わなくてはならない
701 <ul>
702 <li>他のInterfaceを継承したオブジェクトからのDataGear継承
703 <ul>
704 <li>例)Queueからのデータ取り出し</li>
705 <li>トランスコンパイラはどのInterfaceに記述されたDataGearを参照するべきか判断が難しい</li>
706 </ul>
707 </li>
708 </ul>
709 </li>
710 </ul>
711
712 <pre><code>__code Task2(TQueue* localDGMQueue){
713 goto localDGMQueue-&gt;take(Task3);
714 }
715
716 __code Task3(TQueue* localDGMQueue, FileString* string){
717 printf("take[%s] [num:%d]\n", string-&gt;str, string-&gt;size);
718 goto getData();
719 }
720
721 //プログラマが実装したいstub
722 __code Task3_stub(struct Context* context){
723 TQueue* localDGMQueue = (struct TQueue*)Gearef(context, TQueue)-&gt;tQueue;
724 FileString* string = Gearef(context, TQueue)-&gt;data;
725 goto Task3(context, localDGMQueue, string);
726 }
727
728 //自動生成されたErrorなstub
729 __code Task3_stub(struct Context* context) {
730 TQueue* localDGMQueue = Gearef(context, TQueue);
731 FileString* string = Gearef(context, FileString);
732 goto Task3(context, localDGMQueue, string);
733 }
734 </code></pre>
735
736
737
738 </div>
739
740 <div class='slide'>
741 <!-- _S9SLIDE_ -->
742 <h2 id="並列処理構文par-gotoが持つ問題">並列処理構文par gotoが持つ問題</h2>
743 <ul>
744 <li>par gotoとはGearsOSに実装された並列処理構文である</li>
745 <li>StreamQueueに対するput/takeの並列処理の実装をpar goto構文で試みた</li>
746 <li>par gotoはトランスコンパイラへの依存性が高い
747 <ul>
748 <li>stubCodeGearのように任意な書き換えが行えない</li>
749 </ul>
750 </li>
751 <li>特定のCodeGearの宣言のみでしか正常な処理が生成されない
752 <ul>
753 <li>Interfaceに記述されたAPICodeGearではバグが生じる</li>
754 <li>par gotoでの使用を前提としたCodeGearを書かなくてはならない</li>
755 </ul>
756 </li>
757 <li>処理が重いという問題点も存在する</li>
758 </ul> 556 </ul>
759 557
760 558
761 559
762 </div> 560 </div>
819 617
820 </div> 618 </div>
821 619
822 <div class='slide'> 620 <div class='slide'>
823 <!-- _S9SLIDE_ --> 621 <!-- _S9SLIDE_ -->
824 <h2 id="この先保留">この先保留</h2> 622 <h2 id="gearsosの生成形の問題点">GearsOSの生成形の問題点</h2>
825 623 <ul>
826 624 <li>GearsOSのメタレベルの処理の記述はトランスコンパイラにより行われる</li>
827 625 <li>場合によりメタレベルの記述を行わなくてはならない
828 </div> 626 <ul>
829 627 <li>他のInterfaceを継承したオブジェクトからのDataGear継承
830 <div class='slide'> 628 <ul>
831 <!-- _S9SLIDE_ --> 629 <li>例)Queueからのデータ取り出し</li>
832 <h2 id="gearsosのディレクトリとバックアップ">GearsOSのディレクトリとバックアップ</h2> 630 <li>トランスコンパイラはどのInterfaceに記述されたDataGearを参照するべきか判断が難しい</li>
833 <ul> 631 </ul>
834 <li>又吉雄斗による並行研究にて、inodeによるファイルシステムが開発されている</li> 632 </li>
835 <li>赤黒木の非破壊な編集により、ディレクトリの履歴を残すことができる</li> 633 </ul>
836 </ul> 634 </li>
837 <div style="text-align: center;"> 635 </ul>
838  <img src="images/nonDestroyTreeEdit.pdf" alt="非破壊的なツリー編集" width="800" /> 636
839 </div> 637 <pre><code>__code Task2(TQueue* localDGMQueue){
840 638 goto localDGMQueue-&gt;take(Task3);
841 639 }
842 640
843 </div> 641 __code Task3(TQueue* localDGMQueue, FileString* string){
844 642 printf("take[%s] [num:%d]\n", string-&gt;str, string-&gt;size);
845 <div class='slide'> 643 goto getData();
846 <!-- _S9SLIDE_ --> 644 }
847 <h2 id="ファイルqueueに対するapi--peek-">ファイルQueueに対するAPI -Peek-</h2> 645
848 <ul> 646 //プログラマが実装したいstub
849 <li>Peek 647 __code Task3_stub(struct Context* context){
850 <ul> 648 TQueue* localDGMQueue = (struct TQueue*)Gearef(context, TQueue)-&gt;tQueue;
851 <li>QueueのElementを参照するが、削除は行わない</li> 649 FileString* string = Gearef(context, TQueue)-&gt;data;
852 <li>現時点での実装は行っていない</li> 650 goto Task3(context, localDGMQueue, string);
853 <li>QueueのTopのレコードを変更せずに出力すれば良い 651 }
854 &lt;!–</li> 652
855 </ul> 653 //自動生成されたErrorなstub
856 </li> 654 __code Task3_stub(struct Context* context) {
857 <li>RocalDGMを立ち上げるにはDataSegmentクラスが提供する、connectメソッドを用い、接続したいポートのipアドレスとport番号、そして任意のManager名を指定することで立ち上げる。 655 TQueue* localDGMQueue = Gearef(context, TQueue);
858 –&gt;</li> 656 FileString* string = Gearef(context, FileString);
657 goto Task3(context, localDGMQueue, string);
658 }
659 </code></pre>
660
661
662
663 </div>
664
665 <div class='slide'>
666 <!-- _S9SLIDE_ -->
667 <h2 id="並列処理構文par-gotoが持つ問題">並列処理構文par gotoが持つ問題</h2>
668 <ul>
669 <li>par gotoとはGearsOSに実装された並列処理構文である</li>
670 <li>StreamQueueに対するput/takeの並列処理の実装をpar goto構文で試みた</li>
671 <li>par gotoはトランスコンパイラへの依存性が高い
672 <ul>
673 <li>stubCodeGearのように任意な書き換えが行えない</li>
674 </ul>
675 </li>
676 <li>特定のCodeGearの宣言のみでしか正常な処理が生成されない
677 <ul>
678 <li>Interfaceに記述されたAPICodeGearではバグが生じる</li>
679 <li>par gotoでの使用を前提としたCodeGearを書かなくてはならない</li>
680 </ul>
681 </li>
682 <li>処理が重いという問題点も存在する</li>
683 </ul>
684
685
686
687 </div>
688
689 <div class='slide'>
690 <!-- _S9SLIDE_ -->
691 <h2 id="以下返答用">以下返答用</h2>
692
693
694
695 </div>
696
697 <div class='slide'>
698 <!-- _S9SLIDE_ -->
699 <h2 id="takeputpeek-1">Take/Put/Peek</h2>
700 <ul>
701 <li>PeekはReadOnly (最新の設定を読みこむなど)</li>
702 <li>Take/PutはDGが一つならUpDataに相当する</li>
703 <li>書き込みが単一スレッドなら順序は保証される</li>
704 <li>書き込みが複数の場合、Putの順序は保証されない</li>
705 <li>データベースとの違い
706 <ul>
707 <li>putがQueueとして蓄積される</li>
708 <li>Keyが一つしかない(通信路として使える)</li>
709 </ul>
710 </li>
711 </ul>
712
713
714
715 </div>
716
717 <div class='slide'>
718 <!-- _S9SLIDE_ -->
719 <h2 id="__code-nextint-ret-の意味">__code next(int ret, …)の意味</h2>
720 <ul>
721 <li>軽量継続を表す</li>
722 <li>nextは引数として渡されたCodeGear</li>
723 <li>int ret は返す値</li>
724 <li>…は軽量継続の呼び出された時の値渡しのInterface</li>
725 <li>一段の呼び出しStackのような役割になる</li>
726 </ul>
727
728
729
730 </div>
731
732 <div class='slide'>
733 <!-- _S9SLIDE_ -->
734 <h2 id="codegearと再帰呼び出し">CodeGearと再帰呼び出し</h2>
735 <ul>
736 <li>再起呼び出ししなければ関数呼び出し的に使える(末尾再起)</li>
737 <li>再帰呼び出ししたい場合、明示的に自分でStackを作る</li>
738 <li>…はContextにすべて置かれている</li>
739 <li>Processはすべて異なるContextを持っている</li>
740 <li>Context自体は共有されない</li>
741 </ul>
742
743
744
745 </div>
746
747 <div class='slide'>
748 <!-- _S9SLIDE_ -->
749 <h2 id="datagearの型">DataGearの型</h2>
750 <ul>
751 <li>union Data は一つのプロセス(Context)で使われるすべてのDataGearのUnion</li>
752 <li>メタ部分に型に対応する番号を持っている</li>
753 <li>番号を使って型を識別することができる</li>
754 <li>任意の型を格納できるQueueやStackを作成することが可能</li>
755 <li>メタレベルではunion Dataを使ってDataGearの詳細に立ち入らず処理できる</li>
756 </ul>
757
758
759
760 </div>
761
762 <div class='slide'>
763 <!-- _S9SLIDE_ -->
764 <h2 id="remotedgmとacknowledge">RemoteDGMとacknowledge</h2>
765 <ul>
766 <li>Take/Put/Peekのコマンドは TCP上でacknowledgeを使って通信されている</li>
767 <li>これとは別に自分と相手のCodeGearどうしのacknowledgeが必要</li>
768 <li>RemoteDataGearManager経由でacknowledgeを返すのが正しい</li>
769 <li>しかし、acknowledgeが重複してしまう</li>
770 <li>メタプログラミングを利用してこの重複を消すことは可能
771 <ul>
772 <li>しかし煩雑</li>
773 </ul>
774 </li>
859 </ul> 775 </ul>
860 776
861 </div> 777 </div>
862 778
863 779