annotate code-mangement.ind @ 4:c0d369375b21

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 17 Apr 2023 13:26:48 +0900
parents 42df4feebde2
children c6bea5a028fd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 -title: Gears OSの CodeGear Management
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 -author: 河野真治
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
5 --Gears OSによる信頼できるサービス
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
6
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
7 サービスやアプリケーションの信頼性は、OSとユーザプログラムのように分離することはできない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
8 プログラムの正しさは基本的にはコードの正しさであり、今のOSのようにコードの管理をユーザ空間の
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
9 問題として放り出す方法には限界がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
11 Gears OSでは実行単位として codeGear、データ単位として dataGear を使う。さらに、これらは
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
12 Monad のようにメタ codeGeearやメタdataGearを持っている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
14 Gears OSでの検証は、Agdaを使った GearsAgdaを用いる。これらの実行と並列実行は、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
15 GearsAgdaに対して定義される。当然、すべてのGearsAgdaのcodeGearは、Gears OSに
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
16 登録されることになる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
18 この論文では、Gears OSのcodeGearの管理方法について考察する。
0
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 --Normal and Meta computation
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
22 Gears OSの基本は、CbC (Continuation based C)であり、input interfaceとoutput interfaceを有限な処理で
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
23 結ぶものになっている。これは、コンパイラの基本ブロックに大体相当する。これはさらに、GearsAgdaの
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
24 Agdaで記述された invariant あるいは、表示的意味論と直結している。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
25
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
26 CbCの記述は以下のようなものである。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
27
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
28 __code startTimer(struct TimerImpl* timer, __code next(...)) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
29 struct timeval tv;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
30 gettimeofday(&tv, NULL);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
31 timer->time = tv.tv_sec + (double)tv.tv_usec*1e-6;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
32 goto next(...);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
33 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
34
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
35 nextが軽量継続を表している。このcodeGearの実行は論理的に割り込まれない。つまり、並行実行は
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
36 この単位で行われ定義される。ハードウェアでの並行実行、割り込み処理などは、それにそって
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
37 実装される必要がある。これらは、GearsAgdaでは、外部環境へのアクセスがある。この場合は
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
38 時刻に対するアクセスである。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
39
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
40 OS側からみると、これは詳細のない単なるコードに見える。実行の詳細、つまり、実行に関係する
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
41 すべての dataGear 、すべてのcodeGearは、プロセスに相当する Context metaDataGearに格納される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
42
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
43 つまり、OSからみた codeGearの実行は、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
44
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
45   Contextから詳細を取り出すmeta codeGearの番号から、codeGearを選ぶ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
46   それを実行し、continuation としてshcedulerを指定する
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
47   これを CPU worker 毎に実行する
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
48
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
49 ということになる。CPU worker毎に Contextは一つなので、Contextはsingle threadで実行される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
50 これにより、並行実行の単位はcodeGearとなる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
51 ただし、Context関の共有データがある場合は意味的なずれがでる場合がある。それは、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
52 Contextの実行をそうなるように実装することになる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
53
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
54 その実装の正しさは、実装を GearsAgdaで記述することより可能になるが、その実装が物理的に一致するかどうかの
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
55 保証はハードウェアの性質に依存する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
56
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
57 外界との対応もメタ計算になるが、それはGearsAgdaによるシミュレーションに対する正しさということになる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
58
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
59 scheduler から codeGearへの移行は、以下のmeta codeGear で実装される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
60
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
61 __code meta(struct Context* context, enum Code next) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
62 goto (context->code[next])(context);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
63 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
64
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
65
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
66 \verb+context->code[next]+が codeGearのtableの呼び出しになるが、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
67 これは表がコンパイル時に確定し、直接の呼び出しでは、コンパイラが最適化するので、overhead とはならない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
68 meta が書き換えられている場合は、ここで Context switchが起きることになる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
69
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
70 このContext switchでメモリ空間の切り替えが必要かどうかは application に依存する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
71 もし、codeGearの実行の正しさが証明されているなら、メモリ空間を切り替える必然性はない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
72 実際、Kernel 内や Realtime Monitor では切り替えない方が普通である。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
73
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
74 --証明付きのコード
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
75
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
76 GearsAgdaで記述されていれば、codeGearやdataGearは証明を持つ。これらは単なる型なので実行時には
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
77 実態を持たない。ただし、それを実行時にチェックすることもできる。assertなどと同じ扱いである。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
78
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
79 GearsAgdaの証明に閉じていれば、その範囲内での信頼性がある。しかし、動的にcodeが読み込まれる場合は
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
80 そうはならない。その時には、証明しなおす、簡易あるいは詳細なモデル検査を実施するなどが可能だが、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
81 それらが実用的とは限らない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
82
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
83 codeはContextの表に登録されるが、システム全体のcodeは Database で管理される。その管理は
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
84 ファイルシステム上でも良い。codeは証明が付属している場合もあるが、それは何らかの形で
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
85 codeGear Databseに格納される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
86
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
87 現状では、証明はAgdaで記述されたデータ構造でしかない。それをcodeGear DBに入れても利用する方法は
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
88 ないがいくつかの利用法は考えられる。
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
89
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
90 証明とcodeGearの一致を確認する
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
91 型整合に使う
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
92 codeの認証に使う
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
93
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
94 この大域のcodeGear DBは、kernelを含めたすべてのcodeGearに対するもので全部で共有される。つまり、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
95 あらゆるversionを含む共有ライブラリとなる。これは全世界でuniqueなDBとしても良い。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
96
4
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
97 --CbCのcodeGear と GearsAgdaの違い
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
98
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
99 CbCのcodeGearとdataGearは、普通のCの関数と構造体であり、その意味で不思議なところはない。しかし、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
100 normal levelではpointerが出てこないのが望ましい。なぜなら、メモリ配置は meta levelの問題で
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
101 プログラムの正しさとは直接関係しないからである。つまり、normal levelでの構造体は List や 木
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
102 など以外の再帰的構造でも直接的なポインタ操作は行わない。meta levelでは、メモリの直接操作
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
103 例えば mallocやfree、あるいは共有データの扱いなどをポインタを通して行う。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
104
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
105 meta levelでのポインタ操作は、データ構造に対する操作であり、そのlevelに閉じる限り、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
106 プログラムの正しさはポインタの実装に依存しない。その意味で、meta codeGear も単なる
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
107 noraml level のcodeGear に過ぎない。meta codeGearの証明あるいは、実装をさらにmeta level
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
108 で行うこともできる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
109
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
110 GearsAgda では、すべてはAgdaの構造体で表現される。これらは変数と項であり、基本的に複製可能
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
111 な項である。その意味で、ポインタを持たないと言ってよい。Listや木の実装を配列と番号で行う
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
112 ことはまったく実用的ではないので、普通に再帰的なデータ構造を使ってよい。ただし、それを
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
113 自分自身の codeGear の再帰呼び出しで行うと、codeGearの実行が有界な時間に閉じなくなる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
114 なので、loop は軽量継続を用いて、一旦、外にでることになる。これは、この段階でmeta level的に処理が
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
115 割り込まれることも意味している。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
116
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
117 GearsAgda で処理された項は、ContextのdataGearに格納される。また、GearsAgdaのcodeGearは、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
118 Contextのcode tableに格納される。どちらも、メモリ的には番号で管理されることになる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
119 GearsAgda の Context は、その意味で、プロセスのメモリ空間そのものを抽象化したものになっている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
120
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
121
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
122 つまり、CbCのcodeGearと GearsAgdaは、normal level ではポインタを使わないのだが、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
123 その意味は、CbCと GearsAgda で若干異なる。CbCでの実装は、GearsAgdaでの実装の持つ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
124 性質を保存する必要がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
125
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
126 --Contextを通した dataGearとcodeGearの連携
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
127
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
128 Gears OSでは、Context はCの構造体であり、一つのContextで使用するdataGearとcodeGearは、そこに格納される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
129 複数のContextから、dataGearもcodeGearも共有されることがある。その排他制御は、Gears OSのmeta codeGearに
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
130 よって行われる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
131
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
132 Gears OSは、interfaceという構造体でオブジェクト表現していて、これらには、メソッドを格納する配列がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
133 この配列の添字を他のinterfaceが使用する。なので、interface間の呼び出しは、interfaceを表すdataGearと
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
134 そのメソッドの番号で決定される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
135
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
136 引数は、interface毎に Contextに決まった場所が確保される。これは、通常ではstack上に場所を確保する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
137 しかし、CbCでは関数呼び出しはstackを使わないので、このようにする必要がある。これは、もちろん、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
138 マルチスレッドな実行では破壊されるおそれがあるが、Contextはシングルスレッドで実行することになっている
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
139 ので問題ない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
140
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
141 Contextの切り替えは、codeGearの境目で行われるので、Contextと実行しているcodeGearのcode tableの番号で
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
142 状態が決定する。つまり、Gears OSでは、Task Switchにはレジスタは関係しない。割り込みなどは、codeGearの
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
143 境界と独立に起きるが、それをmeta codeGearが境界で Context switchが起きたのと同じようにすることを
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
144 保証する。これは一種の遅延処理となる。もちろん、影響がないなら、割り込み中にmetaな処理を行ってもよい。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
145 これは、本来はCPUなどのハードウェアでサポートされるべきかもしれない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
146
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
147 dataGearは、metaな情報として、dataGearの構造定義を番号として持っている。これを使うことにより
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
148 任意のdataGearの表示を正しく行うことができる。この情報を取り扱うことは meta level からでしか
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
149 許されないが、CbC的には特に制限はない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
150
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
151 引数として呼び出される dataGearは、Context上に前もって確保されているが、実行時にallocateされる
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
152 dataGearもContextから参照される pool に確保される。これの管理は meta dataGear (Gears OSのkernel)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
153 が行う。GearsAgda は、この部分はAgdaが管理するので meta的な管理は行われない。しかし、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
154 Context を用いた並行実行の場合は、Context上での管理の問題が生じる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
155
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
156
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
157 --codeGearのlinkage
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
158
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
159 Gears OSのあらゆるコードは、codeGear DBのコードの組み合わせになる。しかし、そのためには、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
160 Contextから詳細なデータを取り出して、実行し、次のcodeGearを呼び出す時にContextの正しい場所にdataGearを格納する
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
161 必要がある。これは codeGear 全体に対して必要になる。
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
162
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
163 現状では、これは stubとしてコンパイル時に生成される。
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
164
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
165 __code checkAndSetAtomicReference(struct AtomicReference* atomic, union Data** ptr, union Data* oldData, union Data* newData, __code next(...), __code fail(...)) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
166 if (__sync_bool_compare_and_swap(ptr, oldData, newData)) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
167 goto next(...);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
168 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
169 goto fail(...);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
170 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
171
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
172 では、Context 上には以下の構造と、それを呼び出す stub がある。
0
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
173
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
174 struct Atomic {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
175 union Data* atomic;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
176 union Data** ptr;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
177 union Data* oldData;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
178 union Data* newData;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
179 enum Code checkAndSet;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
180 enum Code next;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
181 enum Code fail;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
182 } Atomic;
0
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
183
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
184 __code checkAndSetAtomicReference_stub(struct Context* context) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
185 AtomicReference* atomic = (AtomicReference*)GearImpl(context, Atomic, atomic);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
186 Data** ptr = Gearef(context, Atomic)->ptr;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
187 Data* oldData = Gearef(context, Atomic)->oldData;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
188 Data* newData = Gearef(context, Atomic)->newData;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
189 enum Code next = Gearef(context, Atomic)->next;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
190 enum Code fail = Gearef(context, Atomic)->fail;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
191 goto checkAndSetAtomicReference(context, atomic, ptr, oldData, newData, next, fail);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
192 }
0
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
193
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
194 これらは単一のGears OS内で整合する必要がある。実際には、これらは、stubが参照する Context内のoffsetにすぎない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
195 Atomic は dataGear の巨大な Union になっている。これは、GearsAgda でも状況は同じで、巨大な Sum type になっている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
196
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
197 このContext内での offsetと呼び出すcodeGearの番号が一致すれば、Kernel側で整合性の問題はない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
198
4
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
199 --codeGearのコンパイル方法
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
200
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
201 現在の Gears OSのcodeGearは、interfaceを含む記述を .cbc に書き、それを CbC に変換している。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
202 この時に、meta codeGear として stub そして、meta dataGearとして Context の定義が生成される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
203
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
204 Context の定義は Application 毎に異なっているが、全部をそろえることも可能である。この変換は
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
205 Perl script で記述されていて、煩雑になっている。これを codeGear / interface 単位で .o と
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
206 meta dataGearにできれば、全体の構成と、interfaceのコンパイルが簡単になると期待される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
208 ただし、この場合は、Context の中での引数領域のoffset管理、code tableの初期化、code間の
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
209 遷移を扱う codeGearの番号の指定の書き換えなどが必要となる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
210
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
211 --static linkage
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
212
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
213 コンパイル時に codeGearの結合が明らかならば、それは一つのcodeGearとしてまとめてよい。Contextへの書き込みもさぼることが
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
214 可能になる。ただし、時分割実行される場合は、codeGearの切れ目で分割するのと同じ実行が要求される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
215 つまり、割り込み処理などで途中で実行が中断するならば、それはその単位まで実行してから、Contextを切り替える必要がある。
0
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
216
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
217 これを実現する手法はflagを参照する方法や、コードを書き換える方法あるいは、polingを埋め込むなどの方法が考えられる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
218 整合性が不要であれば途中で止めても問題ないが、その場合は register などの状態を従来のOSのように保持する必要がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
219
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
220 codeGear単位で正直に分割コンパイルすると最適化の余地がない。しかし、その場合でもJITなどは可能である。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
221
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
222 --boot codeGear
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
223
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
224 今の実装では、UEFIから Gears OSが読み出される。Gears OS自体は、x.v6\cite{}と同じで、ファイルシステムを
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
225 含む一体の binary になっている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
226
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
227 codeGear DBを実装すれば、かなりの部分を後からロードすることが可能になる。
0
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
228
4
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
229
0
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
230 --まとめ
4
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
231
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
232 Gears OS と GearsAgda における codeGear の管理方法について考察した。将来的には GearsAgda で記述された
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
233 証明付きinterfaceのコードを CbC に変換し、それを Gears OSで正しさを確認しながら組み合わせて、meta計算の
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
234 変更を可能にしながら実行するシステムを作りたい。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
235
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
236
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
237
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
238
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
239