Mercurial > hg > Members > kono > Cerium
changeset 16:ee339757428d
*** empty log message ***
author | gongo |
---|---|
date | Fri, 08 Feb 2008 18:44:23 +0900 |
parents | b7f2822c947c |
children | b59d134a81a7 |
files | TaskManager/Changelog |
diffstat | 1 files changed, 84 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/TaskManager/Changelog Fri Feb 08 18:16:10 2008 +0900 +++ b/TaskManager/Changelog Fri Feb 08 18:44:23 2008 +0900 @@ -1,3 +1,87 @@ +2008-02-08 Wataru MIYAGUNI <gongo@cr.ie.u-ryukyu.ac.jp> + + * add: kernel/ppe/SymTable.cpp + 今まで func[] = {add, sum, ...} + とかやってかっこわるい言われまくってたので + 話し合いの通り Symbol Table みたいなものを作ることに + + // 疑似コードね + struct sym_table { + char *sym; // シンボル + void *address; // シンボルが示すアドレス + } sym_table[] = {{"Sum", &Sum} , {"Draw", &draw}}; + + int fd = get_fd("Sum"); + void *addr = get_address(fd); + + table には "Sum" と "Draw" っていう二つのシンボルが登録されている。 + 例えば、ユーザ(カーネル?)が "Sum" ってシンボルにアクセスしたい場合、 + まずは get_fd で "Sum" に対する、file descripter を返す。 + ユーザは、その fd に従って get_address を取得することが出来る。 + TaskManager 的な使い方をするなら + + // 俺は今、Draw 関数を使うタスクを生成したい + int fd = manager->open("Draw"); + manager->create_task(fd, size, in, out, func); + manager->open では get_fd と同じ使い方です。 + + まだ改良の余地ありそうですが、今は動いてるってことで。 + + + - 補足 + なぜ file descripter と表すか + + OS の昨日として、 fopen とかと同じ使い方もできるじゃない! + + + + * Todo: task が task を生成する際の処理 + 今まで、 task が行う作業は、演算のみを行うような + 単純な実装に決め打ちされているわけです。 + しかし、OS なんかだと、タスク中から別のタスクを生成するとか + ありありだと思われる。てか今のテストプログラムでなった。 + + Test/Sum にあるプログラムで使われるタスク + + - init2 // 貧相な名前ですまない + 演算する数値とかバッファの初期化 + + - sum1 + ある範囲の整数 (i から i+16 とか) の総和 + + - sum2 + sum1 で求められた、複数の範囲の総和を一つにまとめる + (ex. 複数の sum1 が 1->16, 17->32, 33->48 の総和を計算し、 + sum2 で 上の3つの総和を計算する + 要は 1->48 の総和を分割するっていうプログラムね + + - finish + sum2 で求まった値を表示 + + この Sum というプログラム、というか OS と言おう。SumOS ね。 + SumOS は最初に TaskManager (所謂 kernel) を起動し、 + init を起動する。init では、予め決められたタスクである + init2 と finish の二つのタスクを create して登録する。 + init2 と finish には依存関係がある (init2 が終わったら finish) + init2 の中で、sum1 と sum2 というタスクが作られる。 + sum1 と sum2 にも依存関係はある (sum1 が終わったら sum2) + + 今の実装だと、タスクが終了して初めて次のタスクへ行く。 + まあ当たり前なんだけど、例えばそのタスクの中で + 新たにタスクが作られた場合、そのタスクが終了するまでは + 実行されなくなってしまう。 + でまあ、今は、manager->create_task される度に + manager->run とかして、無理やり起動してる訳さ。 + 何が無理矢理かっていうと、scheduler の役目をしている + SpeManager (これも名前変えないと) を2度呼び出してる訳。 + つまり、タスク中でタスクを作る度に、SpeManager オブジェクトを + new してるわけさ。いいのか?いや、動いてるけどね? + + ちなみに、Cell version だと spe が勝手に取っていってくれるから + 大丈夫かなと思いつつ、もし spe を1つしか使わない設定だったら微妙。 + + 要するに、タスク中でタスクが作られる場合の処理を考えないとね。 + 2008-02-07 Wataru MIYAGUNI <gongo@cr.ie.u-ryukyu.ac.jp> * memo: プログラミングの姿勢