>> On Sun, 04 Jun 1995 23:20:00 +0900, 藤永清和 <NBA01614@niftyserve.or.jp> said:
> kernel-mlのみなさん、藤永です。
> [スタックの情報は共有できない]
> 隆一さんのご指摘どおり、スタックを別空間に置いたらスタックに置かれた情報は
> タスク間で共有できませんが、そもそもスタック上に置いたデータ(自動変数)は、
> 他から見えないものではないでしょうか?というか、同じプロセスのタスクのスタッ
> クを同一空間に置いたとしても、ご指摘のようなプログラムはまずいプログラムでは
> ないでしょうか?同一空間にスタックがあっても、task1が終了したらdataは消えて
> しまう)
えーと、確かに局所変数は他の関数が直接見ることはできません。
しかし、他の関数の引数の値に局所変数を渡すというのは、よくやるコーディ
ングだと思いますが?
よくあるケースとしては、read システムコールを呼ぶときに渡すバッファな
どを局所変数にすることがあります。局所変数にしない場合、バッファの領域
は大域変数かスタティック変数にすることになりますが、そうすると再帰呼び
出しのときに困ることになります。
もちろん、これは通常の関数呼び出しの話です。複数のタスクが協調して仕事
をするときにタスク間でスタックの中身を共有できないという制限をつけると
いうのを仕様にすることも、もちろんできます。
> 「チェックする方法」の話
> これは、スタックのページインの話に対して、隆一さんが[kernel-ml 16]の最後に
> 、
> >>>
> 私もこれがいいと思います。
> あと、ページフォールトが発生し、そのアドレスがスタックをアクセスしたた
> めに発生したのかをチェックする方法が必要ですね。
> <<<
> と、仰っている件です。
なるほど了解しました。
私のもとの発言は、単にスタックが成長しページフォールトが発生したときに、
そのページフォールトがスタックの成長の結果起ったのかを調べる必要がある
と思っただけです。
データ領域については、プログラムの中で自発的に大きさを指定するからいい
のですが、スタックの場合はあらかじめ指定することが難しいですから。
この辺は、UNIX のことが頭にあったので、つい書いてしまいました。
> スタックを特別扱いする必要がなぜあるのかと考えたのですが、
> スタックのうち、書き込まれていない領域を読みだそうとしたら、エラーかな?ス
> タックは連続した論理空間を使うと仮定してよい(不連続のページを使用することは
> ない)と思いますが、いかがでしょう?
もちろん、スタックの仮想空間をあらかじめ最大にとっておくこともできます。
この場合には、ページフォールトがスタック上で起こったのかというチェック
は必要がありません。
> [プロセス内タスク]
> プロセス内タスクは、時間的に間に合わないアプリケーションのためだけではなく
> 、プログラミングの手軽さも捨て難いのではないでしょうか?(手軽に書けても堅牢
> 性を失っては困るが)
> それに、メモリの節約にもなると思います。
プログラミングの手軽さというのは、タスク同士でデータを共有できるから通
信する手間が必要なくなるということでしょうか?
> もちろん、プロセス内タスクというのは、結局は ITRON のタスクのことです。
了解しました。
-- 内藤隆一 (ggc00661@niftyserve.or.jp/night@bfree.rim.or.jp)