13
|
1 2008-02-07 Wataru MIYAGUNI <gongo@cr.ie.u-ryukyu.ac.jp>
|
|
2
|
|
3 * memo: プログラミングの姿勢
|
|
4 scheduler とか、task の管理をする部分は
|
|
5 kernel programing のつもりで、
|
|
6 example とか、task に割り当てる処理を決めたりする部分は
|
|
7 user programing のつもりで。
|
|
8
|
|
9 それぞれ違った視点で見る必要がある
|
|
10
|
|
11 * memo: OS というもの
|
|
12 OS 起動の流れ
|
|
13
|
|
14 - PC の電源を入れる
|
|
15 - BIOS が立ち上がる (OpenFirmWare, EFI, BIOS)
|
|
16 - 起動デバイスをチェック (優先度とか種類とか)
|
|
17 - 起動デバイスから Boot loader を起動
|
|
18 + BIOS によって、認識できるファイルシステムが違う(だっけ?)
|
|
19 + ファイルシステムのどこに Boot Loader があるか知っている
|
|
20 - Boot Loader が kernel を起動
|
|
21 + ネットワークブートの場合、TCP/IP や
|
|
22 ネットワークデバイス(イーサとか?)のドライバを持ってる必要がある
|
|
23 - kernel は、最初に scheduler を起動する
|
|
24 - scheduler の初期化 (init を呼ぶ?)
|
|
25 - init では、事前?に設定されているスクリプトとかを呼ぶ
|
|
26 + linux とかだと /etc/rc にあるやつを init が呼ぶ
|
|
27 - login form が起動
|
|
28
|
|
29 補足 こっからユーザ
|
|
30 - login する
|
|
31 - shell を呼ぶ
|
|
32 + login shell かどうか確かめる
|
|
33 - ユーザに設定されてる起動スクリプト?を実行
|
|
34 - 晴れてログイン
|
|
35
|
10
|
36 2008-02-06 Wataru MIYAGUNI <gongo@cr.ie.u-ryukyu.ac.jp>
|
|
37
|
|
38 * kernel/spe/*.cpp: new と placement new
|
|
39 現在、spe kernel のタスクは、切り替わる毎に
|
|
40 new/delete を繰り返しています。今はこれでいいんだけど、
|
|
41 速度的にも、いずれは直さないといけないと思うわけで。
|
|
42 で、予め allocate された領域を利用した placement new を使えば
|
|
43 new よりもそれなりに早くなるっぽい。
|
|
44 例題として、与えられた回数分 new/delete を繰り返すプログラムと、
|
|
45 同じ回数分、placement new したときの速度の比較
|
|
46
|
|
47 for (int i = 0; i < num; i++) {
|
|
48
|
|
49 < task = new Task;
|
|
50 < task->init(i);
|
|
51 < task->printID();
|
|
52 < delete task;
|
|
53 ---
|
|
54 > task = new(buff) Task; // buff = malloc(BUFF_SIZE);
|
|
55 > task->init(id);
|
|
56 > task->printID(id);
|
|
57 }
|
|
58
|
|
59 placement new では、delete の必要は無い。
|
|
60 その中で新たに allocate してるなら必要かもしれないが。
|
|
61 速度比較は以下。no_new が placement new で、ln_new が new/delete 。
|
|
62
|
|
63 % ./a.out 10 // 10 回
|
|
64 no_new: time: 0.012135(msec)
|
|
65 ln_new: time: 0.003572(msec)
|
|
66
|
|
67 % ./a.out 100
|
|
68 no_new: time: 0.022453(msec)
|
|
69 ln_new: time: 0.018989(msec)
|
|
70
|
|
71 % ./a.out 1000
|
|
72 no_new: time: 0.115277(msec)
|
|
73 ln_new: time: 0.136335(msec)
|
|
74
|
|
75 % ./a.out 10000
|
|
76 no_new: time: 1.056156(msec)
|
|
77 ln_new: time: 1.322709(msec)
|
|
78
|
|
79 % ./a.out 100000
|
|
80 no_new: time: 10.622221(msec)
|
|
81 ln_new: time: 13.362414(msec)
|
|
82
|
|
83 % ./a.out 1000000
|
|
84 no_new: time: 109.436496(msec)
|
|
85 ln_new: time: 136.956872(msec)
|
|
86
|
|
87 10、100 回だと負けてるが、まあ無視しよう(ぇ
|
|
88 回数が多くなるにつれて、ほんの少しだが no_new が勝ってる。
|
|
89 どうなんだろうね。ちなみに printID を無くすと
|
|
90
|
|
91 % ./a.out 1000000
|
|
92 no_new: time: 0.008512(msec)
|
|
93 ln_new: time: 27.100296(msec)
|
|
94
|
|
95 I/O に左右され過ぎ。まあそんなもんだろうけどさ。
|
|
96
|