Mercurial > hg > Members > innparusu > slides
view 2016/2016_10_25/slide.md @ 20:3d6b9e5ae730
Update
author | Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 25 Oct 2016 19:50:03 +0900 |
parents | |
children |
line wrap: on
line source
title: Gears OS author: Tatsuki IHA profile: lang: Japanese code-engine: coderay ## 研究目的 - 当研究室では 処理の単位を Code Gear、 データの単位を Data Gear を用いて 信頼性が高い並列処理を行う Gears OS を開発している - Gears OS では Task を Code Gear と実行するときに必要な Input Data Gear と出力するための Output Data Gear の組で表現される。 Input Data Gear/Output Data Gear によって依存関係が決定し、それにそって並列実行を行う - 現在の Gears では Stack や Queue の operatation の API が存在しなため, 記述が困難になっている. そのため, この研究では Gears OS における API の記述方法を設計し, 実装する ## 今週 - rb_tree をとりあえず error はとりました - 動いてない - Jenkins の update をしました 2.17 -> 2.26 - yum で jenkins を入れてたので yum update jenkins で update できました ## StackInterface - ``struct Stack`` は 実際の Stack の実装(StackSelf)と push, pop, isEmpty を設定 ``` c struct Stack { union StackSelf* stack; union Data* data; enum Code push; enum Code pop; enum Code isEmpty; enum Code next; } stack; union StackSelf { struct SingleLinkedStack { struct Stack i; struct Element* top; } singleLinekedStack; struct ArrayStack { int size; int limit; struct Element* array; } arrayStack; }; ``` ## push continuation - push を継続する際は ``stack->data`` を入れて ``stack->push`` を呼び出す ``` c __code put(struct Context* context, struct Stack* nodeStack, struct Tree* tree, struct Node* node, struct Traverse* traverse, struct Node* root, struct Node* newNode) { .... traverse->current = root; // traverse->result = traverse->compare(traverse->current, node); traverse->result = compare(traverse->current, node); *traverse->newNode = *traverse->current; nodeStack->data = (union Data*)newNode; // set push data nodeStack->next = Replace1; goto meta(context, nodeStack->push); // goto traverse->nodeStack->push(newNode, replaceNode1, traverse, node); } ``` ## compare function - compare は コメントに沿って node 2つを取って, return する形にしました ``` c void compare(struct Context* context, struct Traverse* traverse, int key1, int key2) { if (key1 == key2) { traverse->result = EQ; } else if (key1 < key2) { traverse->result = GT; } else { traverse->result = LT; } } ``` ``` c enum Relational compare(struct Node* node1, struct Node* node2) { int key1 = node1->key; int key2 = node2->key; if (key1 == key2) { return EQ; } else if (key1 < key2) { return GT; } else { return LT; } } ``` ## pop operation - まだ例の部分を書いてない - `stack->data` に pop した値を入れる感じになりそう ``` c __code popSingleLinkedStack(struct Context* context, struct SingleLinkedStack* stack, union Data* data, enum Code next) { data = stack->top->data; stack->top = stack->top->next; goto meta(context, next); } __code popSingleLinkedStack_stub(struct Context* context) { goto popSingleLinkedStack(context, &context->data[Stack]->stack.stack, context->data[Stack]->stack.data, context->data[Stack]->stack.next); } ``` ## わかってない - Stack 等の初期化をどこでやるか? - 今のところ initContext に書いている - でも create~~stack はあるから多分これを呼ぶ ``` c __code createSingleLinkedStack(struct Context* context, enum Code next) { struct SingleLinkedStack* stack = allocate(context, SignleLinkedStack); stack->top = NULL; stack->i.push = PushSingleLinkedStack; stack->i.pop = PopsingleLinkedStack; stack->i.isEmpty = _; goto meta(context, next); } ```