Mercurial > hg > Papers > 2022 > ikki-master
comparison slide/thesis.pdf.html @ 28:7174f22ed695
tweak
author | ichikitakahiro <e165713@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 10 Feb 2022 23:55:41 +0900 |
parents | 3f39907150c5 |
children | bca6c79006cf |
comparison
equal
deleted
inserted
replaced
27:3f39907150c5 | 28:7174f22ed695 |
---|---|
61 </tr> | 61 </tr> |
62 <tr> | 62 <tr> |
63 <td> | 63 <td> |
64 <div align="left"> | 64 <div align="left"> |
65 Takahiro Ikki, Shinji Kono | 65 Takahiro Ikki, Shinji Kono |
66 琉球大学 | 66 琉球大学理工学研究科情報工学専攻 |
67 <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:100%;height:0.2em;"> | 67 <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:100%;height:0.2em;"> |
68 </div> | 68 </div> |
69 </td> | 69 </td> |
70 </tr> | 70 </tr> |
71 </table> | 71 </table> |
73 | 73 |
74 | 74 |
75 <div class='slide'> | 75 <div class='slide'> |
76 | 76 |
77 <!-- _S9SLIDE_ --> | 77 <!-- _S9SLIDE_ --> |
78 <h2 id="gearsosのファイルシステムの設計方針">GearsOSのファイルシステムの設計方針</h2> | 78 <h2 id="gearsosのファイルシステムの設計と実装">GearsOSのファイルシステムの設計と実装</h2> |
79 <ul> | 79 <ul> |
80 <li>GearsOSはGearという単位で記述が行われているOSプロジェクトである</li> | 80 <li>DataGearとCodeGearという単位を用いるOS</li> |
81 <li>GearsOSのファイルシステムも同様にDataGearの単位で構成したい</li> | 81 <li>従来のファイルシステムには型とTransactionが無い</li> |
82 <li>GearsOSのファイルシステムの設計と実装を行った</li> | 82 <li>DataGear単位のTransactionとしてファイルシステムを設計</li> |
83 <li>ファイルに取り扱うデータに対応した複数のストリームを持たせたい | 83 <li>APIとしてTake/Put/Peekを採用した</li> |
84 <ul> | 84 <li>通信としてもDBアクセスとしても使える(メモリからSSDへの通信に見える)</li> |
85 <li>従来では異なるデータでも単一のストリームから入力される</li> | 85 <li>本研究ではsocket baseな通信とWordCountの例題を作成した</li> |
86 </ul> | 86 </ul> |
87 </li> | 87 |
88 <li>GearsOSには将来的にアプリケーションが担う重要な機能をOSに取り込みたい | 88 |
89 <ul> | 89 |
90 <li>ファイルの型認識</li> | 90 </div> |
91 <li>バックアップ</li> | 91 |
92 </ul> | 92 <div class='slide'> |
93 </li> | 93 <!-- _S9SLIDE_ --> |
94 </ul> | 94 <h2 id="gearsosの基本単位">GearsOSの基本単位</h2> |
95 | 95 <ul> |
96 | |
97 | |
98 </div> | |
99 | |
100 <div class='slide'> | |
101 <!-- _S9SLIDE_ --> | |
102 <h2 id="gearsosのgear概念12">GearsOSのGear概念(1/2)</h2> | |
103 <ul> | |
104 <li>関数でなくGearという単位を用いて記述する</li> | |
105 <li>Gearは関数と異なり、スタックを持たないため軽量継続と呼ぶ</li> | |
106 <li>CodeGear | 96 <li>CodeGear |
107 <ul> | 97 <ul> |
108 <li>従来のThreadにあたる</li> | 98 <li>実行Codeの単位</li> |
99 <li>入力DataGearと出力DataGearを持つ</li> | |
109 <li>goto文(jump命令)を使って遷移する</li> | 100 <li>goto文(jump命令)を使って遷移する</li> |
101 <li>実行単位は途中で割り込まれたりしない(Atmocity)</li> | |
110 </ul> | 102 </ul> |
111 </li> | 103 </li> |
112 <li>DataGear | 104 <li>DataGear |
113 <ul> | 105 <ul> |
114 <li>従来の変数データにあたる</li> | 106 <li>Cの構造体に相当する</li> |
115 </ul> | 107 <li>ノーマルレベルでは変更されない(関数型プログラミング)</li> |
116 </li> | 108 </ul> |
117 </ul> | 109 </li> |
118 | 110 <li>C言語を拡張する形でCbC言語により実装される(gcc/llvm)</li> |
119 | 111 </ul> |
120 | 112 |
121 </div> | 113 |
122 | 114 |
123 <div class='slide'> | 115 </div> |
124 <!-- _S9SLIDE_ --> | 116 |
125 <h2 id="gearsosのgear概念22">GearsOSのGear概念(2/2)</h2> | 117 <div class='slide'> |
126 <ul> | 118 <!-- _S9SLIDE_ --> |
127 <li>CodeGearは処理を行う際、DataGearを参照し処理を行う(InputDataGear)</li> | 119 <h2 id="codegearとdatagear">CodeGearとDataGear</h2> |
128 <li>CodeGearは処理の終了後、以降に必要なデータをDataGearとして出力する(OutputDataGear)</li> | 120 <ul> |
121 <li>InputDataGearを受け取って、CodeGearが処理し、OutputDataGearを出力する</li> | |
122 <li>OutputDataGearは次のCodeGearのInputDataGearとなる</li> | |
123 <li>ファイルシステムではDataGearをkeyで待ち合わせる</li> | |
129 </ul> | 124 </ul> |
130 <div style="text-align: center;"> | 125 <div style="text-align: center;"> |
131 <img src="images/cg-dg.pdf" alt="cgdgの関係図" width="600" /> | 126 <img src="images/cg-dg.pdf" alt="cgdgの関係図" width="600" /> |
132 </div> | 127 </div> |
133 | 128 |
137 | 132 |
138 <div class='slide'> | 133 <div class='slide'> |
139 <!-- _S9SLIDE_ --> | 134 <!-- _S9SLIDE_ --> |
140 <h2 id="gearsosのinterface">GearsOSのInterface</h2> | 135 <h2 id="gearsosのinterface">GearsOSのInterface</h2> |
141 <ul> | 136 <ul> |
142 <li>Object型指向の仕組み</li> | 137 <li>JavaのInterfaceに相当する</li> |
143 <li>APIとなるCodeGearとその参照するDataGearを宣言する</li> | 138 <li>APIとなるCodeGearの名前と型を書く(__next(…)が継続)</li> |
144 <li>DataGear/CodeGearの一時的な置き場としての役割を持つ | 139 <li>引数渡しの構造体として使う(引数はすべてここに定義される必要がある) |
145 <pre><code>typedef struct Tree<>{ | 140 <pre><code>typedef struct Tree<>{ |
146 union Data* tree; | 141 union Data* tree; |
147 struct Node* node; | 142 struct Node* node; |
148 __code put(Impl* tree,Type* node, __code next(...)); | 143 __code put(Impl* tree,Type* node, __code next(...)); |
149 __code get(Impl* tree, Type* node, __code next(...)); | 144 __code get(Impl* tree, Type* node, __code next(...)); |
158 | 153 |
159 </div> | 154 </div> |
160 | 155 |
161 <div class='slide'> | 156 <div class='slide'> |
162 <!-- _S9SLIDE_ --> | 157 <!-- _S9SLIDE_ --> |
163 <h2 id="gearsosのimplement">GearsOSのImplement</h2> | 158 <h2 id="interfaceの呼び出し">Interfaceの呼び出し</h2> |
164 <ul> | 159 <ul> |
165 <li>Interfaceを継承した実装の型定義ファイルである</li> | 160 <li>createで作成する(通常の関数呼び出し)</li> |
166 <li>実装で使われるデータ構造を記述する | 161 <li>DataGearとして作成する場合はnewを使う</li> |
167 <pre><code> typedef struct SynchronizedQueue <> impl Queue { | 162 <li>gotoでputAPIを呼び出す(nextは継続)</li> |
168 struct Element* top; | 163 <li>InterfaceなどのDataGearはプロセスに相当するContextにすべて格納される |
169 struct Element* last; | 164 <pre><code>struct Queue* queue = createSychronizedQueue(context); |
170 struct Atomic* atomic; | 165 struct Task* task = new Task(); |
171 } SynchronizedQueue; | 166 goto queue->put(task, next(...)); |
172 </code></pre> | 167 </code></pre> |
173 </li> | 168 </li> |
174 </ul> | 169 </ul> |
175 | 170 |
176 | 171 |
177 | 172 |
178 </div> | 173 </div> |
179 | 174 |
180 <div class='slide'> | 175 <div class='slide'> |
181 <!-- _S9SLIDE_ --> | 176 <!-- _S9SLIDE_ --> |
182 <h2 id="interfaceの呼び出し">Interfaceの呼び出し</h2> | 177 <h2 id="interfaceの実装">Interfaceの実装</h2> |
183 <ul> | 178 <ul> |
184 <li>インターフェースは以下の記述で実装と呼び出しを行う | 179 <li>Interfaceの実装に使われるデータ構造を記述するImplementがある</li> |
185 <pre><code>struct Queue* queue = new Queue(); | 180 <li>実装で使われるDataGearを記述する(ヒープに確保される)</li> |
186 queue = createSychronizedQueue(context); | 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; | |
187 </code></pre> | 187 </code></pre> |
188 </li> | 188 </li> |
189 </ul> | 189 </ul> |
190 | 190 |
191 <pre><code>goto queue->put(task, next(...)); | 191 |
192 </code></pre> | 192 |
193 | 193 </div> |
194 | 194 |
195 | 195 <div class='slide'> |
196 </div> | 196 <!-- _S9SLIDE_ --> |
197 | 197 <h2 id="codegearとdatagearにはメタレベルなものが存在する">CodeGearとDataGearにはメタレベルなものが存在する</h2> |
198 <div class='slide'> | 198 <ul> |
199 <!-- _S9SLIDE_ --> | 199 <li>メタレベルな記述はトランスコンパイラにより自動生成される(記述することも可能)</li> |
200 <h2 id="メタレベルのgear13">メタレベルのGear(1/3)</h2> | 200 <li>CodeGearの前後にMetaなCodeGearが挿入される</li> |
201 <ul> | |
202 <li>CodeGearとDataGearにはユーザーが記述しない、メタレベルのものが存在する | |
203 <ul> | |
204 <li>メタレベルな記述はトランスコンパイラにより自動生成される</li> | |
205 </ul> | |
206 </li> | |
207 </ul> | 201 </ul> |
208 <div style="text-align: center;"> | 202 <div style="text-align: center;"> |
209 <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800" /> | 203 <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800" /> |
210 </div> | 204 </div> |
211 | 205 |
213 | 207 |
214 </div> | 208 </div> |
215 | 209 |
216 <div class='slide'> | 210 <div class='slide'> |
217 <!-- _S9SLIDE_ --> | 211 <!-- _S9SLIDE_ --> |
218 <h2 id="メタレベルのgear23">メタレベルのGear(2/3)</h2> | 212 <h2 id="stubcodegearとgoto-meta">stubCodeGearとgoto meta</h2> |
219 <ul> | 213 <ul> |
220 <li>MetaCodeGear | 214 <li>ContextからInputDataGearを取り出す(stubCodeGear)</li> |
221 <ul> | 215 <li>OutputDataGearをContextに書き込み、次のCodeGearを呼び出す(goto meta)</li> |
222 <li>CodeGearの処理前と処理後に参照される</li> | 216 <li>stubCodeGear/goto metaは変更可能(メタプログラミング)</li> |
223 <li>Input/OutputDataGearを引き渡す</li> | |
224 <li>CodeGear処理前に呼ばれるものを特にstubCodeGearと呼ぶ</li> | |
225 </ul> | |
226 </li> | |
227 </ul> | 217 </ul> |
228 <div style="text-align: center;"> | 218 <div style="text-align: center;"> |
229 <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800" /> | 219 <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800" /> |
230 </div> | 220 </div> |
231 | 221 |
233 | 223 |
234 </div> | 224 </div> |
235 | 225 |
236 <div class='slide'> | 226 <div class='slide'> |
237 <!-- _S9SLIDE_ --> | 227 <!-- _S9SLIDE_ --> |
238 <h2 id="メタレベルのgear33">メタレベルのGear(3/3)</h2> | |
239 <ul> | |
240 <li>MetaDataGear | |
241 <ul> | |
242 <li>MetaCodeGearにて参照されるDataGear</li> | |
243 </ul> | |
244 </li> | |
245 </ul> | |
246 <div style="text-align: center;"> | |
247 <img src="images/meta-cg-dg.pdf" alt="ノーマルレベルとメタレベルの視点からのGearの関係" width="800" /> | |
248 </div> | |
249 | |
250 | |
251 | |
252 </div> | |
253 | |
254 <div class='slide'> | |
255 <!-- _S9SLIDE_ --> | |
256 <h2 id="gearsosのファイルシステムの設計">GearsOSのファイルシステムの設計</h2> | 228 <h2 id="gearsosのファイルシステムの設計">GearsOSのファイルシステムの設計</h2> |
257 <ul> | 229 <ul> |
258 <li>DataGearの単位でデータを操作したい</li> | 230 <li>DataGearの単位でデータを操作したい</li> |
259 <li>通信データに対応した複数のストリームを持ちたい</li> | 231 <li>通信データに対応した複数のストリームを持つ</li> |
260 <li>Transaction(マクロレベル)で操作したい | 232 <li>Transactionとしてatomicに操作したい |
261 <ul> | 233 <ul> |
262 <li>従来のファイルシステムは一部の操作のみTransactionである</li> | 234 <li>従来のファイルシステムはTransactionはUserレベルで実装される</li> |
263 </ul> | 235 </ul> |
264 </li> | 236 </li> |
265 <li>ファイルそのものが通信を担当する | 237 <li>ファイル操作と通信を同じAPIで実現する |
266 <ul> | 238 <ul> |
267 <li>ChristieのDataGearManagerを参考にする</li> | 239 <li>ChristieのDataGearManagerを参考にする</li> |
268 </ul> | 240 <li>Take/Put/Peek</li> |
269 </li> | 241 </ul> |
270 </ul> | 242 </li> |
271 | 243 </ul> |
272 | 244 |
273 | 245 |
274 </div> | 246 |
275 | 247 </div> |
276 <div class='slide'> | 248 |
277 <!-- _S9SLIDE_ --> | 249 <div class='slide'> |
278 <h2 id="gearsosのファイルデータ操作13">GearsOSのファイルデータ操作(1/3)</h2> | 250 <!-- _S9SLIDE_ --> |
279 <ul> | 251 <h2 id="takeputpeek">Take/Put/Peek</h2> |
280 <li>GearsOSはDataGearのやりとりでプログラムが構成される | 252 <ul> |
281 <ul> | 253 <li>ファイルはQueueで構成される</li> |
282 <li>ファイルシステムも同様の実装にしたい = DataGear単位で操作したい</li> | 254 <li>putでQueueに追加</li> |
283 </ul> | 255 <li>takeでQueueからの取り出し</li> |
284 </li> | 256 <li>peekでQueueから取り出さない読み出し</li> |
285 </ul> | 257 </ul> |
286 <div style="text-align: center;"> | 258 <div style="text-align: center;"> |
287 <img src="images/QueueElement.pdf" alt="Queueの構造" width="800" /> | 259 <img src="images/QueueElement.pdf" alt="Queueの構造" width="800" /> |
288 </div> | 260 </div> |
289 | 261 |
291 | 263 |
292 </div> | 264 </div> |
293 | 265 |
294 <div class='slide'> | 266 <div class='slide'> |
295 <!-- _S9SLIDE_ --> | 267 <!-- _S9SLIDE_ --> |
296 <h2 id="gearsosのファイルデータ操作23">GearsOSのファイルデータ操作(2/3)</h2> | |
297 <ul> | |
298 <li>GearsOSのファイルデータは任意の型を持った構造体で実装される(ファイルレコード)</li> | |
299 <li>レコードは決められた順番で連続しており、Queueに保存される</li> | |
300 </ul> | |
301 <div style="text-align: center;"> | |
302 <img src="images/QueueElement.pdf" alt="Queueの構造" width="800" /> | |
303 </div> | |
304 | |
305 | |
306 | |
307 </div> | |
308 | |
309 <div class='slide'> | |
310 <!-- _S9SLIDE_ --> | |
311 <h2 id="gearsosのファイルデータ操作33">GearsOSのファイルデータ操作(3/3)</h2> | |
312 <ul> | |
313 <li>構造体の型を判別することで処理の切り替えが行える</li> | |
314 </ul> | |
315 <div style="text-align: center;"> | |
316 <img src="images/QueueElement.pdf" alt="Queueの構造" width="800" /> | |
317 </div> | |
318 | |
319 | |
320 | |
321 </div> | |
322 | |
323 <div class='slide'> | |
324 <!-- _S9SLIDE_ --> | |
325 <h2 id="gearsfsのトランザクション">GearsFSのトランザクション</h2> | 268 <h2 id="gearsfsのトランザクション">GearsFSのトランザクション</h2> |
326 <ul> | 269 <ul> |
327 <li>GearsOSのDataGear操作はマクロな操作である | 270 <li>GearsOSのCodeGear操作はatomicなので割り込まれない |
328 <ul> | 271 <ul> |
329 <li>よってCodeGearはTransactionである</li> | 272 <li>atomicityはOSが保証する</li> |
330 </ul> | 273 <li>これによりTake/Put/PeekがTransactionであることを保証する</li> |
331 </li> | 274 </ul> |
332 <li>ファイルシステム操作もCodeGearで記述されるためTransactionとなる</li> | 275 </li> |
333 <li>トランザクションな操作によってファイルシステムの整合性の保守が行いやすい</li> | |
334 </ul> | 276 </ul> |
335 | 277 |
336 | 278 |
337 | 279 |
338 </div> | 280 </div> |
339 | 281 |
340 <div class='slide'> | 282 <div class='slide'> |
341 <!-- _S9SLIDE_ --> | 283 <!-- _S9SLIDE_ --> |
342 <h2 id="queueによるgearsosのファイル">QueueによるGearsOSのファイル</h2> | 284 <h2 id="queueによるgearsosのファイル">QueueによるGearsOSのファイル</h2> |
343 <ul> | 285 <ul> |
344 <li>GearsOSのファイルはファイルレコードを保持するQueueとなる</li> | 286 <li>GearsOSのファイルはDataGearを保持するQueueとなる</li> |
345 <li>デバイスへの保存はQueueを保存すればよい</li> | 287 <li>オンメモリのファイルに相当する</li> |
346 <li>ファイルはQueueなのでファイルのAPIは大きく二つとなる | 288 <li>Queueをデバイスにcopyして持続性を実現する</li> |
347 <ul> | 289 <li>書き込み先はDataGearManagerで選択する</li> |
348 <li>Put</li> | 290 </ul> |
349 <li>Take</li> | 291 |
350 </ul> | 292 |
351 </li> | 293 |
352 </ul> | 294 </div> |
353 | 295 |
354 | 296 <div class='slide'> |
355 | 297 <!-- _S9SLIDE_ --> |
356 </div> | 298 <h2 id="putのimplementation">PutのImplementation</h2> |
357 | 299 <ul> |
358 <div class='slide'> | 300 <li>QueueのElementをnewで作成する</li> |
359 <!-- _S9SLIDE_ --> | 301 <li>Queueのリンクを構築する</li> |
360 <h2 id="queueapi--put-">QueueAPI -Put-</h2> | 302 <li>継続nextに跳ぶ |
361 <ul> | 303 <pre><code>__code putSingleLinkedQueue(struct SingleLinkedQueue* queue, union Data* data, __code next(...)) { |
362 <li>Put | 304 Element* element = new Element(); |
363 <ul> | 305 element->data = data; |
364 <li>Queueに対してファイルレコードを入力する</li> | 306 element->next = NULL; |
365 <li>ファイルの変更をレコードとして書き込む | 307 queue->last->next = element; |
366 <pre><code>__code putSingleLinkedQueue(struct SingleLinkedQueue* queue, union Data* data, __code next(...)) { | 308 queue->last = element; |
367 Element* element = new Element(); | 309 goto next(...); |
368 element->data = data; | |
369 element->next = NULL; | |
370 queue->last->next = element; | |
371 queue->last = element; | |
372 goto next(...); | |
373 } | 310 } |
374 </code></pre> | 311 </code></pre> |
375 </li> | 312 </li> |
376 </ul> | 313 </ul> |
377 </li> | 314 |
378 </ul> | 315 |
379 | 316 |
380 | 317 </div> |
381 | 318 |
382 </div> | 319 <div class='slide'> |
383 | 320 <!-- _S9SLIDE_ --> |
384 <div class='slide'> | 321 <h2 id="takeのimplementation">TakeのImplementation</h2> |
385 <!-- _S9SLIDE_ --> | 322 <ul> |
386 <h2 id="queueapi--take-">QueueAPI -Take-</h2> | 323 <li>QueueからElement経由でDataGearを取り出す</li> |
387 <ul> | 324 <li>Queueのリンクを修正し、nextでデータを引き渡す</li> |
388 <li>Take | 325 <li>Elementには任意の型のDataGearが格納されている |
389 <ul> | 326 <pre><code>__code takeSingleLinkedQueue(struct SingleLinkedQueue* queue, __code next(union Data* data, ...)) { |
390 <li>Queueからファイルレコードを取り出す</li> | 327 printf("take\n"); |
391 <li>Queue内のレコードをループで全て取り出せば良い | 328 struct Element* top = queue->top; |
392 <pre><code>__code takeSingleLinkedQueue(struct SingleLinkedQueue* queue, __code next(union Data* data, ...)) { | 329 struct Element* nextElement = top->next; |
393 printf("take\n"); | 330 if (queue->top == queue->last) { |
394 struct Element* top = queue->top; | 331 data = NULL; |
395 struct Element* nextElement = top->next; | 332 } else { |
396 if (queue->top == queue->last) { | 333 queue->top = nextElement; |
397 data = NULL; | 334 data = nextElement->data; |
398 } else { | 335 } |
399 queue->top = nextElement; | 336 goto next(data, ...); |
400 data = nextElement->data; | |
401 } | |
402 goto next(data, ...); | |
403 } | 337 } |
404 </code></pre> | 338 </code></pre> |
405 </li> | 339 </li> |
406 </ul> | |
407 </li> | |
408 </ul> | |
409 | |
410 | |
411 | |
412 </div> | |
413 | |
414 <div class='slide'> | |
415 <!-- _S9SLIDE_ --> | |
416 <h2 id="ファイル通信の構成">ファイル通信の構成</h2> | |
417 <ul> | |
418 <li>GearsOSのファイルは大域的に解放された資源としたい | |
419 <ul> | |
420 <li>ファイル自信を通信そのものとして実装する</li> | |
421 <li>Streamに対しsocket接続により遠隔にアクセスする</li> | |
422 </ul> | |
423 </li> | |
424 <li>分散フレームワークChristieのDataGearManagerの仕組みを利用する</li> | |
425 </ul> | 340 </ul> |
426 | 341 |
427 | 342 |
428 | 343 |
429 </div> | 344 </div> |
430 | 345 |
431 <div class='slide'> | 346 <div class='slide'> |
432 <!-- _S9SLIDE_ --> | 347 <!-- _S9SLIDE_ --> |
433 <h2 id="datagearmanager">DataGearManager</h2> | 348 <h2 id="datagearmanager">DataGearManager</h2> |
434 <ul> | 349 <ul> |
435 <li>分散フレームワークChristieの仕組みの一つ</li> | 350 <li>Take/Put/PeekはDataGearManagerに対して行う</li> |
436 <li>keyとvalueの組み合わせとなるDataGearを保持するデータプール</li> | 351 <li>メモリ上のQueueはLocalDGMになる</li> |
437 <li>ChristieではCodeGearManagerと呼ばれるノードがCodeGearとDataGearを管理する</li> | 352 <li>RemoteDGMは他のノードやプロセスあるいはストレージデバイスをあらわす</li> |
438 <li>LocalDGMはノード本体に対応するデータプールである | 353 <li>一つのDataGearManager上に複数のQueueがあり、keyで識別する</li> |
439 <ul> | 354 <li>RemoteDGMに書き込むと相手のLocalDGMに書き込まれる</li> |
440 <li>CodeGearはLocalDGMに対してDataGearを参照する</li> | 355 <li>Take/Peekは書き込みを待ち合わせる</li> |
441 </ul> | 356 <li>複数のTakeを待ち合わせることができる</li> |
442 </li> | |
443 <li>RemoteDGMは接続する相手ノードに対応するデータプールproxyである | |
444 <ul> | |
445 <li>RemoteDGMに対してDataGearを書き込むことで、対応するノードのLocalDGMにデータが書き込まれる</li> | |
446 </ul> | |
447 </li> | |
448 </ul> | 357 </ul> |
449 | 358 |
450 | 359 |
451 | 360 |
452 </div> | 361 </div> |
454 <div class='slide'> | 363 <div class='slide'> |
455 <!-- _S9SLIDE_ --> | 364 <!-- _S9SLIDE_ --> |
456 <h2 id="datagearmanagerによる通信構成">DataGearManagerによる通信構成</h2> | 365 <h2 id="datagearmanagerによる通信構成">DataGearManagerによる通信構成</h2> |
457 <ul> | 366 <ul> |
458 <li>任意の相手のRemoteDGMを作成することでTopologyが形成される</li> | 367 <li>任意の相手のRemoteDGMを作成することでTopologyが形成される</li> |
368 <li>手元のRemoteDGMに書き込むと相手のLocalDGMに書き込まれる</li> | |
369 <li>RemoteDGMはproxyとして動作する</li> | |
370 <li>この構成は分散フレームワークChristie(当研究室作成)と同じ</li> | |
459 </ul> | 371 </ul> |
460 <div style="text-align: center;"> | 372 <div style="text-align: center;"> |
461 <img src="images/Remote_DataGearManager.pdf" alt="RemoteDGMの関係図" width="800" /> | 373 <img src="images/Remote_DataGearManager.pdf" alt="RemoteDGMの関係図" width="800" /> |
462 </div> | 374 </div> |
463 | 375 |
465 | 377 |
466 </div> | 378 </div> |
467 | 379 |
468 <div class='slide'> | 380 <div class='slide'> |
469 <!-- _S9SLIDE_ --> | 381 <!-- _S9SLIDE_ --> |
470 <h2 id="gearsos上のsocket通信">GearsOS上のsocket通信</h2> | 382 <h2 id="socket通信によるremotedgmの実装">socket通信によるRemoteDGMの実装</h2> |
471 <ul> | 383 <ul> |
472 <li>GearsOS上のsocket通信を実装したい</li> | 384 <li>GearsOSはUnix上の言語フレームワークとして実装されている</li> |
473 <li>Queueをsocketに接続し、簡易的なAPIの記述をした | 385 <li>Unixのsocket通信を使ってQueueのputを実装する</li> |
474 <ul> | |
475 <li>Localなqueueに対してRemoteのqueueがソケット接続を行う | |
476 <pre><code>typedef struct CQueue<>{ | |
477 union Data* cQueue; | |
478 union Data* data; | |
479 | |
480 __code whenEmpty(...); | |
481 __code whenEOF(...); | |
482 __code clear(Impl* cQueue, __code next(...)); | |
483 __code put(Impl* cQueue, union Data* data, __code next(...)); | |
484 __code take(Impl* cQueue, __code next(union Data* data, ...)); | |
485 __code isEmpty(Impl* cQueue, __code next(...), __code whenEmpty(...)); | |
486 __code getData(Impl* cQueue, __code next(...), __code whenEOF(...)); | |
487 __code next(...); | |
488 } CQueue; | |
489 </code></pre> | |
490 </li> | |
491 </ul> | |
492 </li> | |
493 </ul> | |
494 | |
495 | |
496 | |
497 </div> | |
498 | |
499 <div class='slide'> | |
500 <!-- _S9SLIDE_ --> | |
501 <h2 id="senddata-codegear">sendData CodeGear</h2> | |
502 <ul> | |
503 <li>proxy側はQueueにputされたDataをsocketで送信する</li> | 386 <li>proxy側はQueueにputされたDataをsocketで送信する</li> |
504 <li>送信されたDataはLocal側でgetDataAPIで取り出される | 387 <li>送信されたDataはLocal側でgetDataAPIで取り出される</li> |
388 <li>send/recvはUnixのAPI | |
505 <pre><code>__code sendDataRemoteDGMQueue(struct RemoteDGMQueue* cQueue, union Data* data, __code next(...), __code whenError(...)){ | 389 <pre><code>__code sendDataRemoteDGMQueue(struct RemoteDGMQueue* cQueue, union Data* data, __code next(...), __code whenError(...)){ |
506 char recv_buf; | 390 char recv_buf; |
507 int send_size, recv_size; | 391 int send_size, recv_size; |
508 | 392 |
509 send_size = send(cQueue->socket, data, sizeof(union Data), 0); | 393 send_size = send(cQueue->socket, data, sizeof(union Data), 0); |
519 | 403 |
520 </div> | 404 </div> |
521 | 405 |
522 <div class='slide'> | 406 <div class='slide'> |
523 <!-- _S9SLIDE_ --> | 407 <!-- _S9SLIDE_ --> |
524 <h2 id="getdata-codegear">getData CodeGear</h2> | 408 <h2 id="受信側の実装">受信側の実装</h2> |
525 <ul> | 409 <ul> |
526 <li>ファイル本体(Local側)はsocketからDataを取り出す</li> | 410 <li>ファイル本体(Local側)はsocketからDataを取り出す</li> |
527 <li>取り出されたデータはQueueにputされる | 411 <li>取り出されたデータはQueueにputされる |
528 <pre><code>__code getDataLocalDGMQueue(struct LocalDGMQueue* cQueue, __code next(...), __code whenError(...)){ | 412 <pre><code>__code getDataLocalDGMQueue(struct LocalDGMQueue* cQueue, __code next(...), __code whenError(...)){ |
529 int recv_size, send_size; | 413 int recv_size, send_size; |
548 <!-- _S9SLIDE_ --> | 432 <!-- _S9SLIDE_ --> |
549 <h2 id="複数のストリームから構成されるファイル">複数のストリームから構成されるファイル</h2> | 433 <h2 id="複数のストリームから構成されるファイル">複数のストリームから構成されるファイル</h2> |
550 <ul> | 434 <ul> |
551 <li>入力されるデータに応じた個別のstreamを備えたい | 435 <li>入力されるデータに応じた個別のstreamを備えたい |
552 <ul> | 436 <ul> |
553 <li>streamと入力されたデータの処理を直接結びつけたい</li> | 437 <li>例えばUSBは複数のチャネルを持つ</li> |
554 </ul> | 438 <li>メタデータの取り出しは別streamになる</li> |
555 </li> | 439 <li>通信として使う場合に複数のプロトコルがある方が良い(FTP)</li> |
556 <li>最低でもInput/OutputStreamの二つが必要となる</li> | 440 </ul> |
557 <li>ファイルは複数のStreamを持ったリストとして実装する</li> | 441 </li> |
558 <li>Streamはkey nameを持ち、keyでアクセスを行う</li> | 442 <li>Streamはkey nameを持ち、keyでアクセスを行う</li> |
559 </ul> | 443 <li>赤黒木を用いる</li> |
560 | |
561 | |
562 | |
563 </div> | |
564 | |
565 <div class='slide'> | |
566 <!-- _S9SLIDE_ --> | |
567 <h2 id="複数のストリームを持つファイルの設計">複数のストリームを持つファイルの設計</h2> | |
568 <ul> | |
569 <li>Queueのリストとして赤黒木を用いる | |
570 <ul> | |
571 <li>key/value storeなアクセスを行うことができる</li> | |
572 <li>GearsOS上にすでに実装が行われている</li> | |
573 </ul> | |
574 </li> | |
575 <li>DataのTake/Put時には必ずkey nameの指定が必要となる</li> | 444 <li>DataのTake/Put時には必ずkey nameの指定が必要となる</li> |
576 </ul> | 445 </ul> |
577 | 446 |
578 | 447 |
579 | 448 |
580 </div> | 449 </div> |
581 | 450 |
582 <div class='slide'> | 451 <div class='slide'> |
583 <!-- _S9SLIDE_ --> | 452 <!-- _S9SLIDE_ --> |
584 <h2 id="リスト単位の通信の構成">リスト単位の通信の構成</h2> | 453 <h2 id="socketを使ったremotedgm">socketを使ったRemoteDGM</h2> |
585 <ul> | 454 <ul> |
586 <li>指定したkeyのQueueが探索で返される</li> | 455 <li>RemoteDGMに書き込みが行われるとsocketで通信が起きる</li> |
587 <li>proxyの場合、どのkeyに対してどんなDataを書き込んだかを通信で送信する</li> | 456 <li>受信側はLocalDGMにDataGearを書き込む</li> |
588 </ul> | 457 </ul> |
589 <div style="text-align: center;"> | 458 <div style="text-align: center;"> |
590 <img src="images/socketCom.pdf" alt="socketを通じたレコード送信" width="800" /> | 459 <img src="images/socketCom.pdf" alt="socketを通じたレコード送信" width="800" /> |
591 </div> | 460 </div> |
592 | 461 |
594 | 463 |
595 </div> | 464 </div> |
596 | 465 |
597 <div class='slide'> | 466 <div class='slide'> |
598 <!-- _S9SLIDE_ --> | 467 <!-- _S9SLIDE_ --> |
599 <h2 id="wordcount例題による通信apiの構築">wordCount例題による通信APIの構築</h2> | 468 <h2 id="wordcountの例題">wordCountの例題</h2> |
600 <ul> | 469 <ul> |
601 <li>DataGearManagerによるファイル通信APIはWordCount例題を目指して設計した | 470 <li>ファイル内の文字列を1行づつ受け取り、文字列,行数をカウントする例題</li> |
602 <ul> | |
603 <li>ファイル内の文字列を1行づつ受け取り、文字列,行数をカウントする例題</li> | |
604 </ul> | |
605 </li> | |
606 <li>文字列送信側とCount側を別ノード上で行うことで、ファイルの呼び出しと通信処理が構成できる</li> | 471 <li>文字列送信側とCount側を別ノード上で行うことで、ファイルの呼び出しと通信処理が構成できる</li> |
472 <li>RemoteDGMへの書き込みで通信する</li> | |
473 <li>acknowredgeを逆方向のRemoteDGMによる通信で実現する(現在は直接送信)</li> | |
607 </ul> | 474 </ul> |
608 <div style="text-align: center;"> | 475 <div style="text-align: center;"> |
609 <img src="images/slideGearsWC.pdf" alt="リモートDGMによるWordCount" width="800" /> | 476 <img src="images/slideGearsWC.pdf" alt="リモートDGMによるWordCount" width="800" /> |
610 </div> | 477 </div> |
611 | 478 |
684 <ul> | 551 <ul> |
685 <li>keyアクセスが行えるQueueのリスト</li> | 552 <li>keyアクセスが行えるQueueのリスト</li> |
686 <li>リスト単位での通信の記述</li> | 553 <li>リスト単位での通信の記述</li> |
687 </ul> | 554 </ul> |
688 </li> | 555 </li> |
689 </ul> | |
690 | |
691 | |
692 | |
693 </div> | |
694 | |
695 <div class='slide'> | |
696 <!-- _S9SLIDE_ --> | |
697 <h2 id="gearsosの生成形の問題点">GearsOSの生成形の問題点</h2> | |
698 <ul> | |
699 <li>GearsOSのメタレベルの処理の記述はトランスコンパイラにより行われる</li> | |
700 <li>場合によりメタレベルの記述を行わなくてはならない | |
701 <ul> | |
702 <li>他のInterfaceを継承したオブジェクトからのDataGear継承 | |
703 <ul> | |
704 <li>例)Queueからのデータ取り出し</li> | |
705 <li>トランスコンパイラはどのInterfaceに記述されたDataGearを参照するべきか判断が難しい</li> | |
706 </ul> | |
707 </li> | |
708 </ul> | |
709 </li> | |
710 </ul> | |
711 | |
712 <pre><code>__code Task2(TQueue* localDGMQueue){ | |
713 goto localDGMQueue->take(Task3); | |
714 } | |
715 | |
716 __code Task3(TQueue* localDGMQueue, FileString* string){ | |
717 printf("take[%s] [num:%d]\n", string->str, string->size); | |
718 goto getData(); | |
719 } | |
720 | |
721 //プログラマが実装したいstub | |
722 __code Task3_stub(struct Context* context){ | |
723 TQueue* localDGMQueue = (struct TQueue*)Gearef(context, TQueue)->tQueue; | |
724 FileString* string = Gearef(context, TQueue)->data; | |
725 goto Task3(context, localDGMQueue, string); | |
726 } | |
727 | |
728 //自動生成されたErrorなstub | |
729 __code Task3_stub(struct Context* context) { | |
730 TQueue* localDGMQueue = Gearef(context, TQueue); | |
731 FileString* string = Gearef(context, FileString); | |
732 goto Task3(context, localDGMQueue, string); | |
733 } | |
734 </code></pre> | |
735 | |
736 | |
737 | |
738 </div> | |
739 | |
740 <div class='slide'> | |
741 <!-- _S9SLIDE_ --> | |
742 <h2 id="並列処理構文par-gotoが持つ問題">並列処理構文par gotoが持つ問題</h2> | |
743 <ul> | |
744 <li>par gotoとはGearsOSに実装された並列処理構文である</li> | |
745 <li>StreamQueueに対するput/takeの並列処理の実装をpar goto構文で試みた</li> | |
746 <li>par gotoはトランスコンパイラへの依存性が高い | |
747 <ul> | |
748 <li>stubCodeGearのように任意な書き換えが行えない</li> | |
749 </ul> | |
750 </li> | |
751 <li>特定のCodeGearの宣言のみでしか正常な処理が生成されない | |
752 <ul> | |
753 <li>Interfaceに記述されたAPICodeGearではバグが生じる</li> | |
754 <li>par gotoでの使用を前提としたCodeGearを書かなくてはならない</li> | |
755 </ul> | |
756 </li> | |
757 <li>処理が重いという問題点も存在する</li> | |
758 </ul> | 556 </ul> |
759 | 557 |
760 | 558 |
761 | 559 |
762 </div> | 560 </div> |
819 | 617 |
820 </div> | 618 </div> |
821 | 619 |
822 <div class='slide'> | 620 <div class='slide'> |
823 <!-- _S9SLIDE_ --> | 621 <!-- _S9SLIDE_ --> |
824 <h2 id="この先保留">この先保留</h2> | 622 <h2 id="gearsosの生成形の問題点">GearsOSの生成形の問題点</h2> |
825 | 623 <ul> |
826 | 624 <li>GearsOSのメタレベルの処理の記述はトランスコンパイラにより行われる</li> |
827 | 625 <li>場合によりメタレベルの記述を行わなくてはならない |
828 </div> | 626 <ul> |
829 | 627 <li>他のInterfaceを継承したオブジェクトからのDataGear継承 |
830 <div class='slide'> | 628 <ul> |
831 <!-- _S9SLIDE_ --> | 629 <li>例)Queueからのデータ取り出し</li> |
832 <h2 id="gearsosのディレクトリとバックアップ">GearsOSのディレクトリとバックアップ</h2> | 630 <li>トランスコンパイラはどのInterfaceに記述されたDataGearを参照するべきか判断が難しい</li> |
833 <ul> | 631 </ul> |
834 <li>又吉雄斗による並行研究にて、inodeによるファイルシステムが開発されている</li> | 632 </li> |
835 <li>赤黒木の非破壊な編集により、ディレクトリの履歴を残すことができる</li> | 633 </ul> |
836 </ul> | 634 </li> |
837 <div style="text-align: center;"> | 635 </ul> |
838 <img src="images/nonDestroyTreeEdit.pdf" alt="非破壊的なツリー編集" width="800" /> | 636 |
839 </div> | 637 <pre><code>__code Task2(TQueue* localDGMQueue){ |
840 | 638 goto localDGMQueue->take(Task3); |
841 | 639 } |
842 | 640 |
843 </div> | 641 __code Task3(TQueue* localDGMQueue, FileString* string){ |
844 | 642 printf("take[%s] [num:%d]\n", string->str, string->size); |
845 <div class='slide'> | 643 goto getData(); |
846 <!-- _S9SLIDE_ --> | 644 } |
847 <h2 id="ファイルqueueに対するapi--peek-">ファイルQueueに対するAPI -Peek-</h2> | 645 |
848 <ul> | 646 //プログラマが実装したいstub |
849 <li>Peek | 647 __code Task3_stub(struct Context* context){ |
850 <ul> | 648 TQueue* localDGMQueue = (struct TQueue*)Gearef(context, TQueue)->tQueue; |
851 <li>QueueのElementを参照するが、削除は行わない</li> | 649 FileString* string = Gearef(context, TQueue)->data; |
852 <li>現時点での実装は行っていない</li> | 650 goto Task3(context, localDGMQueue, string); |
853 <li>QueueのTopのレコードを変更せずに出力すれば良い | 651 } |
854 <!–</li> | 652 |
855 </ul> | 653 //自動生成されたErrorなstub |
856 </li> | 654 __code Task3_stub(struct Context* context) { |
857 <li>RocalDGMを立ち上げるにはDataSegmentクラスが提供する、connectメソッドを用い、接続したいポートのipアドレスとport番号、そして任意のManager名を指定することで立ち上げる。 | 655 TQueue* localDGMQueue = Gearef(context, TQueue); |
858 –></li> | 656 FileString* string = Gearef(context, FileString); |
657 goto Task3(context, localDGMQueue, string); | |
658 } | |
659 </code></pre> | |
660 | |
661 | |
662 | |
663 </div> | |
664 | |
665 <div class='slide'> | |
666 <!-- _S9SLIDE_ --> | |
667 <h2 id="並列処理構文par-gotoが持つ問題">並列処理構文par gotoが持つ問題</h2> | |
668 <ul> | |
669 <li>par gotoとはGearsOSに実装された並列処理構文である</li> | |
670 <li>StreamQueueに対するput/takeの並列処理の実装をpar goto構文で試みた</li> | |
671 <li>par gotoはトランスコンパイラへの依存性が高い | |
672 <ul> | |
673 <li>stubCodeGearのように任意な書き換えが行えない</li> | |
674 </ul> | |
675 </li> | |
676 <li>特定のCodeGearの宣言のみでしか正常な処理が生成されない | |
677 <ul> | |
678 <li>Interfaceに記述されたAPICodeGearではバグが生じる</li> | |
679 <li>par gotoでの使用を前提としたCodeGearを書かなくてはならない</li> | |
680 </ul> | |
681 </li> | |
682 <li>処理が重いという問題点も存在する</li> | |
683 </ul> | |
684 | |
685 | |
686 | |
687 </div> | |
688 | |
689 <div class='slide'> | |
690 <!-- _S9SLIDE_ --> | |
691 <h2 id="以下返答用">以下返答用</h2> | |
692 | |
693 | |
694 | |
695 </div> | |
696 | |
697 <div class='slide'> | |
698 <!-- _S9SLIDE_ --> | |
699 <h2 id="takeputpeek-1">Take/Put/Peek</h2> | |
700 <ul> | |
701 <li>PeekはReadOnly (最新の設定を読みこむなど)</li> | |
702 <li>Take/PutはDGが一つならUpDataに相当する</li> | |
703 <li>書き込みが単一スレッドなら順序は保証される</li> | |
704 <li>書き込みが複数の場合、Putの順序は保証されない</li> | |
705 <li>データベースとの違い | |
706 <ul> | |
707 <li>putがQueueとして蓄積される</li> | |
708 <li>Keyが一つしかない(通信路として使える)</li> | |
709 </ul> | |
710 </li> | |
711 </ul> | |
712 | |
713 | |
714 | |
715 </div> | |
716 | |
717 <div class='slide'> | |
718 <!-- _S9SLIDE_ --> | |
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> | |
727 | |
728 | |
729 | |
730 </div> | |
731 | |
732 <div class='slide'> | |
733 <!-- _S9SLIDE_ --> | |
734 <h2 id="codegearと再帰呼び出し">CodeGearと再帰呼び出し</h2> | |
735 <ul> | |
736 <li>再起呼び出ししなければ関数呼び出し的に使える(末尾再起)</li> | |
737 <li>再帰呼び出ししたい場合、明示的に自分でStackを作る</li> | |
738 <li>…はContextにすべて置かれている</li> | |
739 <li>Processはすべて異なるContextを持っている</li> | |
740 <li>Context自体は共有されない</li> | |
741 </ul> | |
742 | |
743 | |
744 | |
745 </div> | |
746 | |
747 <div class='slide'> | |
748 <!-- _S9SLIDE_ --> | |
749 <h2 id="datagearの型">DataGearの型</h2> | |
750 <ul> | |
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>メタプログラミングを利用してこの重複を消すことは可能 | |
771 <ul> | |
772 <li>しかし煩雑</li> | |
773 </ul> | |
774 </li> | |
859 </ul> | 775 </ul> |
860 | 776 |
861 </div> | 777 </div> |
862 | 778 |
863 | 779 |