comparison slide/thesis.pdf.html @ 19:9e6fd2255ee1

tweak slide
author ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
date Mon, 07 Feb 2022 20:58:17 +0900
parents b0fde43e331b
children 55a0fd236f78
comparison
equal deleted inserted replaced
18:b0fde43e331b 19:9e6fd2255ee1
76 76
77 <!-- _S9SLIDE_ --> 77 <!-- _S9SLIDE_ -->
78 <h2 id="gearsosとその現状">GearsOSとその現状</h2> 78 <h2 id="gearsosとその現状">GearsOSとその現状</h2>
79 <ul> 79 <ul>
80 <li>信頼性の保証と拡張性の高さを目指したOSプロジェクト</li> 80 <li>信頼性の保証と拡張性の高さを目指したOSプロジェクト</li>
81 <li>軽量継続を用いた言語、CbC(Continuation based C)により記述される。</li> 81 <li>軽量継続を用いた言語、CbC(Continuation based C)により記述される</li>
82 <li>ノーマルレベルとメタレベルを分離して記述する</li> 82 <li>ノーマルレベルとメタレベルを分離して記述する</li>
83 <li>現状では言語フレームワークとしてのみ機能する</li> 83 <li>現状では言語フレームワークとしてのみ機能する</li>
84 <li>OSとして動作するには多くの機能の開発が必要 84 <li>OSとして動作するには多くの機能の開発が必要
85 <ul> 85 <ul>
86 <li>その中の一つにファイルシステムが挙げられる</li> 86 <li>その中の一つにファイルシステムが挙げられる</li>
218 </ul> 218 </ul>
219 </li> 219 </li>
220 <li>Implement 220 <li>Implement
221 <ul> 221 <ul>
222 <li>Interfaceの実装</li> 222 <li>Interfaceの実装</li>
223 </ul> 223 <li>プログラム内で共通して利用したい変数</li>
224 </li>
225 <li>Context
226 <ul>
227 <li>プログラムに使われるCodeGear/DataGearを全て管理する</li>
228 <li>CodeGear/DataGearの格納場所でもある</li>
229 <li>軽量継続中、必ず持ち歩かれる</li>
230 <li>メタレベルなCodeGearからのみ参照される</li>
231 </ul> 224 </ul>
232 </li> 225 </li>
233 </ul> 226 </ul>
234 227
235 <pre><code>typedef struct Queue&lt;&gt;{ 228 <pre><code>typedef struct Queue&lt;&gt;{
256 </div> 249 </div>
257 250
258 <div class='slide'> 251 <div class='slide'>
259 <!-- _S9SLIDE_ --> 252 <!-- _S9SLIDE_ -->
260 <h2 id="contextとgearの関係性">ContextとGearの関係性</h2> 253 <h2 id="contextとgearの関係性">ContextとGearの関係性</h2>
261 <div style="text-align: center;"> 254 <ul>
262  <img src="images/Context_ref.pdf" alt="Contextの参照" width="800" /> 255 <li>Context
256 <ul>
257 <li>遷移の際にデータを全て記録するオブジェクト</li>
258 <li>プログラムに使われるCodeGear/DataGearを管理する</li>
259 <li>軽量継続中、必ず引数で参照される</li>
260 <li>メタレベルなCodeGearからのみ参照される</li>
261 </ul>
262 </li>
263 </ul>
264 <div style="text-align: center;">
265  <img src="images/Context_ref.pdf" alt="Contextの参照" width="900" />
263 </div> 266 </div>
264 267
265 268
266 269
267 </div> 270 </div>
273 <li>CbCプログラムはトランスコンパイルによりC言語プログラムに書き換えられる 276 <li>CbCプログラムはトランスコンパイルによりC言語プログラムに書き換えられる
274 <ul> 277 <ul>
275 <li>トランスコンパイルの際に、メタレベルの記述が行われる 278 <li>トランスコンパイルの際に、メタレベルの記述が行われる
276 <ul> 279 <ul>
277 <li>StubCodeGearの自動生成</li> 280 <li>StubCodeGearの自動生成</li>
278 <li>Gears向けに記述された演算子(par goto ,NEW)の書き換え</li> 281 <li>Gears向けに記述された演算子(par goto、NEW)の書き換え</li>
279 </ul> 282 </ul>
280 </li> 283 </li>
281 </ul> 284 </ul>
282 </li> 285 </li>
283 <li>StubCodeGearはCbCプログラムへ直に記述することでユーザーの任意の処理に変えられる 286 <li>StubCodeGearはCbCプログラムへ直に記述することでユーザーの任意の処理に変えられる
303 <div class='slide'> 306 <div class='slide'>
304 <!-- _S9SLIDE_ --> 307 <!-- _S9SLIDE_ -->
305 <h2 id="分散フレームワークchristie">分散フレームワークChristie</h2> 308 <h2 id="分散フレームワークchristie">分散フレームワークChristie</h2>
306 <ul> 309 <ul>
307 <li>Java言語で記述された分散フレームワーク</li> 310 <li>Java言語で記述された分散フレームワーク</li>
308 <li>CbCと似てはいるが異なったGearというプログラム概念がある</li> 311 <li>CbCとは異なったGearというプログラム概念がある</li>
309 <li>特定のkeyに対する変数データ書き込みにより通信を行う</li> 312 <li>特定のkeyに対する変数データ書き込みにより通信を行う</li>
310 <li>自律分散の実現を目指して開発された</li> 313 <li>自律分散の実現を目指して開発された</li>
311 <li>通信ノードの接続を行うTopologyManagerという機能を持つ</li> 314 <li>TopologyManagerという機能を持つ</li>
312 </ul> 315 </ul>
313 316
314 317
315 318
316 </div> 319 </div>
320 <h2 id="christieのgear">ChristieのGear</h2> 323 <h2 id="christieのgear">ChristieのGear</h2>
321 <ul> 324 <ul>
322 <li>CodeGear 325 <li>CodeGear
323 <ul> 326 <ul>
324 <li>スレッドに相当する</li> 327 <li>スレッドに相当する</li>
325 <li>処理開始前に任意のDataGearを待ち合わせ、揃ったら処理が実行される</li> 328 <li>任意のkey nameを持つDataGearを待ち合わせ、揃ったら処理が実行される</li>
326 </ul> 329 </ul>
327 </li> 330 </li>
328 <li>DataGear 331 <li>DataGear
329 <ul> 332 <ul>
330 <li>変数データに相当する</li> 333 <li>変数データに相当する</li>
331 <li>型を所持している</li> 334 <li>key nameと変数データのペアで管理される</li>
332 <li>アノテーションによりデータの参照後の処理が変化する
333 <ul>
334 <li>Take : 参照されたDataGearは削除される</li>
335 <li>Peek : 参照されてもDataGearは削除されない</li>
336 </ul>
337 </li>
338 </ul> 335 </ul>
339 </li> 336 </li>
340 <li>CodeGearManger 337 <li>CodeGearManger
341 <ul> 338 <ul>
342 <li>ノードに相当する</li> 339 <li>ノードに相当する</li>
343 <li>DataGearManagerを所持し、それによりCodeGearとDataGearを管理する</li> 340 <li>DataGearManagerを所持し、CodeGearとDataGearを管理する</li>
344 </ul> 341 </ul>
345 </li> 342 </li>
346 <li>DataGearManager 343 <li>DataGearManager
347 <ul> 344 <ul>
348 <li>データプールに相当する</li> 345 <li>データプールに相当する</li>
349 <li>DataGearのkeyとデータの組み合わせを保持している</li> 346 <li>DataGearとkeyの組み合わせを保持している</li>
350 <li>LocalとRemoteの二種類が存在する</li> 347 <li>LocalDGMとRemoteDGMの二種類が存在する</li>
351 </ul> 348 </ul>
352 </li> 349 </li>
353 </ul> 350 </ul>
354 351
355 352
362 <ul> 359 <ul>
363 <li>ChristieではDataGearの送受信によりノードどうしの通信を行う</li> 360 <li>ChristieではDataGearの送受信によりノードどうしの通信を行う</li>
364 <li>LocalDataGearManager (LocalDGM) 361 <li>LocalDataGearManager (LocalDGM)
365 <ul> 362 <ul>
366 <li>CodeGearManagerが持つ、自身のDataGearPool</li> 363 <li>CodeGearManagerが持つ、自身のDataGearPool</li>
367 <li>CodeGear中のDataGearは普段これを参照する</li> 364 <li>DataGearの大半はこれを参照する</li>
368 </ul> 365 </ul>
369 </li> 366 </li>
370 <li>RemoteDataGearManager (RemoteDGM) 367 <li>RemoteDataGearManager (RemoteDGM)
371 <ul> 368 <ul>
372 <li>他のCodeGearManagerが持つLocalDGMに対応するploxy</li> 369 <li>他のCodeGearManagerが持つLocalDGMに対応するploxy</li>
373 <li>RemoteDGMに書き込みを行うと、対応したCodeGearManagerが持つLocalDGMに書き込みが行われる</li> 370 <li>書き込みを行うと、対応したCodeGearManagerが持つLocalDGMに書き込みがされる</li>
374 </ul> 371 </ul>
375 </li> 372 </li>
376 <li>DataGearManagerによる通信がChristieの通信の要となっている</li> 373 <li>DataGearManagerによる通信がChristieの通信の要となっている</li>
377 </ul> 374 </ul>
378 <div style="text-align: center;"> 375 <div style="text-align: center;">
391 <ul> 388 <ul>
392 <li>接続 = RemoteDGMを作成する</li> 389 <li>接続 = RemoteDGMを作成する</li>
393 <li>接続されたノードは他のノードを相対的な名前で参照できる(例:Child/parent, right/leftなど)</li> 390 <li>接続されたノードは他のノードを相対的な名前で参照できる(例:Child/parent, right/leftなど)</li>
394 </ul> 391 </ul>
395 </li> 392 </li>
396 <li>TopologyManagerに煩雑な通信接続を任せることができる</li> 393 </ul>
397 </ul> 394
398 <div style="text-align: center;"> 395 <div style="text-align: center;">
399  <img src="images/TopologyManager.pdf" alt="TopologyManager" width="800" /> 396  <img src="images/TopologyManager.pdf" alt="TopologyManager" width="800" />
400 </div> 397 </div>
401 398
402 399
403 400
404 </div> 401 </div>
405 402
406 <div class='slide'> 403 <div class='slide'>
407 <!-- _S9SLIDE_ --> 404 <!-- _S9SLIDE_ -->
408 <h2 id="gearsfilesystemの目指す仕様">GearsFileSystemの目指す仕様</h2> 405 <h2 id="gearsfilesystemの方針">GearsFileSystemの方針</h2>
409 <ul> 406 <ul>
410 <li>データベース的なレコード操作によるファイルアクセス 407 <li>データベース的なレコード操作によるファイルアクセス
411 <ul> 408 <ul>
412 <li>KeyValueStoreに対する書き込み</li> 409 <li>KeyValueStoreに対する書き込み</li>
413 </ul> 410 </ul>
414 </li> 411 </li>
415 <li>ファイルのバックアップの 412 <li>ファイルのバックアップ
416 <ul> 413 <ul>
417 <li>ディレクトリの非破壊的編集とファイルの構成方法</li> 414 <li>ディレクトリの非破壊的編集とファイルの構成方法</li>
418 </ul> 415 </ul>
419 </li> 416 </li>
420 <li>ファイルの型の認識 417 <li>ファイルの型の認識
421 <ul> 418 <ul>
422 <li>ファイルレコードの構造体の型により認識する</li> 419 <li>ファイルレコードを適切な形の構造体にする</li>
423 </ul> 420 </ul>
424 </li> 421 </li>
425 <li>自律分散を目指した分散ファイルシステム 422 <li>自律分散を目指した分散ファイルシステム
426 <ul> 423 <ul>
427 <li>プロトコルを用いないChristieAPI</li> 424 <li>プロトコルを用いないChristieAPI</li>
433 430
434 </div> 431 </div>
435 432
436 <div class='slide'> 433 <div class='slide'>
437 <!-- _S9SLIDE_ --> 434 <!-- _S9SLIDE_ -->
438 <h2 id="gearsfsのファイル構造13">GearsFSのファイル構造1/3</h2> 435 <h2 id="gearsfsのファイル構造14">GearsFSのファイル構造1/4</h2>
439 <ul> 436 <ul>
440 <li>ファイルのデータは任意の型を持ったレコードとして断続的に分割された状態で保存される 437 <li>ファイルのデータ単位は任意の型を持ったレコード
441 <ul> 438 <ul>
442 <li>レコードはQueueに保存される</li> 439 <li>断続的に分割された状態で保存される</li>
443 <li>ファイルはレコードが先頭から順に読むことで構成される</li> 440 <li>Queueに保存される</li>
441 <li>レコードを先頭から順に読むことでファイルを構成する</li>
444 </ul> 442 </ul>
445 </li> 443 </li>
446 <li>ファイルレコードは構造体で再現される 444 <li>ファイルレコードは構造体で再現される
447 <ul> 445 <ul>
448 <li>ファイルレコード構造体はGearsDataGearとして利用できる</li> 446 <li>ファイルレコード構造体はGearsのDataGearとして利用できる</li>
449 <li>レコードの構造体によりOSはファイルの型を認識する 447 <li>レコードの構造体によりOSはファイルの型を認識する
450 <ul> 448 <ul>
451 <li>ファイルの特性に合わせ、レコードとその構成方法を適した形で構成できる</li> 449 <li>ファイルの特性に合わせ、レコードとその構成方法を適した形で構成できる</li>
452 </ul> 450 </ul>
453 </li> 451 </li>
463 461
464 </div> 462 </div>
465 463
466 <div class='slide'> 464 <div class='slide'>
467 <!-- _S9SLIDE_ --> 465 <!-- _S9SLIDE_ -->
468 <h2 id="gearsfsのファイル構造23">GearsFSのファイル構造2/3</h2> 466 <h2 id="gearsfsのファイル構造24">GearsFSのファイル構造2/4</h2>
469 <ul> 467 <ul>
470 <li>GearsOSのファイルはChristieのDataGearManagerの仕組みを用いる</li>
471 <li>ファイルの読み込み/書き込みはStreamを通して行われる 468 <li>ファイルの読み込み/書き込みはStreamを通して行われる
472 <ul> 469 <ul>
473 <li>streamも同様にQueueで構成される</li> 470 <li>streamも同様にQueueで構成される</li>
474 <li>streamはそれぞれ特定のkey nameをもち、keyを用いることでアクセスが行われる</li> 471 <li>streamはそれぞれ特定のkey nameをもつ</li>
475 </ul> 472 <li>keyを用いることでアクセスが行われる</li>
476 </li> 473 </ul>
477 <li>最低でも、Input/OutputのStreamとファイルデータを保持するmainなQueueの三つで構成される</li> 474 </li>
475 <li>最低で、Input/OutputのStreamとファイルデータを保持するmainなQueueの三つで構成される</li>
478 <li>Write : InputStreamに対してレコードをputすれば良い</li> 476 <li>Write : InputStreamに対してレコードをputすれば良い</li>
479 <li>Read : OutputStreamからレコードを全てtakeすれば良い</li> 477 <li>Read : OutputStreamからレコードを全てtakeすれば良い</li>
480 <li>GearsOSのファイルは大域的な資源として複数のプロセスより競合的なアクセスが行われる 478 </ul>
481 <ul> 479
480 <div style="text-align: center;">
481  <img src="images/GearsFile.pdf" alt="streamによるファイルアクセス" width="800" />
482 </div>
483
484
485
486 </div>
487
488 <div class='slide'>
489 <!-- _S9SLIDE_ -->
490 <h2 id="gearsfsのファイル構造34">GearsFSのファイル構造3/4</h2>
491 <ul>
492 <li>ChristieのDataGearManagerに相当する</li>
493 <li>GearsOSのファイルは大域的な資源である
494 <ul>
495 <li>複数のプロセスより競合的なアクセスが行われる</li>
482 <li>OutputStreamは複数のアクセスが行われても整合性が保たれる必要がある</li> 496 <li>OutputStreamは複数のアクセスが行われても整合性が保たれる必要がある</li>
483 <li>CAS(Compare And Swap)が採用されたSynchronizedQueueを用いる</li> 497 <li>CAS(Compare And Swap)が採用されたSynchronizedQueueを用いる</li>
484 </ul> 498 </ul>
485 </li> 499 </li>
486 </ul> 500 </ul>
487 <div style="text-align: center;"> 501
488  <img src="images/GearsFile.pdf" alt="streamによるファイルアクセス" width="800" /> 502
489 </div> 503
490 504 </div>
491 505
492 506 <div class='slide'>
493 </div> 507 <!-- _S9SLIDE_ -->
494 508 <h2 id="gearsfsのファイル構造44">GearsFSのファイル構造4/4</h2>
495 <div class='slide'>
496 <!-- _S9SLIDE_ -->
497 <h2 id="gearsfsのファイル構造33">GearsFSのファイル構造3/3</h2>
498 <ul> 509 <ul>
499 <li>stream、mainQueueはDataGearに相当し、keyによるアクセスが行われる</li> 510 <li>stream、mainQueueはDataGearに相当し、keyによるアクセスが行われる</li>
500 <li>Queueは赤黒木に保持されており、key nameで検索が行われ参照される</li> 511 <li>Queueは赤黒木に保持される</li>
501 <li>DGMへ書き込みを行うプロセスは入力するデータに加え対象のkey nameを指定する必要がある</li> 512 <li>key nameで探索が行われ参照される</li>
513 <li>DGM書き込みは対象のkey nameを指定する</li>
502 </ul> 514 </ul>
503 <div style="text-align: center;"> 515 <div style="text-align: center;">
504  <img src="images/newGearsFile.pdf" alt="DataGearの保存形式" width="800" /> 516  <img src="images/newGearsFile.pdf" alt="DataGearの保存形式" width="800" />
505 </div> 517 </div>
506 518
510 522
511 <div class='slide'> 523 <div class='slide'>
512 <!-- _S9SLIDE_ --> 524 <!-- _S9SLIDE_ -->
513 <h2 id="遠隔からのファイル操作">遠隔からのファイル操作</h2> 525 <h2 id="遠隔からのファイル操作">遠隔からのファイル操作</h2>
514 <ul> 526 <ul>
515 <li>GearsOSのファイルはファイルであり、通信そのものにも相当する</li> 527 <li>GearsOSのファイルは、ファイル通信そのものにも相当する</li>
516 <li>RemoteDGMの仕組みを用いることで遠隔からのファイル読み込み/書き込みを行う</li> 528 <li>RemoteDGMの仕組みを用いることで遠隔からのファイル読み込み/書き込みを行う</li>
517 <li>readの場合(リモート側に読み込みたいファイルが存在する) 529 </ul>
518 <ul> 530
519 <li>(手順1)ローカル側はLocalDGMの相当する空のファイルを作成し、socketを持つ</li> 531 <div style="text-align: center;">
520 <li>(手順2)リモート側はローカルの空ファイルのploxyを作成する</li> 532  <img src="images/socketCom.pdf" alt="socketを通じたレコード送信" width="800" />
521 <li>(手順3)リモート側はploxyに対してデータをputする</li> 533 </div>
522 </ul> 534
523 </li> 535
524 <li>writeの場合(リモート側に書き込みたいファイルが存在する) 536
525 <ul> 537 </div>
526 <li>(手順1)リモート側はファイルのsocketを持つ</li> 538
527 <li>(手順2)ローカル側はローカルのファイルに接続し、ploxy(RemoteDGM)を作成する</li> 539 <div class='slide'>
528 <li>(手順3)ローカル側はploxyのkeyに対してデータをputする</li> 540 <!-- _S9SLIDE_ -->
529 </ul> 541 <h2 id="socketからの受信データ取り出し">socketからの受信データ取り出し</h2>
530 </li> 542 <ul>
531 </ul> 543 <li>socketはImplementに記述される</li>
532 544 <li>LocalDGMに相当するファイルは、接続先socketから送信されたデータを取り出す</li>
533 545 <li>APIとして記述される</li>
534 546 <li>取り出されたデータは次の継続先でQueueに対してputされる</li>
535 </div> 547 </ul>
536 548
537 <div class='slide'> 549 <pre><code>__code getDataLocalDGMQueue(struct LocalDGMQueue* cQueue, __code next(...), __code whenEOF(...), __code whenError(...)){
538 <!-- _S9SLIDE_ --> 550 union Data* recv_data;
539 <h2 id="遠隔からのファイル変更">遠隔からのファイル変更</h2> 551 recv_size = recv(cQueue-&gt;socket, recv_data, sizeof(union Data), 0);
540 <div style="text-align: center;"> 552 if (recv_size == -1) {
541  <img src="images/socketCom.pdf" alt="socketを通じたレコード送信" width="800" /> 553 printf("recv error\n");
542 </div> 554 goto whenError(...);
555 }
556 FileString* fileString = NEW(FileString);
557 fileString = recv_data;
558 if (fileString-&gt;EoF) == 1) {
559 send_buf = 0;
560 send_size = send(cQueue-&gt;socket, &amp;send_buf, 1, 0);
561 if (send_size == -1) {
562 printf("send error\n");
563 }
564 close(cQueue-&gt;buffer);
565 goto whenEOF(...);
566 } else {
567 send_buf = 1;
568 send_size = send(cQueue-&gt;socket, &amp;send_buf, 1, 0);
569 if (send_size == -1) {
570 printf("send error\n");
571 goto whenError(...);
572 }
573 }
574
575 Gearef(context, cQueue)-&gt;data = recv_data;
576 goto putLocalDGMQueue(recv_data, next);
577 }
578 </code></pre>
579
580
581
582 </div>
583
584 <div class='slide'>
585 <!-- _S9SLIDE_ -->
586 <h2 id="remotedgmのsocketによるデータ送信">RemoteDGMのsocketによるデータ送信</h2>
587 <ul>
588 <li>RemoteDGM側はsocketを用いてデータを送信する</li>
589 <li>Queueに対してputされたデータを送信する</li>
590 <li>putCodeGearの直後に呼び出される
591 <pre><code>__code sendDataRemoteDGMQueue(struct RemoteDGMQueue* cQueue, union Data* data, __code next(...), __code whenError(...)){
592 send_size = send(cQueue-&gt;socket, data, sizeof(union Data), 0);
593 if (send_size == -1) {
594 printf("send error\n");
595 goto whenError();
596 }
597
598 recv_size = recv(cQueue-&gt;socket, &amp;recv_buf, 1, 0);
599 if (recv_size == -1) {
600 printf("recv error\n");
601 goto whenError();
602 }
603 goto next(...);
604 }
605 </code></pre>
606 </li>
607 </ul>
543 608
544 609
545 610
546 </div> 611 </div>
547 612
548 <div class='slide'> 613 <div class='slide'>
549 <!-- _S9SLIDE_ --> 614 <!-- _S9SLIDE_ -->
550 <h2 id="wordcount例題">WordCount例題</h2> 615 <h2 id="wordcount例題">WordCount例題</h2>
551 <ul> 616 <ul>
552 <li>ChristieAPIの構成をWordCount例題を通して行った</li> 617 <li>ChristieAPIの構成をWordCount例題を通して行った</li>
553 <li>ファイルの中を1行ずつ読み取り、ファイル内の文字数、行列を調べる</li> 618 <li>ファイルの中の文字列を1行ずつ読み取り、ファイル内の文字数と行数を調べる</li>
554 <li>ファイルの読み込みと文字列のカウントをそれぞれ別ノード上で行うことで、ファイル読み込みとファイルレコードの通信の必要が生じる</li> 619 <li>ファイルの送信と文字列のカウントをそれぞれ別ノード上で行うことで、ファイル読み込みとファイルレコードの通信処理が構成できる</li>
555 <li>(手順1)ファイル内文字列を1行ずつWordCount関数へ入力する、これをループ</li> 620 </ul>
556 <li>(手順2)ファイル内文字列が無くなった場合(EoF)結果を出力し、終了する</li>
557 </ul>
558
559 <div style="text-align: center;">
560  <img src="images/wordCountStates.pdf" alt="WordCountの遷移図" width="800" />
561 </div>
562 621
563 622
564 623
565 </div> 624 </div>
566 625
582 641
583 </div> 642 </div>
584 643
585 <div class='slide'> 644 <div class='slide'>
586 <!-- _S9SLIDE_ --> 645 <!-- _S9SLIDE_ -->
587 <h2 id="localdgmのsocketの受信データ取り出し">LocalDGMのsocketの受信データ取り出し</h2>
588 <ul>
589 <li>socketはImplementに記述される</li>
590 <li>LocalDGMに相当するファイルは、接続先socketから送信されたデータを取り出す</li>
591 <li>取り出されたデータはInputStreamQueueに対してputされる
592 <pre><code>__code getDataLocalDGMQueue(struct LocalDGMQueue* cQueue, __code next(...), __code whenEOF(...), __code whenError(...)){
593 union Data* recv_data;
594 recv_size = recv(cQueue-&gt;socket, recv_data, sizeof(union Data), 0);
595 if (recv_size == -1) {
596 printf("recv error\n");
597 goto whenError(...);
598 }
599 FileString* fileString = NEW(FileString);
600 fileString = recv_data;
601 if (fileString-&gt;EoF) == 1) {
602 send_buf = 0;
603 send_size = send(cQueue-&gt;socket, &amp;send_buf, 1, 0);
604 if (send_size == -1) {
605 printf("send error\n");
606 }
607 close(cQueue-&gt;buffer);
608 goto whenEOF(...);
609 } else {
610 send_buf = 1;
611 send_size = send(cQueue-&gt;socket, &amp;send_buf, 1, 0);
612 if (send_size == -1) {
613 printf("send error\n");
614 goto whenError(...);
615 }
616 }
617
618 Gearef(context, cQueue)-&gt;data = recv_data;
619 goto putLocalDGMQueue(recv_data, next);
620 }
621 </code></pre>
622 </li>
623 </ul>
624
625
626
627 </div>
628
629 <div class='slide'>
630 <!-- _S9SLIDE_ -->
631 <h2 id="remotedgmのsocketによるデータ送信">RemoteDGMのsocketによるデータ送信</h2>
632 <ul>
633 <li>RemoteDGM側はsocketを用いてデータを送信する</li>
634 <li>Queueに対してputされたデータを送信する
635 <ul>
636 <li>putCodeGearの直後に呼び出される
637 <pre><code>__code sendDataRemoteDGMQueue(struct RemoteDGMQueue* cQueue, union Data* data, __code next(...), __code whenError(...)){
638 send_size = send(cQueue-&gt;socket, data, sizeof(union Data), 0);
639 if (send_size == -1) {
640 printf("send error\n");
641 goto whenError();
642 }
643
644 recv_size = recv(cQueue-&gt;socket, &amp;recv_buf, 1, 0);
645 if (recv_size == -1) {
646 printf("recv error\n");
647 goto whenError();
648 }
649 goto next(...);
650 }
651 </code></pre>
652 </li>
653 </ul>
654 </li>
655 </ul>
656
657
658
659 </div>
660
661 <div class='slide'>
662 <!-- _S9SLIDE_ -->
663 <h2 id="gearsfsのディレクトリ">GearsFSのディレクトリ</h2> 646 <h2 id="gearsfsのディレクトリ">GearsFSのディレクトリ</h2>
664 <ul> 647 <ul>
665 <li>ディレクトリを赤黒木で実装する</li> 648 <li>ディレクトリを赤黒木で実装する</li>
666 <li>赤黒木のノードとしてファイル/ディレクトリが保存される</li> 649 <li>赤黒木のノードとしてファイル/ディレクトリが保存される</li>
667 <li>階層構造はファイル名がkey, データとしてinodeが保存される</li> 650 <li>階層構造はファイル名がkey, データとしてinodeが保存される</li>
712 <h2 id="gearsfsの並列処理">GearsFSの並列処理</h2> 695 <h2 id="gearsfsの並列処理">GearsFSの並列処理</h2>
713 <ul> 696 <ul>
714 <li>par gotoを用いる案 697 <li>par gotoを用いる案
715 <ul> 698 <ul>
716 <li>処理速度が遅い</li> 699 <li>処理速度が遅い</li>
700 <li>トランスコンパイラへの依存度が高い</li>
717 <li>現状バグが存在している</li> 701 <li>現状バグが存在している</li>
718 <li>トランスコンパイラへの依存度が高い</li>
719 </ul> 702 </ul>
720 </li> 703 </li>
721 <li>新しく並列処理を開発する</li> 704 <li>新しく並列処理を開発する</li>
722 </ul> 705 </ul>
723 706
772 755
773 </div> 756 </div>
774 757
775 <div class='slide'> 758 <div class='slide'>
776 <!-- _S9SLIDE_ --> 759 <!-- _S9SLIDE_ -->
777 <h2 id="まとめ">まとめ</h2> 760 <h2 id="結論">結論</h2>
778 <ul> 761 <ul>
779 <li>GearsFileSystemの設計 762 <li>GearsFileSystemの設計
780 <ul> 763 <ul>
781 <li>ファイルの構成方法 764 <li>ファイルの構成方法
782 <ul> 765 <ul>
783 <li>Queueのリストである</li> 766 <li>keyによってアクセスされるQueueのリスト</li>
784 </ul> 767 </ul>
785 </li> 768 </li>
786 <li>ファイル操作API 769 <li>ファイル操作API
787 <ul> 770 <ul>
771 <li>ChristieAPI</li>
788 <li>レコード単位で操作される</li> 772 <li>レコード単位で操作される</li>
789 </ul> 773 </ul>
790 </li> 774 </li>
791 <li>ファイル送受信の実装 775 <li>ファイル送受信の実装
792 <ul> 776 <ul>
793 <li>ファイルploxy</li> 777 <li>RemoteDGM(ファイルploxy)</li>
794 </ul> 778 </ul>
795 </li> 779 </li>
796 <li>ディレクトリの仕組み 780 <li>ディレクトリの仕組み
797 <ul> 781 <ul>
798 <li>赤黒木を用いる</li> 782 <li>赤黒木を用いる</li>
827 struct Element* top; 811 struct Element* top;
828 struct Element* last; 812 struct Element* last;
829 struct Atomic* atomic; 813 struct Atomic* atomic;
830 } SynchronizedQueue; 814 } SynchronizedQueue;
831 </code></pre> 815 </code></pre>
832 816 </li>
817 </ul>
818
819
833 820
834 </div> 821 </div>
835 822
836 <div class='slide'> 823 <div class='slide'>
837 <!-- _S9SLIDE_ --> 824 <!-- _S9SLIDE_ -->
838 <h2 id="研究成果">研究成果</h2> 825 <h2 id="研究成果">研究成果</h2>
839 </li> 826 <ul>
840 <li>連続するレコードで構成されるGearsOSファイルの設計</li> 827 <li>連続するレコードで構成されるGearsOSファイルの設計</li>
841 <li>keyアクセスを用いたファイルに対するRead, writeAPI</li> 828 <li>keyアクセスを用いたファイルに対するRead, writeAPI</li>
842 <li>赤黒木を用いたディレクトリシステムの構築</li> 829 <li>赤黒木を用いたディレクトリシステムの構築</li>
843 <li>ファイルのバックアップ考察</li> 830 <li>ファイルのバックアップ考察</li>
844 <li>ploxyを用いたファイルの送受信</li> 831 <li>ploxyを用いたファイルの送受信</li>
845 </ul> 832 </ul>
846 833
847 <p>## 834
848 &lt;!–</p> 835
849 <ul> 836 </div>
850 <li>RocalDGMを立ち上げるにはDataSegmentクラスが提供する、connectメソッドを用い、接続したいポートのipアドレスとport番号、そして任意のManager名を指定することで立ち上げる。 837
851 –&gt;</li> 838 <div class='slide'>
852 </ul> 839 <!-- _S9SLIDE_ -->
840 <h2 id="api手順">API手順</h2>
841 <ul>
842 <li>readの場合(リモート側に読み込みたいファイルが存在する)
843 <ul>
844 <li>(手順1)ローカル側はLocalDGMの相当する空のファイルを作成し、socketを持つ</li>
845 <li>(手順2)リモート側はローカルの空ファイルのploxyを作成する</li>
846 <li>(手順3)リモート側はploxyに対してデータをputする</li>
847 </ul>
848 </li>
849 <li>writeの場合(リモート側に書き込みたいファイルが存在する)
850 <ul>
851 <li>(手順1)リモート側は対象ファイルにsocketを持たせる</li>
852 <li>(手順2)ローカル側は対象のファイルに対応するploxy(RemoteDGM)を作成する</li>
853 <li>(手順3)ローカル側はploxyのkeyに対してデータをputする</li>
854 </ul>
855 </li>
856 </ul>
857
858
859
860 </div>
861
862 <div class='slide'>
863 <!-- _S9SLIDE_ -->
864 <h2 id="wordcount手順">WordCount手順</h2>
865 <ul>
866 <li>(手順1)ファイル内文字列を1行ずつWordCount関数へ入力する、これをループ</li>
867 <li>(手順2)ファイル内文字列が無くなった場合(EoF)結果を出力し、終了する</li>
868 </ul>
869 <div style="text-align: center;">
870  <img src="images/wordCountStates.pdf" alt="WordCountの遷移図" width="800" />
871 </div>
872
873 <!--
874 - RocalDGMを立ち上げるにはDataSegmentクラスが提供する、connectメソッドを用い、接続したいポートのipアドレスとport番号、そして任意のManager名を指定することで立ち上げる。
875 -->
853 876
854 </div> 877 </div>
855 878
856 879
857 </div><!-- presentation --> 880 </div><!-- presentation -->