[kernel-ml 21] Re: MemoryManager.TASK&STACK

Naitoh Ryuichi ((no email))
Sun, 4 Jun 1995 00:09:51 +0900

隆一@B-Free です。

>> On Fri, 02 Jun 1995 22:08:00 +0900, 藤永清和 <NBA01614@niftyserve.or.jp> said:

>  kernel-mlのみなさん、藤永です。
>  1プロセスに含まれる複数タスクは、同じ仮想空間を持つものと考えておりました
> 。それで、隆一さん[kernel-ml 16]の案1)しか考えていませんでした。
>  そのため、サブタスクに割り当てるスタックサイズの指定が必要かと考えていたの
> ですが、スタックだけ別空間に配置できるなら、それがベストかも知れません。
>  スタックは同じプロセス内のタスクであっても互いに干渉することは許せませんか
> ら。
>  スタックの成長による他のタスクのメモリへの侵害を防ぐのも、別空間なら面倒な
> ことが無くて済むかしら。

プロセス内で複数のタスクを動かすような場合、そのタスク同士で共有するよ
うな資源(早い話がグローバル変数など)をアクセスする時には排他処理が必要
になります。
グローバル変数程度ならば、プログラム時に注意すればなんとかなりますが、
スタックの侵害を防ぐとなるとひじょーに面倒になると思います。
別空間に置く場合には、各タスクのスタックは固有の空間に置かれることにな
りますから、そもそも侵害自体起き得なくなります。

ただし、スタックを別空間に置いた場合、スタックの情報は共有できなくなり
ます(当然ですが)。
たとえば、次のようなプログラムを書いたりすると困ったことになります。

int *share_data;

task1 ()
{
int data[2];

data[0] = 1;
data[1] = 2;
share_data = data;
cre_tsk (get_tid () + 1, task2);
}

task2 ()
{
printf ("data[0] = %d\n", share_data[0]);
printf ("data[1] = %d\n", share_data[1]);
}

このプログラム片では、2つのタスク - task1 と task2 とでデータを共有し
ています。共有は大域変数 share_data で行っています。

しかし、共有する情報は、task1 のスタック上にあります。task2 からは
task1 のスタックは見れませから、アクセスしようとしても意味のない情報が
返ってきます。

>  隆一さん、「あと、ページフォールトが発生し、そのアドレスがスタックをアクセ
> スしたために発生したのかをチェックする方法」は必要でしょうか?

すいません、ちょっとこのセンテンスの意味が分からないのですが、説明して
いただけないでしょうか?
「チェックする方法」というのはどこを対象にしているのでしょうか?
ページフォールトを起こしたときの処理は、ユーザプログラム (lowlib)、周
辺核、ITRON の3つが協調して実行すると思います。チェックする処理という
のはこのうちのどれが行うのでしょうか?

スタックをアクセスしたかどうかを知るのは、単純にはスタックの領域(サイ
ズ)を決めておいて、その領域内にアクセスした場合には無条件にスタックを
アクセスしたという処理にすれば OK です。
(多分、たいていの OS ではこういう風にやっていると思います)

>  ところで、真鍋さんが指摘しているとおり、3Bの実装では、1プロセスに、ひと
> つのメインタスクと7つのサブタスクが存在でき、スタックを単純に8等分するよう
> です。
>  で、これは良くないと。
>  まず、メインとサブにわけるのでなく、すべてのタスクが同等の機能を持つべきだ
> と考えます。
>  3Bのタスクは、プロセス内の非同期処理しか想定していないようです(メインタ
> スクがイベントループを行ない、実際の処理をサブタスクが行なう)。
>  長い時間ポインタが湯呑になって何の操作もできなくなるのだけは防げますが、そ
> れだけではおもしろくないでしょう。

私が思うに、プロセス内タスクというのは、プロセス単位で処理を分けたので
は時間的に間に合わないようなアプリケーションで使うためのものだと思いま
す。
もちろん、プロセスを生成・切換えする時間が十分短ければ、プロセス内タス
クなど作る必要はないと思います。

>  プロセス内タスクは、たとえば何十個かのセンサ入力を集計するようなアプリケー
> ションを、ひとつのプロセスで実現できるように実装したいと考えています。

>  タスクというと、ITRONのタスクと紛らわしいから、スレッドと言った方がよ
> いのかも?

うーん、プロセス内タスクというのは、結局は ITRON のタスクのことだと思
いますが...
# 別に ITRON タスクとは別のものというわけではないですよね :-)

>   メモリ管理は極力単純で高性能なものにしたい、 藤永

御意。

-- 
内藤隆一 (ggc00661@niftyserve.or.jp/night@bfree.rim.or.jp)