Mercurial > hg > Papers > 2022 > ikki-master
changeset 3:e655f81a0c76
add about meta-level programing
author | ichikitakahiro <e165713@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 11 Jan 2022 00:39:04 +0900 |
parents | a2da5ed4a3b3 |
children | e950b7aaeeaa |
files | Paper/.DS_Store Paper/chapter/3-GearsOS.tex Paper/chapter/4-Christie.tex Paper/master_paper.pdf Paper/src/SynchronizedQueue.c |
diffstat | 5 files changed, 107 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/Paper/chapter/3-GearsOS.tex Sat Jan 08 11:59:24 2022 +0900 +++ b/Paper/chapter/3-GearsOS.tex Tue Jan 11 00:39:04 2022 +0900 @@ -124,3 +124,34 @@ これらのContextは特に、GearsOSに実装されているpar gotoと呼ばれる並列処理用の構文の内部構成などのメタレベルのプログラミングの際に強く意識されている。 GearsOSではKernelContextが複数のUser ContextとCPU Contextを管理し、 ノーマルレベルのプログラムに応じてWorkerに対してTaskを割り振ることで分散処理の機構が実現されている。 + +\section{トランスコンパイル後のCbCプログラム} +先にも述べたように、GearsOS上で記述するプログラムは拡張子が.cbcとなるcbcファイルへ記述を行う。 +しかし、実際の動作ファイルはcbcをPerlスクリプトによりトランスコンパイルによりstubCodeGearなどのメタレベルの処理やマクロの書き換えが追加された、 +拡張子.cファイルとなる。 +ソースコード\ref{src:SynchronizedQueue.c}にSynchronizedQueue.cbc(ソースコード\ref{src:SynchronizedQueue.cbc})をトランスコンパイルした結果出力された +SyncheonizedQueue.cの一部である。 + +cbcからのc言語へのトランスコンパイルはノーマルレベルと分離したいメタレベルの記述が追加、もしくは置き換えが行われる。 +GearsOSプログラミングではユーザープログラマは出力後の.cファイルについて、つまりメタレベルに対して意識する必要がなくなるのが理想である。 +しかし、開発者側はトランスコンパイラの新たなシンタックスの導入やデバッグ、メタレベルの処理の置き換えなどメタ部分の処理の知識を持つべきである。 +また、現状のトランスコンパイラは意図しないバグを持っている可能性があるため、通常のユーザプログラムのデバッグなどの際にも.cファイルを確認する機会がある。 + +ソースコード\ref{src:SynchronizedQueue.c}中の53行目から58行目までのputSynchronizedQueue\texttt{\_}stubは、cbcファイルに記述されたputSynchronizedQueueの +stubCodeGearである。 +stubCodeGearは元のCodeGear名 + \texttt{\_}stubで宣言される。 +stubCodeGearはinputDataGearとしてContextを要求する。 +54行目ではGearImplマクロを用いてInterfaceの実装型のポインタをContextから呼び出す。 +55, 56行目に記述されているGearefマクロはcontextのInterface内で宣言されているDataGearを参照するマクロである。 +55行目の場合、QueueInterface内で宣言されているDataGearであるdataを呼び出している。 +56行目では共用体で取り扱われているnextCodeGearを呼び出す。 +CodeGear本体に必要なinputDataGearをimplで呼び出してから本体のCodeGearへ遷移する。 + +本体のCodeGearでは、ノーマルレベルでの操作を禁止したいContextに対する操作が追記される。 +gotoによる遷移の直前では、遷移先のCodeGearに対して出力するDataGearをContextに対して書き戻すための処理が行われる。 +34行目から39行目などに見られるように、ContextのDataGearの保存場所に対する書き込みの際にもGearefマクロが使われる。 +GearefコマンドはGearef(Context名、Interface名)\texttt{->}DataGear名で指定される。 +また、GearsOS独自のnew演算子はContextのDataGearの保存場所に対してメモリ確保を行うマクロであるALLOCATEに書き換えられる。 + + +\lstinputlisting[label=src:SynchronizedQueue.c, caption=SynchronizedQueue.c]{src/SynchronizedQueue.c}
--- a/Paper/chapter/4-Christie.tex Sat Jan 08 11:59:24 2022 +0900 +++ b/Paper/chapter/4-Christie.tex Tue Jan 11 00:39:04 2022 +0900 @@ -0,0 +1,18 @@ +\chapter{分散フレームワークChristie} +分散フレームワークChristieは当研究室が開発するJava言語で記述された分散フレームワークである。 +Christieは将来的にGearsOSに組み込むことが考えられており、CbCと似てはいるが異なった別のGearという概念が存在している。 +また、分散処理を行う複数のノード接続を任意の形のTopologyに自動で形成してくれる機能である、TopologyManagearが存在する。 +Christieではノード同士の接続を煩雑な記述を行うことなく、TopologyManagerに一任することで簡潔な記述で分散処理が行える。 + + +\section{gear概念} +Christieのgearは四種類存在する。 + +\begin{quote} + \begin{itemize} + \item CodeGear(以下CG) + \item DataGear(以下DG) + \item CodeGearManager(以下CGM) + \item DataGearManager(以下DGM) + \end{itemize} +\end{quote}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Paper/src/SynchronizedQueue.c Tue Jan 11 00:39:04 2022 +0900 @@ -0,0 +1,58 @@ +#include "../context.h" +// include "Queue.h" +// include "Atomic.h" + +#include <stdio.h> + +Queue* createSynchronizedQueue(struct Context* context) { + struct Queue* queue = &ALLOCATE(context, Queue)->Queue; + struct SynchronizedQueue* synchronizedQueue = &ALLOCATE(context, SynchronizedQueue)->SynchronizedQueue; + synchronizedQueue->top = &ALLOCATE(context, Element)->Element; // allocate a free node + synchronizedQueue->top->next = NULL; + synchronizedQueue->last = synchronizedQueue->top; + synchronizedQueue->atomic = createAtomicReference(context); // not used + queue->queue = (union Data*)synchronizedQueue; + queue->take = C_takeSynchronizedQueue; + queue->put = C_putSynchronizedQueue; + queue->isEmpty = C_isEmptySynchronizedQueue; + queue->clear = C_clearSynchronizedQueue; + return queue; +} + + +__code putSynchronizedQueue(struct Context *context,struct SynchronizedQueue* queue, union Data* data, enum Code next) { + Element* element = &ALLOCATE(context, Element)->Element; + element->data = data; + element->next = NULL; + Element* last = queue->last; + Element* nextElement = last->next; + if (last != queue->last) { + goto meta(context, C_putSynchronizedQueue); + } + if (nextElement == NULL) { + struct Atomic* atomic = queue->atomic; + Gearef(context, Atomic)->atomic = (union Data*) atomic; + Gearef(context, Atomic)->ptr = (union Data**) &last->next; + Gearef(context, Atomic)->oldData = (union Data*) nextElement; + Gearef(context, Atomic)->newData = (union Data*) element; + Gearef(context, Atomic)->next = next; + Gearef(context, Atomic)->fail = C_putSynchronizedQueue; + goto meta(context, atomic->checkAndSet); + } else { + struct Atomic* atomic = queue->atomic; + Gearef(context, Atomic)->atomic = (union Data*) atomic; + Gearef(context, Atomic)->ptr = (union Data**) &queue->last; + Gearef(context, Atomic)->oldData = (union Data*) last; + Gearef(context, Atomic)->newData = (union Data*) nextElement; + Gearef(context, Atomic)->next = C_putSynchronizedQueue; + Gearef(context, Atomic)->fail = C_putSynchronizedQueue; + goto meta(context, atomic->checkAndSet); + } +} + +__code putSynchronizedQueue_stub(struct Context* context) { + SynchronizedQueue* queue = (SynchronizedQueue*)GearImpl(context, Queue, queue); + Data* data = Gearef(context, Queue)->data; + enum Code next = Gearef(context, Queue)->next; + goto putSynchronizedQueue(context, queue, data, next); +}