changeset 20:fc397777a7e2

fix
author Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
date Mon, 15 Feb 2016 23:53:19 +0900
parents 1d151a4d03f6
children 9c757d566f02
files paper/chapter4.tex paper/master_paper.pdf
diffstat 2 files changed, 38 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/paper/chapter4.tex	Mon Feb 15 22:49:13 2016 +0900
+++ b/paper/chapter4.tex	Mon Feb 15 23:53:19 2016 +0900
@@ -3,10 +3,9 @@
 
 Gears OS のための構文のサポートには python スクリプトを用いた. 記述したプログラムをこのスクリプトに読み込ませることで CbC コンパイラでコンパイル可能な構文へと変換される. このようにすることで meta code segment, data segment を用いるGears OS のコードのコンパイルが可能になる.
 
-\section{meta Code Segment の接続}
-Gears OS では code segment 間の遷移に meta レベルの meta code segment を挟む. その様子を表したのが図 \ref{fig:metaCS} である. 通常レベルの code segment は一度 meta code segment へと継続し, その後次の code segment へと継続する. このとき通常レベルの code segment からは meta code segment への継続は見えず, 通常レベルの code segment に直接継続しているように見えるべきである (リスト \ref{hideMeta}). しかし既存の CbC コンパイラでは meta code segment への継続等は自分で記述する必要がある(リスト \ref{GearsCode}). これをリスト \ref{hideMeta} の形に変換するのが今回作成した python スクリプトである.
+\section{meta code segment}
+Gears OS では code segment 間の遷移に meta レベルの meta code segment を挟む. その様子を表したのが図 \ref{fig:metaCS} である. 通常レベルの code segment は一度 meta code segment へと継続し, その後次の code segment へと継続する. meta code segment は meta computation を行う code segment で, メモリの確保やネットワーク管理等が meta computation にあたる. code segment にはこれらの処理を書かず, meta code segment に必要に応じて記述する. 通常レベルの code segment からは meta code segment への継続は見えず, 通常レベルの code segment に直接継続しているように見えるべきである (リスト \ref{hideMeta}). しかし既存の CbC コンパイラでは meta code segment への継続等は自分で記述する必要がある(リスト \ref{GearsCode}). これをリスト \ref{hideMeta} の形に変換するのが今回作成した python スクリプトである. この CbC のコードでは, 並列実行時の資源のロック部分を meta code segment で行っている.
 
-もう一つの機能として stub の自動生成がある. Gears OS では code segment は meta code segment に継続し, その後 code segment に継続すると述べたが, 正確には meta code segment から code segment に継続する際に stub という継続を挟む. stub では, code segment が必要とする data segment を context から取り出すという処理を行うもので, リスト \ref{GearsCode}, code1\_stub, code2\_stub がそれにあたる. stub は code segment 毎に生成されるためこの自動生成を行うことで code segment の記述量を約半分にすることができる. 
 
 \begin{figure}[htpb]
  \begin{center}
@@ -16,44 +15,53 @@
  \label{fig:metaCS}
 \end{figure}
 
-\begin{lstlisting}[frame=lrbt,label=GearsCode,caption={スクリプトにより出力される Gears OS コード}]
-__code meta(struct Context* context, enum Code next) {
-  goto (context->code[next])(context);
+\begin{lstlisting}[frame=lrbt,label=hideMeta,caption={Gears OS での meta computation 例}]
+__code meta_sender(struct Context* context, struct Queue* queue, enum Code next) {
+    // lock
+    pthread_mutex_lock(&queue->mutex);
+    goto (context->code[next])(context);
 }
 
-__code code1_stub(struct Context* context) {
-  goto code1(context, &context->data[Allocate]->allocate);
+__code sender(struct Context* context, struct Queue* queue) {
+    goto put(queue);
 }
 
-__code code1(struct Context* context, struct Allocate* allocate) {
-  allocate->size = sizeof(long);
-  allocator(context);
-  goto meta(context, Code2);
-}
+__code code4(long* count, struct Allocate* allocate, struct Element* element) {
+    allocate->after_put = Code3;
+    element->value = (*count)++;
+    goto sender();
+\end{lstlisting}
 
-__code code2(struct Context* context, long* count) {
-  *count = 0;
-  goto meta(context, Code3);
+\begin{lstlisting}[frame=lrbt,label=GearsCode,caption={スクリプトにより出力される Gears OS コード}]
+__code meta_sender(struct Context* context, struct Queue* queue, enum Code next) {
+    // lock
+    pthread_mutex_lock(&queue->mutex);
+    goto (context->code[next])(context);
 }
 
-__code code2_stub(struct Context* context) {
-  goto code2(context, &context->data[Count]->count);
+__code sender(struct Context* context, struct Queue* queue) {
+    goto meta_sender(context, queue, Put);
 }
-\end{lstlisting}
 
-\begin{lstlisting}[frame=lrbt,label=hideMeta,caption={Gears OS のコード}]
-__code meta(struct Context* context, enum Code next) {
-  goto (context->code[next])(context);
+__code sender_stub(struct Context* context) {
+    goto sender(context, &context->data[Queue]->queue);
 }
 
-__code code1(struct Allocate* allocate) {
-  allocate->size = sizeof(long);
-  allocator();
-  goto code2();
+__code code4(struct Context* context, long* count, struct Allocate* allocate, struct Element* element) {
+    allocate->after_put = Code3;
+    element->value = (*count)++;
+    goto meta(context, Sender);
 }
 
-__code code2(long* count) {
-  *count = 0;
-  goto code3();
-}
 \end{lstlisting}
+
+
+\section{stub code segment}
+
+python スクリプトのもう一つの機能として stub code segment の自動生成がある. Gears OS では code segment は meta code segment に継続し, その後 code segment に継続すると述べたが, 正確には meta code segment から code segment に継続する際に stub code segmentを挟む. stub code segmentでは, code segment が必要とする data segment を context から取り出すという処理を行うもので, リスト \ref{GearsCode}, code1\_stub, code2\_stub がそれにあたる. 
+stub code segment は次の継続先のコードセグメントの引数をみて, 取り出す data segment を選択している. 
+stub code segment は code segment 毎に生成されるためこの自動生成を行うことで code segment の記述量を約半分にすることができる. 
+
+stub code segment, meta code segment への自動継続は Gears OS のサポートとして設計された機能であるが, CbC の拡張機能であるといえるため, Gears OS の記述のためでなくとも利用することが出来る.
+この機能により, CbC は code segment のみでなく data segment を単位として用いることが可能になった. meta code segment, meta data segment により meta computation を通常の code segment 内に記述せずにすむ. code segment 間に実行される meta code segment で継続先を変更する, エラーハンドリングを行うといった使い方ができるようになるだろう.
+
Binary file paper/master_paper.pdf has changed