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: プログラミングの姿勢