14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 <!DOCTYPE html>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 <html>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 <head>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9 <meta http-equiv="content-type" content="text/html;charset=utf-8">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
10 <title>GearsOSの分散ファイルシステムの設計</title>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
12 <meta name="generator" content="Slide Show (S9) v4.1.0 on Ruby 2.6.8 (2021-07-07) [universal.x86_64-darwin21]">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
13 <meta name="author" content="Takahiro Ikki, Shinji Kono" >
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
14
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
15 <!-- style sheet links -->
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16 <link rel="stylesheet" href="s6/themes/screen.css" media="screen">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
17 <link rel="stylesheet" href="s6/themes/print.css" media="print">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
18 <link rel="stylesheet" href="s6/themes/blank.css" media="screen,projection">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
19
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
20 <!-- JS -->
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
21 <script src="s6/js/jquery-1.11.3.min.js"></script>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
22 <script src="s6/js/jquery.slideshow.js"></script>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
23 <script src="s6/js/jquery.slideshow.counter.js"></script>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24 <script src="s6/js/jquery.slideshow.controls.js"></script>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
25 <script src="s6/js/jquery.slideshow.footer.js"></script>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
26 <script src="s6/js/jquery.slideshow.autoplay.js"></script>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
28 <!-- prettify -->
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
29 <link rel="stylesheet" href="scripts/prettify.css">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
30 <script src="scripts/prettify.js"></script>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
31
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
32 <style>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
33 .slide {page-break-after: always;}
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
34 </style>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
35
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
36
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
37
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
38
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
39 </head>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
40 <body>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
41
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
42 <div class="layout">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
43 <div id="header"></div>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
44 <div id="footer">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
45 <div align="right">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
46 <img src="s6/images/logo.svg" width="200px">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
47 </div>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
48 </div>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
49 </div>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
50
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
51 <div class="presentation">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
52
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
53 <div class='slide cover'>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
54 <table width="90%" height="90%" border="0" align="center">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
55 <tr>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
56 <td>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
57 <div align="center">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
58 <h1><font color="#808db5">GearsOSの分散ファイルシステムの設計</font></h1>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
59 </div>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
60 </td>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
61 </tr>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
62 <tr>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
63 <td>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
64 <div align="left">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
65 Takahiro Ikki, Shinji Kono
|
28
|
66 琉球大学理工学研究科情報工学専攻
|
14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
67 <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:100%;height:0.2em;">
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
68 </div>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
69 </td>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
70 </tr>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
71 </table>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
72 </div>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
73
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
74
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
75 <div class='slide'>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
76
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
77 <!-- _S9SLIDE_ -->
|
28
|
78 <h2 id="gearsosのファイルシステムの設計と実装">GearsOSのファイルシステムの設計と実装</h2>
|
14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
79 <ul>
|
28
|
80 <li>DataGearとCodeGearという単位を用いるOS</li>
|
|
81 <li>従来のファイルシステムには型とTransactionが無い</li>
|
|
82 <li>DataGear単位のTransactionとしてファイルシステムを設計</li>
|
|
83 <li>APIとしてTake/Put/Peekを採用した</li>
|
|
84 <li>通信としてもDBアクセスとしても使える(メモリからSSDへの通信に見える)</li>
|
|
85 <li>本研究ではsocket baseな通信とWordCountの例題を作成した</li>
|
14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
86 </ul>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
87
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
88
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
89
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
90 </div>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
91
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
92 <div class='slide'>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
93 <!-- _S9SLIDE_ -->
|
28
|
94 <h2 id="gearsosの基本単位">GearsOSの基本単位</h2>
|
14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
95 <ul>
|
22
|
96 <li>CodeGear
|
14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
97 <ul>
|
28
|
98 <li>実行Codeの単位</li>
|
|
99 <li>入力DataGearと出力DataGearを持つ</li>
|
22
|
100 <li>goto文(jump命令)を使って遷移する</li>
|
28
|
101 <li>実行単位は途中で割り込まれたりしない(Atmocity)</li>
|
14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
102 </ul>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
103 </li>
|
22
|
104 <li>DataGear
|
|
105 <ul>
|
28
|
106 <li>Cの構造体に相当する</li>
|
|
107 <li>ノーマルレベルでは変更されない(関数型プログラミング)</li>
|
22
|
108 </ul>
|
|
109 </li>
|
28
|
110 <li>C言語を拡張する形でCbC言語により実装される(gcc/llvm)</li>
|
22
|
111 </ul>
|
|
112
|
|
113
|
|
114
|
|
115 </div>
|
|
116
|
|
117 <div class='slide'>
|
|
118 <!-- _S9SLIDE_ -->
|
28
|
119 <h2 id="codegearとdatagear">CodeGearとDataGear</h2>
|
22
|
120 <ul>
|
28
|
121 <li>InputDataGearを受け取って、CodeGearが処理し、OutputDataGearを出力する</li>
|
|
122 <li>OutputDataGearは次のCodeGearのInputDataGearとなる</li>
|
|
123 <li>ファイルシステムではDataGearをkeyで待ち合わせる</li>
|
14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
124 </ul>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
125 <div style="text-align: center;">
|
22
|
126 <img src="images/cg-dg.pdf" alt="cgdgの関係図" width="600" />
|
14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
127 </div>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
128
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
129
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
130
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
131 </div>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
132
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
133 <div class='slide'>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
134 <!-- _S9SLIDE_ -->
|
20
|
135 <h2 id="gearsosのinterface">GearsOSのInterface</h2>
|
|
136 <ul>
|
28
|
137 <li>JavaのInterfaceに相当する</li>
|
|
138 <li>APIとなるCodeGearの名前と型を書く(__next(…)が継続)</li>
|
|
139 <li>引数渡しの構造体として使う(引数はすべてここに定義される必要がある)
|
22
|
140 <pre><code>typedef struct Tree<>{
|
|
141 union Data* tree;
|
|
142 struct Node* node;
|
|
143 __code put(Impl* tree,Type* node, __code next(...));
|
|
144 __code get(Impl* tree, Type* node, __code next(...));
|
|
145 __code remove(Impl* tree,Type* node, __code next(...));
|
|
146 __code next(...);
|
|
147 } Tree;
|
|
148 </code></pre>
|
|
149 </li>
|
|
150 </ul>
|
|
151
|
|
152
|
|
153
|
|
154 </div>
|
|
155
|
|
156 <div class='slide'>
|
|
157 <!-- _S9SLIDE_ -->
|
28
|
158 <h2 id="interfaceの呼び出し">Interfaceの呼び出し</h2>
|
26
|
159 <ul>
|
28
|
160 <li>createで作成する(通常の関数呼び出し)</li>
|
|
161 <li>DataGearとして作成する場合はnewを使う</li>
|
|
162 <li>gotoでputAPIを呼び出す(nextは継続)</li>
|
|
163 <li>InterfaceなどのDataGearはプロセスに相当するContextにすべて格納される
|
|
164 <pre><code>struct Queue* queue = createSychronizedQueue(context);
|
|
165 struct Task* task = new Task();
|
|
166 goto queue->put(task, next(...));
|
26
|
167 </code></pre>
|
|
168 </li>
|
|
169 </ul>
|
|
170
|
|
171
|
|
172
|
|
173 </div>
|
|
174
|
|
175 <div class='slide'>
|
|
176 <!-- _S9SLIDE_ -->
|
28
|
177 <h2 id="interfaceの実装">Interfaceの実装</h2>
|
26
|
178 <ul>
|
28
|
179 <li>Interfaceの実装に使われるデータ構造を記述するImplementがある</li>
|
|
180 <li>実装で使われるDataGearを記述する(ヒープに確保される)</li>
|
|
181 <li>create時にAPIを実装するCodeGearをInterfaceの構造体に代入される
|
|
182 <pre><code>typedef struct SynchronizedQueue <> impl Queue {
|
|
183 struct Element* top;
|
|
184 struct Element* last;
|
|
185 struct Atomic* atomic;
|
|
186 } SynchronizedQueue;
|
26
|
187 </code></pre>
|
|
188 </li>
|
|
189 </ul>
|
|
190
|
|
191
|
|
192
|
|
193 </div>
|
|
194
|
|
195 <div class='slide'>
|
|
196 <!-- _S9SLIDE_ -->
|
28
|
197 <h2 id="codegearとdatagearにはメタレベルなものが存在する">CodeGearとDataGearにはメタレベルなものが存在する</h2>
|
22
|
198 <ul>
|
28
|
199 <li>メタレベルな記述はトランスコンパイラにより自動生成される(記述することも可能)</li>
|
|
200 <li>CodeGearの前後にMetaなCodeGearが挿入される</li>
|
22
|
201 </ul>
|
|
202 <div style="text-align: center;">
|
|
203 <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800" />
|
|
204 </div>
|
|
205
|
|
206
|
|
207
|
|
208 </div>
|
|
209
|
|
210 <div class='slide'>
|
|
211 <!-- _S9SLIDE_ -->
|
28
|
212 <h2 id="stubcodegearとgoto-meta">stubCodeGearとgoto meta</h2>
|
22
|
213 <ul>
|
28
|
214 <li>ContextからInputDataGearを取り出す(stubCodeGear)</li>
|
|
215 <li>OutputDataGearをContextに書き込み、次のCodeGearを呼び出す(goto meta)</li>
|
|
216 <li>stubCodeGear/goto metaは変更可能(メタプログラミング)</li>
|
22
|
217 </ul>
|
|
218 <div style="text-align: center;">
|
|
219 <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800" />
|
|
220 </div>
|
|
221
|
|
222
|
|
223
|
|
224 </div>
|
|
225
|
|
226 <div class='slide'>
|
|
227 <!-- _S9SLIDE_ -->
|
|
228 <h2 id="gearsosのファイルシステムの設計">GearsOSのファイルシステムの設計</h2>
|
|
229 <ul>
|
|
230 <li>DataGearの単位でデータを操作したい</li>
|
28
|
231 <li>通信データに対応した複数のストリームを持つ</li>
|
|
232 <li>Transactionとしてatomicに操作したい
|
22
|
233 <ul>
|
28
|
234 <li>従来のファイルシステムはTransactionはUserレベルで実装される</li>
|
22
|
235 </ul>
|
|
236 </li>
|
28
|
237 <li>ファイル操作と通信を同じAPIで実現する
|
20
|
238 <ul>
|
22
|
239 <li>ChristieのDataGearManagerを参考にする</li>
|
28
|
240 <li>Take/Put/Peek</li>
|
22
|
241 </ul>
|
|
242 </li>
|
|
243 </ul>
|
|
244
|
|
245
|
|
246
|
|
247 </div>
|
|
248
|
|
249 <div class='slide'>
|
|
250 <!-- _S9SLIDE_ -->
|
28
|
251 <h2 id="takeputpeek">Take/Put/Peek</h2>
|
22
|
252 <ul>
|
28
|
253 <li>ファイルはQueueで構成される</li>
|
|
254 <li>putでQueueに追加</li>
|
|
255 <li>takeでQueueからの取り出し</li>
|
|
256 <li>peekでQueueから取り出さない読み出し</li>
|
22
|
257 </ul>
|
|
258 <div style="text-align: center;">
|
|
259 <img src="images/QueueElement.pdf" alt="Queueの構造" width="800" />
|
|
260 </div>
|
|
261
|
|
262
|
|
263
|
|
264 </div>
|
|
265
|
|
266 <div class='slide'>
|
|
267 <!-- _S9SLIDE_ -->
|
|
268 <h2 id="gearsfsのトランザクション">GearsFSのトランザクション</h2>
|
|
269 <ul>
|
28
|
270 <li>GearsOSのCodeGear操作はatomicなので割り込まれない
|
23
|
271 <ul>
|
28
|
272 <li>atomicityはOSが保証する</li>
|
|
273 <li>これによりTake/Put/PeekがTransactionであることを保証する</li>
|
20
|
274 </ul>
|
|
275 </li>
|
|
276 </ul>
|
14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
277
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
278
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
279
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
280 </div>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
281
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
282 <div class='slide'>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
283 <!-- _S9SLIDE_ -->
|
28
|
284 <h2 id="queueによるgearsosのファイル">QueueによるGearsOSのファイル</h2>
|
16
|
285 <ul>
|
28
|
286 <li>GearsOSのファイルはDataGearを保持するQueueとなる</li>
|
|
287 <li>オンメモリのファイルに相当する</li>
|
|
288 <li>Queueをデバイスにcopyして持続性を実現する</li>
|
|
289 <li>書き込み先はDataGearManagerで選択する</li>
|
|
290 </ul>
|
|
291
|
|
292
|
|
293
|
|
294 </div>
|
|
295
|
|
296 <div class='slide'>
|
|
297 <!-- _S9SLIDE_ -->
|
|
298 <h2 id="putのimplementation">PutのImplementation</h2>
|
|
299 <ul>
|
|
300 <li>QueueのElementをnewで作成する</li>
|
|
301 <li>Queueのリンクを構築する</li>
|
|
302 <li>継続nextに跳ぶ
|
|
303 <pre><code>__code putSingleLinkedQueue(struct SingleLinkedQueue* queue, union Data* data, __code next(...)) {
|
|
304 Element* element = new Element();
|
|
305 element->data = data;
|
|
306 element->next = NULL;
|
|
307 queue->last->next = element;
|
|
308 queue->last = element;
|
|
309 goto next(...);
|
22
|
310 }
|
20
|
311 </code></pre>
|
19
|
312 </li>
|
|
313 </ul>
|
|
314
|
|
315
|
|
316
|
|
317 </div>
|
|
318
|
|
319 <div class='slide'>
|
|
320 <!-- _S9SLIDE_ -->
|
28
|
321 <h2 id="takeのimplementation">TakeのImplementation</h2>
|
23
|
322 <ul>
|
28
|
323 <li>QueueからElement経由でDataGearを取り出す</li>
|
|
324 <li>Queueのリンクを修正し、nextでデータを引き渡す</li>
|
|
325 <li>Elementには任意の型のDataGearが格納されている
|
|
326 <pre><code>__code takeSingleLinkedQueue(struct SingleLinkedQueue* queue, __code next(union Data* data, ...)) {
|
|
327 printf("take\n");
|
|
328 struct Element* top = queue->top;
|
|
329 struct Element* nextElement = top->next;
|
|
330 if (queue->top == queue->last) {
|
|
331 data = NULL;
|
|
332 } else {
|
|
333 queue->top = nextElement;
|
|
334 data = nextElement->data;
|
|
335 }
|
|
336 goto next(data, ...);
|
|
337 }
|
|
338 </code></pre>
|
23
|
339 </li>
|
17
|
340 </ul>
|
|
341
|
|
342
|
|
343
|
|
344 </div>
|
|
345
|
|
346 <div class='slide'>
|
|
347 <!-- _S9SLIDE_ -->
|
20
|
348 <h2 id="datagearmanager">DataGearManager</h2>
|
17
|
349 <ul>
|
28
|
350 <li>Take/Put/PeekはDataGearManagerに対して行う</li>
|
|
351 <li>メモリ上のQueueはLocalDGMになる</li>
|
|
352 <li>RemoteDGMは他のノードやプロセスあるいはストレージデバイスをあらわす</li>
|
|
353 <li>一つのDataGearManager上に複数のQueueがあり、keyで識別する</li>
|
|
354 <li>RemoteDGMに書き込むと相手のLocalDGMに書き込まれる</li>
|
|
355 <li>Take/Peekは書き込みを待ち合わせる</li>
|
|
356 <li>複数のTakeを待ち合わせることができる</li>
|
17
|
357 </ul>
|
|
358
|
20
|
359
|
|
360
|
|
361 </div>
|
|
362
|
|
363 <div class='slide'>
|
|
364 <!-- _S9SLIDE_ -->
|
24
|
365 <h2 id="datagearmanagerによる通信構成">DataGearManagerによる通信構成</h2>
|
23
|
366 <ul>
|
|
367 <li>任意の相手のRemoteDGMを作成することでTopologyが形成される</li>
|
28
|
368 <li>手元のRemoteDGMに書き込むと相手のLocalDGMに書き込まれる</li>
|
|
369 <li>RemoteDGMはproxyとして動作する</li>
|
|
370 <li>この構成は分散フレームワークChristie(当研究室作成)と同じ</li>
|
23
|
371 </ul>
|
19
|
372 <div style="text-align: center;">
|
20
|
373 <img src="images/Remote_DataGearManager.pdf" alt="RemoteDGMの関係図" width="800" />
|
19
|
374 </div>
|
|
375
|
17
|
376
|
|
377
|
|
378 </div>
|
|
379
|
|
380 <div class='slide'>
|
|
381 <!-- _S9SLIDE_ -->
|
28
|
382 <h2 id="socket通信によるremotedgmの実装">socket通信によるRemoteDGMの実装</h2>
|
19
|
383 <ul>
|
28
|
384 <li>GearsOSはUnix上の言語フレームワークとして実装されている</li>
|
|
385 <li>Unixのsocket通信を使ってQueueのputを実装する</li>
|
24
|
386 <li>proxy側はQueueにputされたDataをsocketで送信する</li>
|
28
|
387 <li>送信されたDataはLocal側でgetDataAPIで取り出される</li>
|
|
388 <li>send/recvはUnixのAPI
|
19
|
389 <pre><code>__code sendDataRemoteDGMQueue(struct RemoteDGMQueue* cQueue, union Data* data, __code next(...), __code whenError(...)){
|
20
|
390 char recv_buf;
|
|
391 int send_size, recv_size;
|
|
392
|
19
|
393 send_size = send(cQueue->socket, data, sizeof(union Data), 0);
|
|
394 recv_size = recv(cQueue->socket, &recv_buf, 1, 0);
|
20
|
395 //error処理は省略
|
19
|
396 goto next(...);
|
|
397 }
|
|
398 </code></pre>
|
|
399 </li>
|
|
400 </ul>
|
18
|
401
|
|
402
|
|
403
|
|
404 </div>
|
|
405
|
|
406 <div class='slide'>
|
|
407 <!-- _S9SLIDE_ -->
|
28
|
408 <h2 id="受信側の実装">受信側の実装</h2>
|
20
|
409 <ul>
|
24
|
410 <li>ファイル本体(Local側)はsocketからDataを取り出す</li>
|
|
411 <li>取り出されたデータはQueueにputされる
|
20
|
412 <pre><code>__code getDataLocalDGMQueue(struct LocalDGMQueue* cQueue, __code next(...), __code whenError(...)){
|
|
413 int recv_size, send_size;
|
|
414 char send_buf;
|
|
415
|
|
416 union Data* recv_data;
|
|
417 recv_size = recv(cQueue->socket, recv_data, sizeof(union Data), 0);
|
|
418
|
|
419 //error処理は省略
|
|
420 Gearef(context, cQueue)->data = recv_data;
|
|
421 goto putLocalDGMQueue(recv_data, next);
|
|
422 }
|
|
423 </code></pre>
|
|
424 </li>
|
|
425 </ul>
|
|
426
|
|
427
|
|
428
|
|
429 </div>
|
|
430
|
|
431 <div class='slide'>
|
|
432 <!-- _S9SLIDE_ -->
|
24
|
433 <h2 id="複数のストリームから構成されるファイル">複数のストリームから構成されるファイル</h2>
|
17
|
434 <ul>
|
24
|
435 <li>入力されるデータに応じた個別のstreamを備えたい
|
20
|
436 <ul>
|
28
|
437 <li>例えばUSBは複数のチャネルを持つ</li>
|
|
438 <li>メタデータの取り出しは別streamになる</li>
|
|
439 <li>通信として使う場合に複数のプロトコルがある方が良い(FTP)</li>
|
20
|
440 </ul>
|
|
441 </li>
|
24
|
442 <li>Streamはkey nameを持ち、keyでアクセスを行う</li>
|
28
|
443 <li>赤黒木を用いる</li>
|
24
|
444 <li>DataのTake/Put時には必ずkey nameの指定が必要となる</li>
|
|
445 </ul>
|
|
446
|
|
447
|
|
448
|
|
449 </div>
|
|
450
|
|
451 <div class='slide'>
|
|
452 <!-- _S9SLIDE_ -->
|
28
|
453 <h2 id="socketを使ったremotedgm">socketを使ったRemoteDGM</h2>
|
24
|
454 <ul>
|
28
|
455 <li>RemoteDGMに書き込みが行われるとsocketで通信が起きる</li>
|
|
456 <li>受信側はLocalDGMにDataGearを書き込む</li>
|
17
|
457 </ul>
|
20
|
458 <div style="text-align: center;">
|
|
459 <img src="images/socketCom.pdf" alt="socketを通じたレコード送信" width="800" />
|
|
460 </div>
|
|
461
|
|
462
|
|
463
|
|
464 </div>
|
|
465
|
|
466 <div class='slide'>
|
|
467 <!-- _S9SLIDE_ -->
|
28
|
468 <h2 id="wordcountの例題">wordCountの例題</h2>
|
20
|
469 <ul>
|
28
|
470 <li>ファイル内の文字列を1行づつ受け取り、文字列,行数をカウントする例題</li>
|
20
|
471 <li>文字列送信側とCount側を別ノード上で行うことで、ファイルの呼び出しと通信処理が構成できる</li>
|
28
|
472 <li>RemoteDGMへの書き込みで通信する</li>
|
|
473 <li>acknowredgeを逆方向のRemoteDGMによる通信で実現する(現在は直接送信)</li>
|
20
|
474 </ul>
|
|
475 <div style="text-align: center;">
|
27
|
476 <img src="images/slideGearsWC.pdf" alt="リモートDGMによるWordCount" width="800" />
|
20
|
477 </div>
|
17
|
478
|
|
479
|
|
480
|
|
481 </div>
|
|
482
|
|
483 <div class='slide'>
|
|
484 <!-- _S9SLIDE_ -->
|
24
|
485 <h2 id="gearsfile-apiによるwordcount13">GearsFile APIによるWordCount(1/3)</h2>
|
17
|
486 <ul>
|
26
|
487 <li>FileOpen側(NodeA)とWordCount側(NodeB)でノードが別れる</li>
|
27
|
488 <li>(手順1)FileOpen側はFilePloxyにDataRecordをputする</li>
|
17
|
489 <li>(手順2)WordCount側は処理の後、ackを返信する</li>
|
24
|
490 </ul>
|
|
491 <div style="text-align: center;">
|
26
|
492 <img src="images/slideGearsWC.pdf" alt="ChristieAPIによるWordCount" width="800" />
|
24
|
493 </div>
|
|
494
|
|
495
|
|
496
|
|
497 </div>
|
|
498
|
|
499 <div class='slide'>
|
|
500 <!-- _S9SLIDE_ -->
|
|
501 <h2 id="gearsfile-apiによるwordcount23">GearsFile APIによるWordCount(2/3)</h2>
|
|
502 <ul>
|
17
|
503 <li>(手順3)1,2をループし、FileOpen側はEoFならフラグを送信する</li>
|
24
|
504 </ul>
|
|
505 <div style="text-align: center;">
|
26
|
506 <img src="images/slideGearsWC.pdf" alt="ChristieAPIによるWordCount" width="800" />
|
24
|
507 </div>
|
|
508
|
|
509
|
|
510
|
|
511 </div>
|
|
512
|
|
513 <div class='slide'>
|
|
514 <!-- _S9SLIDE_ -->
|
|
515 <h2 id="gearsfile-apiによるwordcount33">GearsFile APIによるWordCount(3/3)</h2>
|
|
516 <ul>
|
17
|
517 <li>(手順4)EoFを受信したWordCountは結果を返信し、双方の処理を終了させる</li>
|
|
518 </ul>
|
|
519 <div style="text-align: center;">
|
26
|
520 <img src="images/slideGearsWC.pdf" alt="ChristieAPIによるWordCount" width="800" />
|
17
|
521 </div>
|
|
522
|
|
523
|
|
524
|
|
525 </div>
|
|
526
|
|
527 <div class='slide'>
|
|
528 <!-- _S9SLIDE_ -->
|
24
|
529 <h2 id="現在のgearsfile-apiの開発状況">現在のGearsFile APIの開発状況</h2>
|
18
|
530 <ul>
|
24
|
531 <li>実装ずみ
|
20
|
532 <ul>
|
24
|
533 <li>keyアクセスに対応したファイル通信
|
|
534 <ul>
|
|
535 <li>単一のQueueによる通信の記述</li>
|
|
536 </ul>
|
|
537 </li>
|
|
538 <li>リストとなるTree
|
|
539 <ul>
|
|
540 <li>赤黒木</li>
|
|
541 </ul>
|
|
542 </li>
|
|
543 <li>atomicな操作が行えるQueue
|
|
544 <ul>
|
|
545 <li>複数からのアクセス時にデータ整合を保つ</li>
|
|
546 </ul>
|
|
547 </li>
|
20
|
548 </ul>
|
|
549 </li>
|
24
|
550 <li>実装中
|
|
551 <ul>
|
|
552 <li>keyアクセスが行えるQueueのリスト</li>
|
|
553 <li>リスト単位での通信の記述</li>
|
|
554 </ul>
|
|
555 </li>
|
18
|
556 </ul>
|
|
557
|
|
558
|
|
559
|
|
560 </div>
|
|
561
|
|
562 <div class='slide'>
|
|
563 <!-- _S9SLIDE_ -->
|
28
|
564 <h2 id="結論">結論</h2>
|
|
565 <ul>
|
|
566 <li>GearsOSのファイルの設計を行った
|
|
567 <ul>
|
|
568 <li>ファイルの構造の設計
|
|
569 <ul>
|
|
570 <li>DataGear単位での操作が行える</li>
|
|
571 </ul>
|
|
572 </li>
|
|
573 <li>socketによる通信部分の実装
|
|
574 <ul>
|
|
575 <li>GearsOS上でのソケット通信の記述</li>
|
|
576 </ul>
|
|
577 </li>
|
|
578 <li>APIの段階的な設計記述
|
|
579 <ul>
|
|
580 <li>Proxyによるファイル通信</li>
|
|
581 </ul>
|
|
582 </li>
|
|
583 <li>GearsOSの調査</li>
|
|
584 </ul>
|
|
585 </li>
|
|
586 <li>Streamのリスト単位での通信の完成</li>
|
|
587 </ul>
|
|
588
|
|
589
|
|
590
|
|
591 </div>
|
|
592
|
|
593 <div class='slide'>
|
|
594 <!-- _S9SLIDE_ -->
|
|
595 <h2 id="将来的な課題">将来的な課題</h2>
|
|
596 <ul>
|
|
597 <li>TopoplogyManagerの設計
|
|
598 <ul>
|
|
599 <li>参加したノードを任意の形のTopologyに接続する機能</li>
|
|
600 <li>ファイルシステム向けの機能を追加したい
|
|
601 <ul>
|
|
602 <li>DNS</li>
|
|
603 <li>中枢としてのTopologyのノード監視</li>
|
|
604 </ul>
|
|
605 </li>
|
|
606 </ul>
|
|
607 </li>
|
|
608 <li>Securityシステムの追加
|
|
609 <ul>
|
|
610 <li>証明書などによるファイル操作制限</li>
|
|
611 <li>不正な分散ファイルシステムへのアクセス</li>
|
|
612 </ul>
|
|
613 </li>
|
|
614 </ul>
|
|
615
|
|
616
|
|
617
|
|
618 </div>
|
|
619
|
|
620 <div class='slide'>
|
|
621 <!-- _S9SLIDE_ -->
|
24
|
622 <h2 id="gearsosの生成形の問題点">GearsOSの生成形の問題点</h2>
|
18
|
623 <ul>
|
20
|
624 <li>GearsOSのメタレベルの処理の記述はトランスコンパイラにより行われる</li>
|
|
625 <li>場合によりメタレベルの記述を行わなくてはならない
|
18
|
626 <ul>
|
20
|
627 <li>他のInterfaceを継承したオブジェクトからのDataGear継承
|
|
628 <ul>
|
|
629 <li>例)Queueからのデータ取り出し</li>
|
26
|
630 <li>トランスコンパイラはどのInterfaceに記述されたDataGearを参照するべきか判断が難しい</li>
|
20
|
631 </ul>
|
|
632 </li>
|
18
|
633 </ul>
|
|
634 </li>
|
|
635 </ul>
|
|
636
|
20
|
637 <pre><code>__code Task2(TQueue* localDGMQueue){
|
|
638 goto localDGMQueue->take(Task3);
|
|
639 }
|
18
|
640
|
20
|
641 __code Task3(TQueue* localDGMQueue, FileString* string){
|
|
642 printf("take[%s] [num:%d]\n", string->str, string->size);
|
|
643 goto getData();
|
|
644 }
|
18
|
645
|
20
|
646 //プログラマが実装したいstub
|
|
647 __code Task3_stub(struct Context* context){
|
|
648 TQueue* localDGMQueue = (struct TQueue*)Gearef(context, TQueue)->tQueue;
|
|
649 FileString* string = Gearef(context, TQueue)->data;
|
|
650 goto Task3(context, localDGMQueue, string);
|
|
651 }
|
|
652
|
|
653 //自動生成されたErrorなstub
|
|
654 __code Task3_stub(struct Context* context) {
|
|
655 TQueue* localDGMQueue = Gearef(context, TQueue);
|
|
656 FileString* string = Gearef(context, FileString);
|
|
657 goto Task3(context, localDGMQueue, string);
|
|
658 }
|
|
659 </code></pre>
|
18
|
660
|
|
661
|
|
662
|
|
663 </div>
|
|
664
|
|
665 <div class='slide'>
|
|
666 <!-- _S9SLIDE_ -->
|
20
|
667 <h2 id="並列処理構文par-gotoが持つ問題">並列処理構文par gotoが持つ問題</h2>
|
18
|
668 <ul>
|
20
|
669 <li>par gotoとはGearsOSに実装された並列処理構文である</li>
|
24
|
670 <li>StreamQueueに対するput/takeの並列処理の実装をpar goto構文で試みた</li>
|
20
|
671 <li>par gotoはトランスコンパイラへの依存性が高い
|
18
|
672 <ul>
|
20
|
673 <li>stubCodeGearのように任意な書き換えが行えない</li>
|
18
|
674 </ul>
|
|
675 </li>
|
20
|
676 <li>特定のCodeGearの宣言のみでしか正常な処理が生成されない
|
18
|
677 <ul>
|
20
|
678 <li>Interfaceに記述されたAPICodeGearではバグが生じる</li>
|
|
679 <li>par gotoでの使用を前提としたCodeGearを書かなくてはならない</li>
|
18
|
680 </ul>
|
|
681 </li>
|
20
|
682 <li>処理が重いという問題点も存在する</li>
|
18
|
683 </ul>
|
|
684
|
|
685
|
|
686
|
|
687 </div>
|
|
688
|
|
689 <div class='slide'>
|
|
690 <!-- _S9SLIDE_ -->
|
28
|
691 <h2 id="以下返答用">以下返答用</h2>
|
20
|
692
|
|
693
|
|
694
|
|
695 </div>
|
|
696
|
|
697 <div class='slide'>
|
|
698 <!-- _S9SLIDE_ -->
|
28
|
699 <h2 id="takeputpeek-1">Take/Put/Peek</h2>
|
20
|
700 <ul>
|
28
|
701 <li>PeekはReadOnly (最新の設定を読みこむなど)</li>
|
|
702 <li>Take/PutはDGが一つならUpDataに相当する</li>
|
|
703 <li>書き込みが単一スレッドなら順序は保証される</li>
|
|
704 <li>書き込みが複数の場合、Putの順序は保証されない</li>
|
|
705 <li>データベースとの違い
|
20
|
706 <ul>
|
28
|
707 <li>putがQueueとして蓄積される</li>
|
|
708 <li>Keyが一つしかない(通信路として使える)</li>
|
18
|
709 </ul>
|
|
710 </li>
|
|
711 </ul>
|
|
712
|
|
713
|
17
|
714
|
|
715 </div>
|
|
716
|
|
717 <div class='slide'>
|
|
718 <!-- _S9SLIDE_ -->
|
28
|
719 <h2 id="__code-nextint-ret-の意味">__code next(int ret, …)の意味</h2>
|
|
720 <ul>
|
|
721 <li>軽量継続を表す</li>
|
|
722 <li>nextは引数として渡されたCodeGear</li>
|
|
723 <li>int ret は返す値</li>
|
|
724 <li>…は軽量継続の呼び出された時の値渡しのInterface</li>
|
|
725 <li>一段の呼び出しStackのような役割になる</li>
|
|
726 </ul>
|
14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
727
|
19
|
728
|
|
729
|
|
730 </div>
|
|
731
|
|
732 <div class='slide'>
|
|
733 <!-- _S9SLIDE_ -->
|
28
|
734 <h2 id="codegearと再帰呼び出し">CodeGearと再帰呼び出し</h2>
|
24
|
735 <ul>
|
28
|
736 <li>再起呼び出ししなければ関数呼び出し的に使える(末尾再起)</li>
|
|
737 <li>再帰呼び出ししたい場合、明示的に自分でStackを作る</li>
|
|
738 <li>…はContextにすべて置かれている</li>
|
|
739 <li>Processはすべて異なるContextを持っている</li>
|
|
740 <li>Context自体は共有されない</li>
|
24
|
741 </ul>
|
|
742
|
|
743
|
|
744
|
|
745 </div>
|
|
746
|
|
747 <div class='slide'>
|
|
748 <!-- _S9SLIDE_ -->
|
28
|
749 <h2 id="datagearの型">DataGearの型</h2>
|
17
|
750 <ul>
|
28
|
751 <li>union Data は一つのプロセス(Context)で使われるすべてのDataGearのUnion</li>
|
|
752 <li>メタ部分に型に対応する番号を持っている</li>
|
|
753 <li>番号を使って型を識別することができる</li>
|
|
754 <li>任意の型を格納できるQueueやStackを作成することが可能</li>
|
|
755 <li>メタレベルではunion Dataを使ってDataGearの詳細に立ち入らず処理できる</li>
|
|
756 </ul>
|
|
757
|
|
758
|
|
759
|
|
760 </div>
|
|
761
|
|
762 <div class='slide'>
|
|
763 <!-- _S9SLIDE_ -->
|
|
764 <h2 id="remotedgmとacknowledge">RemoteDGMとacknowledge</h2>
|
|
765 <ul>
|
|
766 <li>Take/Put/Peekのコマンドは TCP上でacknowledgeを使って通信されている</li>
|
|
767 <li>これとは別に自分と相手のCodeGearどうしのacknowledgeが必要</li>
|
|
768 <li>RemoteDataGearManager経由でacknowledgeを返すのが正しい</li>
|
|
769 <li>しかし、acknowledgeが重複してしまう</li>
|
|
770 <li>メタプログラミングを利用してこの重複を消すことは可能
|
19
|
771 <ul>
|
28
|
772 <li>しかし煩雑</li>
|
19
|
773 </ul>
|
|
774 </li>
|
17
|
775 </ul>
|
14
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
776
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
777 </div>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
778
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
779
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
780 </div><!-- presentation -->
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
781 </body>
|
ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
782 </html>
|