annotate TaskManager/Changelog @ 95:6315da182c66

*** empty log message ***
author gongo
date Thu, 28 Feb 2008 18:04:06 +0900
parents 1c648675c2bd
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
95
6315da182c66 *** empty log message ***
gongo
parents: 80
diff changeset
1 2008-02-28 Wataru MIYAGUNI <gongo@cr.ie.u-ryukyu.ac.jp>
6315da182c66 *** empty log message ***
gongo
parents: 80
diff changeset
2
6315da182c66 *** empty log message ***
gongo
parents: 80
diff changeset
3 * kernel/ppe/BufferManager.cpp: remove_taskQueue_all()
6315da182c66 *** empty log message ***
gongo
parents: 80
diff changeset
4 taskQueue の create と free が釣り合って無くて、
6315da182c66 *** empty log message ***
gongo
parents: 80
diff changeset
5 queue が足りなくなる -> extend_pool -> 足りなく(ry
6315da182c66 *** empty log message ***
gongo
parents: 80
diff changeset
6 ってのを繰り返してメモリ的なセグメンテーションフォルとが出て
6315da182c66 *** empty log message ***
gongo
parents: 80
diff changeset
7 なんでかなと思ったら、task->wait_me を消去してなかった。
6315da182c66 *** empty log message ***
gongo
parents: 80
diff changeset
8 task->wait_i は notify(ry で削除されるんだけど、
6315da182c66 *** empty log message ***
gongo
parents: 80
diff changeset
9 task->wait_me は、notify(ry に渡した後ほったらかしだった。
6315da182c66 *** empty log message ***
gongo
parents: 80
diff changeset
10 ってことで、wait_me を全消しする関数を作りましたとさ。
6315da182c66 *** empty log message ***
gongo
parents: 80
diff changeset
11 気持ち速度が増した気がする。気ね。
6315da182c66 *** empty log message ***
gongo
parents: 80
diff changeset
12
6315da182c66 *** empty log message ***
gongo
parents: 80
diff changeset
13
63
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
14 2008-02-17 Wataru MIYAGUNI <gongo@cr.ie.u-ryukyu.ac.jp>
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
15
80
1c648675c2bd *** empty log message ***
gongo
parents: 63
diff changeset
16 * Todo: 悩んでる所
1c648675c2bd *** empty log message ***
gongo
parents: 63
diff changeset
17
1c648675c2bd *** empty log message ***
gongo
parents: 63
diff changeset
18
63
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
19 * fix: kernel/ppe/HTask.cpp
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
20 今まで、manager->create_task で生成したタスクは
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
21
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
22 - dependency の設定
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
23 manager->set_task_depend(master, slave) // slave は master を待つ
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
24
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
25 - 実行キューへの追加
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
26 manager->spawn_task(master);
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
27 manager->spawn_task(slave);
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
28
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
29 と、manager を介してやっていました。
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
30 まあそれでもいいんだけど、特に dependency の所は
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
31 どっちがどっちを待つのかってのは、API見るだけじゃわからない。
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
32 そこで、Task (HTask のこと) に、上二つに対応するような
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
33
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
34 void set_depend(HTaskPtr) と void spawn(void) を追加しました。
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
35
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
36 - Usage
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
37 slave->set_depend(master); // slave は master を待つ
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
38 slave->spawn(); // slave をキューへ追加
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
39
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
40 結局は、それぞれの関数の中では、上の set_task_depend とかを
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
41 呼んでるんだけど、ユーザ側からするとこの方がわかりやすいと思います。
54355e641172 *** empty log message ***
gongo
parents: 62
diff changeset
42
56
4d554afb22b6 *** empty log message ***
gongo
parents: 29
diff changeset
43 2008-02-16 Wataru MIYAGUNI <gongo@cr.ie.u-ryukyu.ac.jp>
4d554afb22b6 *** empty log message ***
gongo
parents: 29
diff changeset
44
4d554afb22b6 *** empty log message ***
gongo
parents: 29
diff changeset
45 * tag: beta3
4d554afb22b6 *** empty log message ***
gongo
parents: 29
diff changeset
46 ダブルバッファリングを追加し、まあなんとか動いてるんじゃない?って
4d554afb22b6 *** empty log message ***
gongo
parents: 29
diff changeset
47 ところまでですが、所詮 Fifo バージョンなので、
4d554afb22b6 *** empty log message ***
gongo
parents: 29
diff changeset
48 そろそろ Cell を書き上げて、並列にちゃんと動いてるか確かめないとね
4d554afb22b6 *** empty log message ***
gongo
parents: 29
diff changeset
49
4d554afb22b6 *** empty log message ***
gongo
parents: 29
diff changeset
50 * add: kernel/ppe/DmaBuffer.cpp
4d554afb22b6 *** empty log message ***
gongo
parents: 29
diff changeset
51 ダブルバッファリング用に作ったんだけど、
4d554afb22b6 *** empty log message ***
gongo
parents: 29
diff changeset
52 せっかくなので、DMA は、このオブジェクト(が持つ二つの領域)でしか
4d554afb22b6 *** empty log message ***
gongo
parents: 29
diff changeset
53 行えないようにする。ってのでどうでしょう。って話を先生としました。
4d554afb22b6 *** empty log message ***
gongo
parents: 29
diff changeset
54 並列処理だし、ダブルバッファリングがデフォでいいでしょう。
4d554afb22b6 *** empty log message ***
gongo
parents: 29
diff changeset
55 というか、したくなければ swap_buffer とかしなければおk。
4d554afb22b6 *** empty log message ***
gongo
parents: 29
diff changeset
56
62
b03e4cb64302 *** empty log message ***
gongo
parents: 56
diff changeset
57 -Usage
b03e4cb64302 *** empty log message ***
gongo
parents: 56
diff changeset
58 DmaBuffer *buffer = manager->allocate(sizeof(SceneGraphPack));
b03e4cb64302 *** empty log message ***
gongo
parents: 56
diff changeset
59
b03e4cb64302 *** empty log message ***
gongo
parents: 56
diff changeset
60 今までと違い、create_task の in_addr と out_addr には
b03e4cb64302 *** empty log message ***
gongo
parents: 56
diff changeset
61 DmaBuffer をいれてください。ユーザが自分で malloc/new したやつは
b03e4cb64302 *** empty log message ***
gongo
parents: 56
diff changeset
62 エラーを出すようにしてる(seg faultだけどね!)
b03e4cb64302 *** empty log message ***
gongo
parents: 56
diff changeset
63 汚いソースだが、実際に使ってる様子は Test/simple_render の
b03e4cb64302 *** empty log message ***
gongo
parents: 56
diff changeset
64 viewer.cpp で使ってます。sgp_buff と pp_buff ってやつね。
b03e4cb64302 *** empty log message ***
gongo
parents: 56
diff changeset
65
b03e4cb64302 *** empty log message ***
gongo
parents: 56
diff changeset
66 もうすこしユーザに優しいAPIを作りたい・・・
b03e4cb64302 *** empty log message ***
gongo
parents: 56
diff changeset
67
29
e949a536a68d *** empty log message ***
gongo
parents: 24
diff changeset
68 2008-02-11 Wataru MIYAGUNI <gongo@cr.ie.u-ryukyu.ac.jp>
e949a536a68d *** empty log message ***
gongo
parents: 24
diff changeset
69
e949a536a68d *** empty log message ***
gongo
parents: 24
diff changeset
70 * add: Test/simple_render
e949a536a68d *** empty log message ***
gongo
parents: 24
diff changeset
71 chiaki の DataPack を使った Cube の表示プログラム。
e949a536a68d *** empty log message ***
gongo
parents: 24
diff changeset
72 簡単に DataPack を TaskManager の scheduler (SpeManager) に渡して
e949a536a68d *** empty log message ***
gongo
parents: 24
diff changeset
73 処理してコピーして、を繰り返してるだけなんだけど
e949a536a68d *** empty log message ***
gongo
parents: 24
diff changeset
74 まあ動いてる気がするのでいいんじゃないでしょうか。
e949a536a68d *** empty log message ***
gongo
parents: 24
diff changeset
75
56
4d554afb22b6 *** empty log message ***
gongo
parents: 29
diff changeset
76
23
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
77 2008-02-10 Wataru MIYAGUNI <gongo@cr.ie.u-ryukyu.ac.jp>
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
78
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
79 * tag: beta1
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
80 この状況だと、できることよりもできないことを書くべき?違うか。
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
81
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
82 - task (親) 中で task (子) を生成することはできない
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
83 正確には「生成はできる」だけど、その 子task が
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
84 親task に依存している別の task を無視して動くので
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
85 ちゃんとした結果にならないと。
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
86 8日の Todo にも書いてあるけど、今の実装では
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
87 task が task を生成することを想定してない感じなので。
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
88 完全に spe 用にのみ狙いを絞った実装であって
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
89 OS って言えない実装であるからして、書き直すの?
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
90 全ての関数を task しようとするとこうなる訳で、
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
91 ある部分だけやるってのはまあできるんだろうけど、うーん。
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
92
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
93 - chiaki の simple_render が動かない
24
3d377547cf6d *** empty log message ***
gongo
parents: 23
diff changeset
94 (追記) 解決しました
3d377547cf6d *** empty log message ***
gongo
parents: 23
diff changeset
95 単に read/write buffer のサイズが足りないだけだった。アホスwww
3d377547cf6d *** empty log message ***
gongo
parents: 23
diff changeset
96 まあ辱めの為の下は残しておこう
56
4d554afb22b6 *** empty log message ***
gongo
parents: 29
diff changeset
97
23
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
98 まだ cvs に commit してないけど、chiaki が書いた、
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
99 DataPack 対応の simple_render に TasKManager を組み込んでみた。
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
100 といっても、OSっぽく書いたんじゃなく、今は
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
101 update_sgp と create_pp だけを task 化してみた。
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
102 でまあ動いてるような気はするけど、ものすっごい malloc 系の warning が。
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
103 時々長く動くよねみたいな感じになってしまっている。
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
104 TaskManager が悪いのか、simple_render が悪いのか。
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
105 この TaskManager、ある部分での malloc 系の問題に敏感だなあ。
b4f6da36607f *** empty log message ***
gongo
parents: 16
diff changeset
106 まあそうでなかったらバグの探しようも無いし、良いっちゃー良いんだが。
56
4d554afb22b6 *** empty log message ***
gongo
parents: 29
diff changeset
107
4d554afb22b6 *** empty log message ***
gongo
parents: 29
diff changeset
108
16
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
109 2008-02-08 Wataru MIYAGUNI <gongo@cr.ie.u-ryukyu.ac.jp>
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
110
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
111 * add: kernel/ppe/SymTable.cpp
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
112 今まで func[] = {add, sum, ...}
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
113 とかやってかっこわるい言われまくってたので
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
114 話し合いの通り Symbol Table みたいなものを作ることに
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
115
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
116 // 疑似コードね
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
117 struct sym_table {
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
118 char *sym; // シンボル
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
119 void *address; // シンボルが示すアドレス
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
120 } sym_table[] = {{"Sum", &Sum} , {"Draw", &draw}};
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
121
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
122 int fd = get_fd("Sum");
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
123 void *addr = get_address(fd);
56
4d554afb22b6 *** empty log message ***
gongo
parents: 29
diff changeset
124
16
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
125 table には "Sum" と "Draw" っていう二つのシンボルが登録されている。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
126 例えば、ユーザ(カーネル?)が "Sum" ってシンボルにアクセスしたい場合、
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
127 まずは get_fd で "Sum" に対する、file descripter を返す。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
128 ユーザは、その fd に従って get_address を取得することが出来る。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
129 TaskManager 的な使い方をするなら
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
130
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
131 // 俺は今、Draw 関数を使うタスクを生成したい
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
132 int fd = manager->open("Draw");
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
133 manager->create_task(fd, size, in, out, func);
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
134 manager->open では get_fd と同じ使い方です。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
135
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
136 まだ改良の余地ありそうですが、今は動いてるってことで。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
137
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
138
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
139 - 補足
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
140 なぜ file descripter と表すか
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
141
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
142 OS の昨日として、 fopen とかと同じ使い方もできるじゃない!
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
143
56
4d554afb22b6 *** empty log message ***
gongo
parents: 29
diff changeset
144
16
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
145 * Todo: task が task を生成する際の処理
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
146 今まで、 task が行う作業は、演算のみを行うような
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
147 単純な実装に決め打ちされているわけです。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
148 しかし、OS なんかだと、タスク中から別のタスクを生成するとか
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
149 ありありだと思われる。てか今のテストプログラムでなった。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
150
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
151 Test/Sum にあるプログラムで使われるタスク
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
152
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
153 - init2 // 貧相な名前ですまない
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
154 演算する数値とかバッファの初期化
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
155
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
156 - sum1
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
157 ある範囲の整数 (i から i+16 とか) の総和
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
158
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
159 - sum2
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
160 sum1 で求められた、複数の範囲の総和を一つにまとめる
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
161 (ex. 複数の sum1 が 1->16, 17->32, 33->48 の総和を計算し、
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
162 sum2 で 上の3つの総和を計算する
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
163 要は 1->48 の総和を分割するっていうプログラムね
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
164
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
165 - finish
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
166 sum2 で求まった値を表示
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
167
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
168 この Sum というプログラム、というか OS と言おう。SumOS ね。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
169 SumOS は最初に TaskManager (所謂 kernel) を起動し、
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
170 init を起動する。init では、予め決められたタスクである
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
171 init2 と finish の二つのタスクを create して登録する。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
172 init2 と finish には依存関係がある (init2 が終わったら finish)
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
173 init2 の中で、sum1 と sum2 というタスクが作られる。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
174 sum1 と sum2 にも依存関係はある (sum1 が終わったら sum2)
56
4d554afb22b6 *** empty log message ***
gongo
parents: 29
diff changeset
175
16
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
176 今の実装だと、タスクが終了して初めて次のタスクへ行く。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
177 まあ当たり前なんだけど、例えばそのタスクの中で
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
178 新たにタスクが作られた場合、そのタスクが終了するまでは
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
179 実行されなくなってしまう。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
180 でまあ、今は、manager->create_task される度に
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
181 manager->run とかして、無理やり起動してる訳さ。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
182 何が無理矢理かっていうと、scheduler の役目をしている
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
183 SpeManager (これも名前変えないと) を2度呼び出してる訳。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
184 つまり、タスク中でタスクを作る度に、SpeManager オブジェクトを
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
185 new してるわけさ。いいのか?いや、動いてるけどね?
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
186
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
187 ちなみに、Cell version だと spe が勝手に取っていってくれるから
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
188 大丈夫かなと思いつつ、もし spe を1つしか使わない設定だったら微妙。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
189
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
190 要するに、タスク中でタスクが作られる場合の処理を考えないとね。
56
4d554afb22b6 *** empty log message ***
gongo
parents: 29
diff changeset
191
13
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
192 2008-02-07 Wataru MIYAGUNI <gongo@cr.ie.u-ryukyu.ac.jp>
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
193
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
194 * memo: プログラミングの姿勢
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
195 scheduler とか、task の管理をする部分は
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
196 kernel programing のつもりで、
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
197 example とか、task に割り当てる処理を決めたりする部分は
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
198 user programing のつもりで。
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
199
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
200 それぞれ違った視点で見る必要がある
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
201
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
202 * memo: OS というもの
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
203 OS 起動の流れ
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
204
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
205 - PC の電源を入れる
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
206 - BIOS が立ち上がる (OpenFirmWare, EFI, BIOS)
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
207 - 起動デバイスをチェック (優先度とか種類とか)
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
208 - 起動デバイスから Boot loader を起動
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
209 + BIOS によって、認識できるファイルシステムが違う(だっけ?)
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
210 + ファイルシステムのどこに Boot Loader があるか知っている
56
4d554afb22b6 *** empty log message ***
gongo
parents: 29
diff changeset
211 + grub, grub2, lilo, kboot などがある
13
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
212 - Boot Loader が kernel を起動
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
213 + ネットワークブートの場合、TCP/IP や
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
214 ネットワークデバイス(イーサとか?)のドライバを持ってる必要がある
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
215 - kernel は、最初に scheduler を起動する
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
216 - scheduler の初期化 (init を呼ぶ?)
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
217 - init では、事前?に設定されているスクリプトとかを呼ぶ
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
218 + linux とかだと /etc/rc にあるやつを init が呼ぶ
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
219 - login form が起動
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
220
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
221 補足 こっからユーザ
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
222 - login する
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
223 - shell を呼ぶ
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
224 + login shell かどうか確かめる
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
225 - ユーザに設定されてる起動スクリプト?を実行
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
226 - 晴れてログイン
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
227
10
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
228 2008-02-06 Wataru MIYAGUNI <gongo@cr.ie.u-ryukyu.ac.jp>
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
229
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
230 * kernel/spe/*.cpp: new と placement new
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
231 現在、spe kernel のタスクは、切り替わる毎に
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
232 new/delete を繰り返しています。今はこれでいいんだけど、
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
233 速度的にも、いずれは直さないといけないと思うわけで。
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
234 で、予め allocate された領域を利用した placement new を使えば
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
235 new よりもそれなりに早くなるっぽい。
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
236 例題として、与えられた回数分 new/delete を繰り返すプログラムと、
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
237 同じ回数分、placement new したときの速度の比較
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
238
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
239 for (int i = 0; i < num; i++) {
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
240
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
241 < task = new Task;
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
242 < task->init(i);
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
243 < task->printID();
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
244 < delete task;
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
245 ---
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
246 > task = new(buff) Task; // buff = malloc(BUFF_SIZE);
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
247 > task->init(id);
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
248 > task->printID(id);
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
249 }
56
4d554afb22b6 *** empty log message ***
gongo
parents: 29
diff changeset
250
10
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
251 placement new では、delete の必要は無い。
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
252 その中で新たに allocate してるなら必要かもしれないが。
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
253 速度比較は以下。no_new が placement new で、ln_new が new/delete 。
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
254
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
255 % ./a.out 10 // 10 回
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
256 no_new: time: 0.012135(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
257 ln_new: time: 0.003572(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
258
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
259 % ./a.out 100
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
260 no_new: time: 0.022453(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
261 ln_new: time: 0.018989(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
262
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
263 % ./a.out 1000
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
264 no_new: time: 0.115277(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
265 ln_new: time: 0.136335(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
266
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
267 % ./a.out 10000
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
268 no_new: time: 1.056156(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
269 ln_new: time: 1.322709(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
270
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
271 % ./a.out 100000
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
272 no_new: time: 10.622221(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
273 ln_new: time: 13.362414(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
274
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
275 % ./a.out 1000000
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
276 no_new: time: 109.436496(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
277 ln_new: time: 136.956872(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
278
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
279 10、100 回だと負けてるが、まあ無視しよう(ぇ
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
280 回数が多くなるにつれて、ほんの少しだが no_new が勝ってる。
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
281 どうなんだろうね。ちなみに printID を無くすと
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
282
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
283 % ./a.out 1000000
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
284 no_new: time: 0.008512(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
285 ln_new: time: 27.100296(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
286
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
287 I/O に左右され過ぎ。まあそんなもんだろうけどさ。