changeset 2:21b64e37e36d default tip

add
author mir3636
date Sat, 01 Dec 2018 18:57:18 +0900
parents 431ee6c8128f
children
files Paper/paper_info.txt Paper/pic/MetaGear.graffle Paper/pic/MetaGear.pdf Paper/pic/metaCS.pdf Paper/pic/twice.pdf Paper/pic/verification.graffle Paper/pic/verification.pdf Paper/pic/vsgo.pdf Paper/prosin.xmind Paper/prosym.bib Paper/src/atomicImpl.cbc Paper/src/atomicInterface.h Paper/src/go.go Paper/src/parGotoCreateTask.c Paper/src/parGotoCreateTask.cbc Paper/src/stackimpl.cbc Paper/src/synchronizedQueue.h Paper/src/varargnext.cbc
diffstat 18 files changed, 206 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/paper_info.txt	Sat Dec 01 18:57:18 2018 +0900
@@ -0,0 +1,42 @@
+論文タイトル:継続を中心とした言語 Gears OS のデモンストレーション
+
+キーワード:OS, programming language, CbC, Gears OS
+
+著者名: 
+
+宮城 光希
+河野 真治
+
+
+著者名英語:
+
+Mitsuki Miyagi
+Shinji Kono
+
+著者所属:
+
+琉球大学大学院理工学研究科情報工学科専攻
+
+琉球大学工学部工学科知能情報コース
+
+著者所属英語:
+
+Information Engineering Course Graduate School of Enginnering and Science University of the Ryukyus.
+
+Faculty of Information Engineering University of the Ryukyus.
+
+論文抄録:
+
+現代の OS では拡張性と信頼性を両立させることが要求されている。
+信頼性をノーマルレベルの計算に対して保証し、拡張性をメタレベルの計算で実現することを目標に Gears OS を設計中である。
+Gears OS は Continuation based C(CbC) によってアプリケーションと OS そのものを記述する。
+CbC はこの Code Gear と Data Gear の単位でプログラムを記述する。
+システムやアプリケーションを記述するためにCode Gear と Data Gear を柔軟に再利用する必要がある。
+このときに機能を接続するAPIと実装の分離が可能であることが望ましい。
+Gears OS の信頼性を保証するために、形式化されたモジュールシステムを提供する必要がある。
+本論文では、Interface を用いたモジュールシステムの説明とその応用としての並列 API について考察する。
+並列API は継続を基本とした関数型プログラミングと両立する必要がある。
+ここでは、CbC の goto 文を拡張したpar goto 文を導入する。
+par goto 文を用いることによって Gears OS は並列処理を行う。
+また、本研究ではハードウェア上でメタレベルの処理、および並列実行を可能とするために、raspberry pi 上での Gears OS の実装についての考察を行う。
+
Binary file Paper/pic/MetaGear.graffle has changed
Binary file Paper/pic/MetaGear.pdf has changed
Binary file Paper/pic/metaCS.pdf has changed
Binary file Paper/pic/twice.pdf has changed
Binary file Paper/pic/verification.graffle has changed
Binary file Paper/pic/verification.pdf has changed
Binary file Paper/pic/vsgo.pdf has changed
Binary file Paper/prosin.xmind has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/prosym.bib	Sat Dec 01 18:57:18 2018 +0900
@@ -0,0 +1,48 @@
+@article{
+    gears,
+    author = "河野 真治 and 伊波 立樹 and  東恩納 琢偉",
+    title = "Code Gear、Data Gear に基づく OS のプロトタイプ",
+    journal = "情報処理学会システムソフトウェアとオペレーティング・システム研究会(OS)",
+    month = "May",
+    year = 2016
+}
+
+@article{
+    cbc,
+    author = "Kaito TOKKMORI and Shinji KONO",
+    title = "Implementing Continuation based language in LLVM and Clang",
+    journal = "LOLA 2015",
+    month = "July",
+    year = 2015
+}
+
+@manual{gcc,
+author = "{GNU Compiler Collection (GCC) Internals}",
+title ="{http://gcc.gnu.org/onlinedocs/gccint/}",
+}
+
+@InProceedings{llvm,
+author    = {Chris Lattner and Vikram Adve},
+title     = "{LLVM: A Compilation Framework for Lifelong Program Analysis \& Transformation}",
+booktitle = "{Proceedings of the 2004 International Symposium on Code Generation and Optimization (CGO'04)}",
+address   = {Palo Alto, California},
+month     = {Mar},
+year      = {2004}
+} 
+
+@misc{xv6rpi,
+author    = {Zhiyi Huang},
+title     = "{xv6\_rpi\_port}",
+howpublished      = "{https://github.com/zhiyihuang/xv6\_rpi\_port}",
+year      = {2013}
+}
+
+@manual{arm,
+author     = "{ARM Architecture Reference Manual}",
+title    = "{http://infocenter.arm.com/help/topic/com.arm.\\doc.subset.architecture.reference/index.html}"
+}
+
+@misc{rpi,
+author     = "{Raspberry Pi — Teach, Learn, and Make with Raspberry Pi}",
+title    = {https://www.raspberrypi.org}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/atomicImpl.cbc	Sat Dec 01 18:57:18 2018 +0900
@@ -0,0 +1,6 @@
+__code checkAndSetAtomicReference(struct AtomicReference* atomic, union Data** ptr, union Data* oldData, union Data* newData, __code next(...), __code fail(...)) {
+    if (__sync_bool_compare_and_swap(ptr, oldData, newData)) {
+        goto next(...);
+    }
+    goto fail(...);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/atomicInterface.h	Sat Dec 01 18:57:18 2018 +0900
@@ -0,0 +1,9 @@
+typedef struct Atomic<Impl>{
+    union Data* atomic;
+    union Data** ptr;
+    union Data* oldData;
+    union Data* newData;
+    __code checkAndSet(Impl* atomic, union Data** ptr, union Data* oldData, union Data* newData, __code next(...), __code fail(...));
+    __code next(...);
+    __code fail(...);
+} Atomic;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/go.go	Sat Dec 01 18:57:18 2018 +0900
@@ -0,0 +1,19 @@
+func main() {
+    c := make(chan []int)
+    for i :=0; i < *split; i++ {
+        // call goroutine
+        go twice(list, prefix, i, c);
+    }
+
+    for i :=0; i < *split; i++ {
+        // join twice routins
+        <- c
+    }
+}
+
+func twice(list []int, prefix int, index int, c chan []int) {
+    for i := 0; i < prefix; i++ {
+        list[prefix*index+i] = list[prefix*index+i] * 2;
+    }
+    c <- list
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/parGotoCreateTask.c	Sat Dec 01 18:57:18 2018 +0900
@@ -0,0 +1,31 @@
+__code code1(struct Context *context,struct Integer* integer1, struct Integer* integer2, struct Integer* output) {
+    struct Element* element;
+                    context->task = NEW(struct Context);
+                    initContext(context->task);
+                    context->task->next = C_add;
+                    context->task->idgCount = 2;
+                    context->task->idg = context->task->dataNum;
+                    context->task->maxIdg = context->task->idg + 2;
+                    context->task->odg = context->task->maxIdg;
+                    context->task->maxOdg = context->task->odg + 1;
+    GET_META(integer1)->wait = createSynchronizedQueue(context);
+    GET_META(integer2)->wait = createSynchronizedQueue(context);
+    GET_META(output)->wait = createSynchronizedQueue(context);
+    context->task->data[context->task->idg+0] = (union Data*)integer1;
+    context->task->data[context->task->idg+1] = (union Data*)integer2;
+    context->task->data[context->task->odg+0] = (union Data*)output;
+                    element = &ALLOCATE(context, Element)->Element;
+                    element->data = (union Data*)context->task;
+                    element->next = context->taskList;
+                    context->taskList = element;
+    Gearef(context, TaskManager)->taskList = context->taskList;
+    Gearef(context, TaskManager)->next1 = C_code2;
+    goto meta(context, C_code2);
+}
+
+__code code1_stub(struct Context* context) {
+    Integer* integer1 = Gearef(context, Integer);
+    Integer* integer2 = Gearef(context, Integer);
+    Integer* output = Gearef(context, Integer);
+    goto code1(context, integer1, integer2, output);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/parGotoCreateTask.cbc	Sat Dec 01 18:57:18 2018 +0900
@@ -0,0 +1,4 @@
+__code code1(struct Integer* integer1, struct Integer* integer2, struct Integer* output) {
+    par goto add(integer1, integer2, output, __exit);
+    goto code2();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/stackimpl.cbc	Sat Dec 01 18:57:18 2018 +0900
@@ -0,0 +1,27 @@
+Stack* createSingleLinkedStack(struct Context* context) {
+    struct Stack* stack = new Stack();
+    struct SingleLinkedStack* singleLinkedStack = new SingleLinkedStack();
+    stack->stack = (union Data*)singleLinkedStack;
+    singleLinkedStack->top = NULL;
+    stack->push = C_pushSingleLinkedStack;
+    stack->pop  = C_popSingleLinkedStack;
+    stack->pop2  = C_pop2SingleLinkedStack;
+    stack->get  = C_getSingleLinkedStack;
+    stack->get2  = C_get2SingleLinkedStack;
+    stack->isEmpty = C_isEmptySingleLinkedStack;
+    stack->clear = C_clearSingleLinkedStack;
+    return stack;
+}
+
+__code clearSingleLinkedStack(struct SingleLinkedStack* stack,__code next(...)) {
+    stack->top = NULL;
+    goto next(...);
+}
+
+__code pushSingleLinkedStack(struct SingleLinkedStack* stack,union Data* data, __code next(...)) {
+    Element* element = new Element();
+    element->next = stack->top;
+    element->data = data;
+    stack->top = element;
+    goto next(...);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/synchronizedQueue.h	Sat Dec 01 18:57:18 2018 +0900
@@ -0,0 +1,11 @@
+struct SynchronizedQueue {
+    struct Element* top;
+    struct Element* last;
+    struct Atomic* atomic;
+};
+
+// Singly Linked List element
+struct Element {
+    union Data* top;
+    struct Element* next;
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/varargnext.cbc	Sat Dec 01 18:57:18 2018 +0900
@@ -0,0 +1,9 @@
+__code popSingleLinkedStack(struct SingleLinkedStack* stack, __code next(union Data* data, ...)) {
+    if (stack->top) {
+        data = stack->top->data;
+        stack->top = stack->top->next;
+    } else {
+        data = NULL;
+    }
+    goto next(data, ...);
+}