annotate TaskManager/Changelog @ 16:ee339757428d

*** empty log message ***
author gongo
date Fri, 08 Feb 2008 18:44:23 +0900
parents b658f8ca4408
children b4f6da36607f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
1 2008-02-08 Wataru MIYAGUNI <gongo@cr.ie.u-ryukyu.ac.jp>
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
2
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
3 * add: kernel/ppe/SymTable.cpp
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
4 今まで func[] = {add, sum, ...}
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
5 とかやってかっこわるい言われまくってたので
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
6 話し合いの通り Symbol Table みたいなものを作ることに
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
7
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
8 // 疑似コードね
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
9 struct sym_table {
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
10 char *sym; // シンボル
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
11 void *address; // シンボルが示すアドレス
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
12 } sym_table[] = {{"Sum", &Sum} , {"Draw", &draw}};
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
13
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
14 int fd = get_fd("Sum");
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
15 void *addr = get_address(fd);
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
16
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
17 table には "Sum" と "Draw" っていう二つのシンボルが登録されている。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
18 例えば、ユーザ(カーネル?)が "Sum" ってシンボルにアクセスしたい場合、
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
19 まずは get_fd で "Sum" に対する、file descripter を返す。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
20 ユーザは、その fd に従って get_address を取得することが出来る。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
21 TaskManager 的な使い方をするなら
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
22
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
23 // 俺は今、Draw 関数を使うタスクを生成したい
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
24 int fd = manager->open("Draw");
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
25 manager->create_task(fd, size, in, out, func);
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
26 manager->open では get_fd と同じ使い方です。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
27
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
28 まだ改良の余地ありそうですが、今は動いてるってことで。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
29
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
30
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
31 - 補足
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
32 なぜ file descripter と表すか
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
33
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
34 OS の昨日として、 fopen とかと同じ使い方もできるじゃない!
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
35
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
36
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
37
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
38 * Todo: task が task を生成する際の処理
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
39 今まで、 task が行う作業は、演算のみを行うような
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
40 単純な実装に決め打ちされているわけです。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
41 しかし、OS なんかだと、タスク中から別のタスクを生成するとか
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
42 ありありだと思われる。てか今のテストプログラムでなった。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
43
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
44 Test/Sum にあるプログラムで使われるタスク
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
45
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
46 - init2 // 貧相な名前ですまない
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
47 演算する数値とかバッファの初期化
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
48
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
49 - sum1
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
50 ある範囲の整数 (i から i+16 とか) の総和
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
51
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
52 - sum2
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
53 sum1 で求められた、複数の範囲の総和を一つにまとめる
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
54 (ex. 複数の sum1 が 1->16, 17->32, 33->48 の総和を計算し、
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
55 sum2 で 上の3つの総和を計算する
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
56 要は 1->48 の総和を分割するっていうプログラムね
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
57
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
58 - finish
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
59 sum2 で求まった値を表示
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
60
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
61 この Sum というプログラム、というか OS と言おう。SumOS ね。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
62 SumOS は最初に TaskManager (所謂 kernel) を起動し、
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
63 init を起動する。init では、予め決められたタスクである
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
64 init2 と finish の二つのタスクを create して登録する。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
65 init2 と finish には依存関係がある (init2 が終わったら finish)
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
66 init2 の中で、sum1 と sum2 というタスクが作られる。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
67 sum1 と sum2 にも依存関係はある (sum1 が終わったら sum2)
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
68
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
69 今の実装だと、タスクが終了して初めて次のタスクへ行く。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
70 まあ当たり前なんだけど、例えばそのタスクの中で
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
71 新たにタスクが作られた場合、そのタスクが終了するまでは
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
72 実行されなくなってしまう。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
73 でまあ、今は、manager->create_task される度に
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
74 manager->run とかして、無理やり起動してる訳さ。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
75 何が無理矢理かっていうと、scheduler の役目をしている
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
76 SpeManager (これも名前変えないと) を2度呼び出してる訳。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
77 つまり、タスク中でタスクを作る度に、SpeManager オブジェクトを
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
78 new してるわけさ。いいのか?いや、動いてるけどね?
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
79
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
80 ちなみに、Cell version だと spe が勝手に取っていってくれるから
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
81 大丈夫かなと思いつつ、もし spe を1つしか使わない設定だったら微妙。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
82
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
83 要するに、タスク中でタスクが作られる場合の処理を考えないとね。
ee339757428d *** empty log message ***
gongo
parents: 13
diff changeset
84
13
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
85 2008-02-07 Wataru MIYAGUNI <gongo@cr.ie.u-ryukyu.ac.jp>
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
86
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
87 * memo: プログラミングの姿勢
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
88 scheduler とか、task の管理をする部分は
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
89 kernel programing のつもりで、
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
90 example とか、task に割り当てる処理を決めたりする部分は
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
91 user programing のつもりで。
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
92
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
93 それぞれ違った視点で見る必要がある
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
94
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
95 * memo: OS というもの
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
96 OS 起動の流れ
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
97
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
98 - PC の電源を入れる
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
99 - BIOS が立ち上がる (OpenFirmWare, EFI, BIOS)
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
100 - 起動デバイスをチェック (優先度とか種類とか)
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
101 - 起動デバイスから Boot loader を起動
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
102 + BIOS によって、認識できるファイルシステムが違う(だっけ?)
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
103 + ファイルシステムのどこに Boot Loader があるか知っている
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
104 - Boot Loader が kernel を起動
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
105 + ネットワークブートの場合、TCP/IP や
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
106 ネットワークデバイス(イーサとか?)のドライバを持ってる必要がある
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
107 - kernel は、最初に scheduler を起動する
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
108 - scheduler の初期化 (init を呼ぶ?)
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
109 - init では、事前?に設定されているスクリプトとかを呼ぶ
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
110 + linux とかだと /etc/rc にあるやつを init が呼ぶ
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
111 - login form が起動
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
112
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
113 補足 こっからユーザ
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
114 - login する
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
115 - shell を呼ぶ
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
116 + login shell かどうか確かめる
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
117 - ユーザに設定されてる起動スクリプト?を実行
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
118 - 晴れてログイン
b658f8ca4408 *** empty log message ***
gongo
parents: 10
diff changeset
119
10
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
120 2008-02-06 Wataru MIYAGUNI <gongo@cr.ie.u-ryukyu.ac.jp>
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
121
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
122 * kernel/spe/*.cpp: new と placement new
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
123 現在、spe kernel のタスクは、切り替わる毎に
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
124 new/delete を繰り返しています。今はこれでいいんだけど、
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
125 速度的にも、いずれは直さないといけないと思うわけで。
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
126 で、予め allocate された領域を利用した placement new を使えば
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
127 new よりもそれなりに早くなるっぽい。
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
128 例題として、与えられた回数分 new/delete を繰り返すプログラムと、
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
129 同じ回数分、placement new したときの速度の比較
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
130
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
131 for (int i = 0; i < num; i++) {
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
132
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
133 < task = new Task;
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
134 < task->init(i);
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
135 < task->printID();
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
136 < delete task;
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
137 ---
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
138 > task = new(buff) Task; // buff = malloc(BUFF_SIZE);
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
139 > task->init(id);
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
140 > task->printID(id);
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
141 }
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
142
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
143 placement new では、delete の必要は無い。
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
144 その中で新たに allocate してるなら必要かもしれないが。
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
145 速度比較は以下。no_new が placement new で、ln_new が new/delete 。
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
146
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
147 % ./a.out 10 // 10 回
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
148 no_new: time: 0.012135(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
149 ln_new: time: 0.003572(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
150
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
151 % ./a.out 100
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
152 no_new: time: 0.022453(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
153 ln_new: time: 0.018989(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
154
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
155 % ./a.out 1000
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
156 no_new: time: 0.115277(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
157 ln_new: time: 0.136335(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
158
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
159 % ./a.out 10000
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
160 no_new: time: 1.056156(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
161 ln_new: time: 1.322709(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
162
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
163 % ./a.out 100000
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
164 no_new: time: 10.622221(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
165 ln_new: time: 13.362414(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
166
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
167 % ./a.out 1000000
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
168 no_new: time: 109.436496(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
169 ln_new: time: 136.956872(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
170
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
171 10、100 回だと負けてるが、まあ無視しよう(ぇ
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
172 回数が多くなるにつれて、ほんの少しだが no_new が勝ってる。
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
173 どうなんだろうね。ちなみに printID を無くすと
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
174
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
175 % ./a.out 1000000
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
176 no_new: time: 0.008512(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
177 ln_new: time: 27.100296(msec)
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
178
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
179 I/O に左右され過ぎ。まあそんなもんだろうけどさ。
7aa4c006e4be *** empty log message ***
gongo
parents:
diff changeset
180