Mercurial > hg > Papers > 2019 > mitsuki-master
comparison paper/evaluation.tex @ 52:8be23dffcd3f
update
author | mir3636 |
---|---|
date | Tue, 12 Feb 2019 02:00:52 +0900 |
parents | 3179b8daa958 |
children | cf325c78edc1 |
comparison
equal
deleted
inserted
replaced
51:3179b8daa958 | 52:8be23dffcd3f |
---|---|
5 | 5 |
6 これらの実装についての評価を行う。 | 6 これらの実装についての評価を行う。 |
7 | 7 |
8 \section{Gears OS のモジュール化} | 8 \section{Gears OS のモジュール化} |
9 Gears OS の モジュール化について評価を行う。 | 9 Gears OS の モジュール化について評価を行う。 |
10 Gears OS では、ある Data Gear を Code Gear が扱う場合、 | 10 モジュール化されていない以前の Gears OS ではソースコード \ref{prevgear} 4行目のように、 |
11 Code Gear 直接指定しなければならなかった。 | |
12 Interface を用いた ソースコード \ref{intergear} ではここを stack->push のように抽象化することができる。 | |
13 | |
14 また、Gears OS では、ある Data Gear を Code Gear が扱う場合、 | |
11 Code Gear に対応する Data Gear を Context が持つ Data Gear のリストから取り出す必要があるが、 | 15 Code Gear に対応する Data Gear を Context が持つ Data Gear のリストから取り出す必要があるが、 |
12 Context に 全ての Code Gear と Data Gear | 16 ソースコード \ref{prevgear} 12、13行目のように Context に引数格納用として型ごとに確保された Data Gear を、 |
17 複数の Code Gear で使いまわしてしまう問題があった。 | |
18 これも Interface を用いることで、Interface 用に実装で用いる Data Gear を持てるようになり、 | |
19 ソースコード \ref{intergear} 12、13行目のように使うことができるようになった。 | |
13 | 20 |
14 \begin{lstlisting}[frame=lrbt,label=syscall_list,caption={\footnotesize xv6 のシステムコールのリスト}] | 21 \begin{lstlisting}[frame=lrbt,label=prevgear,caption={\footnotesize Interface を用いない Gears}] |
15 __code cg1 (struct Context* context, struct Element* element) { | 22 __code cg1 (struct Context* context, struct Element* element) { |
16 struct Node* node1 = new Node(); | 23 struct Node* node1 = new Node(); |
17 element->data = (union Data*)node1; | 24 element->data = (union Data*)node1; |
18 goto meta(context, pushSingleLinkedStack) | 25 goto meta(context, pushSingleLinkedStack) |
19 } | 26 } |
23 } | 30 } |
24 | 31 |
25 __code pushSingleLinkedStack_stub(struct Context* context){ | 32 __code pushSingleLinkedStack_stub(struct Context* context){ |
26 SingleLinkedStack* stack = &context->data[SingleLinkedStack]->SingleLinkedStack; | 33 SingleLinkedStack* stack = &context->data[SingleLinkedStack]->SingleLinkedStack; |
27 Element *element = &context->data[Element]->element; | 34 Element *element = &context->data[Element]->element; |
28 goto pushSingleLinkedStack(context, stack, data) | 35 goto pushSingleLinkedStack(context, stack, data); |
29 } | 36 } |
30 | 37 |
31 \end{lstlisting} | 38 \end{lstlisting} |
32 | 39 |
40 \begin{lstlisting}[frame=lrbt,label=intergear,caption={\footnotesize Interface を用いた Gears}] | |
41 __code cg1 (struct Context* context, struct Stack* stack) { | |
42 struct Node* node1 = new Node(); | |
43 goto stack->push((union Data*)node1,cg2); | |
44 } | |
45 | |
46 __code pushSingleLinkedStack(struct Context* context, struct SingleLinkedStack* stack, union Data* data, __code next(...)) { | |
47 ... | |
48 } | |
49 | |
50 __code pushSingleLinkedStack_stub(struct Context* context){ | |
51 SingleLinkedStack* stack = (SingleLinkedStack*)context->data[D_Stack]->Stack.stack->Stack.stack; | |
52 Data* data = &context->data[D_Stack]->Stack->data; | |
53 enum Code next = &context->data[D_Stack]->Stack->next; | |
54 goto pushSingleLinkedStack(context, stack, data, next); | |
55 } | |
56 | |
57 \end{lstlisting} | |
58 | |
59 \section{Meta Gear の自動生成} | |
60 | |
61 | |
62 |