view 2016/2016_10_04/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 によって依存関係が決定し、それにそって並列実行を行う

# 今週やってたこと
- red black Tree の stack_push, pop の取り除き
- コーディングルールを確認

# rbTree
- staskに積まれるnodeを ``traverse->nodeStack`` に格納する
- nodeStack は element なので  next をもつ

```
struct Traverse {
    enum Code next;
    enum Code rotateNext;
    struct Node* current; // reading node of original tree
    struct Node* newNode; // writing node of new tree
    struct Element* nodeStack;
    int result;
} traverse;
```

# rbTree
```
__code replaceNode(struct Context* context, struct Traverse* traverse, struct Node* oldNode, struct Node* newNode, struct Element* element) {
    *newNode = *oldNode;
    element->next = traverse->nodeStack;
    element->data = (union Data* )newNode;
    traverse->nodeStack = element;
    // goto replaceNode1(struct Traverse* traverse, struct Node* node, struct Node* oldNode, struct Node* newNode, +struct Node* newnewNode, int result)
    goto meta(context, Replace1);
}

__code replaceNode_stub(struct Context* context) {
    struct Allocate* allocate = &context->data[Allocate]->allocate;
    allocate->size = sizeof(struct Element);
    allocator(context);
    struct Element* element = &context->data[context->dataNum]->element;
    goto replaceNode(context,
                  &context->data[Traverse]->traverse,
                  context->data[Traverse]->traverse.current,
                  context->data[Traverse]->traverse.newNode,
                  element);
}
```

```
__code replaceNode(struct Context* context, struct Traverse* traverse, struct Node* oldNode, struct Node* newNode, int result) {
    *newNode = *oldNode; 
    stack_push(context->node_stack, &newNode); 
    if (result == EQ) { 
        newNode->value = context->data[Node]->node.value; 
        // go to stack clear 
        stack_pop(context->code_stack, &context->next); 
        goto meta(context, context->next);
    } else if (result == GT) { 
        traverse->current = oldNode->right; 
        newNode->right = context->heap; // allocator(context,struct Node)
    } else { 
        traverse->current = oldNode->left; 
        newNode->left = context->heap; 
    }
    
    allocator(context);
    
    if (traverse->current) { 
        compare(context, traverse, traverse->current->key, context->data[Node]->node.key); 
        goto meta(context, Replace);
    }
    goto meta(context, Insert);
}

__code replaceNode_stub(struct Context* context) {
    goto replaceNode(context,
                     &context->data[Traverse]->traverse,
                     context->data[Traverse]->traverse.current,
                     &context->data[context->dataNum]->node, // new Node
                     context->data[Traverse]->traverse.result);
    
}
```


# いろいろ
- 引数
    - ``__code code1(struct Node* +node)`` みたいに新しく allocate するものは+ を付ける
- stack と queue の api が欲しい
    - Stack interface & Queue interface を用意してそこに operatorの csの番号を持たせる(popとかpushに)
    - データ構造の生成時に interface の cs の番号を送ることで データ構造が持つ型によって実行する CS を変える
    - とりあえず保留にしとこう
- allocate
    - allocate はやっぱり CS であるべきだよね
    - allocate で作ったものをどう参照するか
- DS
    - enum DataType を union Data の要素につける