Mercurial > hg > Papers > 2022 > ikki-master
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<>{ | 228 <pre><code>typedef struct Queue<>{ |
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->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->EoF) == 1) { | |
559 send_buf = 0; | |
560 send_size = send(cQueue->socket, &send_buf, 1, 0); | |
561 if (send_size == -1) { | |
562 printf("send error\n"); | |
563 } | |
564 close(cQueue->buffer); | |
565 goto whenEOF(...); | |
566 } else { | |
567 send_buf = 1; | |
568 send_size = send(cQueue->socket, &send_buf, 1, 0); | |
569 if (send_size == -1) { | |
570 printf("send error\n"); | |
571 goto whenError(...); | |
572 } | |
573 } | |
574 | |
575 Gearef(context, cQueue)->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->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->socket, &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->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->EoF) == 1) { | |
602 send_buf = 0; | |
603 send_size = send(cQueue->socket, &send_buf, 1, 0); | |
604 if (send_size == -1) { | |
605 printf("send error\n"); | |
606 } | |
607 close(cQueue->buffer); | |
608 goto whenEOF(...); | |
609 } else { | |
610 send_buf = 1; | |
611 send_size = send(cQueue->socket, &send_buf, 1, 0); | |
612 if (send_size == -1) { | |
613 printf("send error\n"); | |
614 goto whenError(...); | |
615 } | |
616 } | |
617 | |
618 Gearef(context, cQueue)->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->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->socket, &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 <!–</p> | 835 |
849 <ul> | 836 </div> |
850 <li>RocalDGMを立ち上げるにはDataSegmentクラスが提供する、connectメソッドを用い、接続したいポートのipアドレスとport番号、そして任意のManager名を指定することで立ち上げる。 | 837 |
851 –></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 --> |