Mercurial > hg > Papers > 2018 > mitsuki-prosym
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 の実装についての考察を行う。 +
--- /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, ...); +}