まず、私の発言により皆さまを混乱させたことをおわびします。
よくよく考えたところ、同一プロセス内にあるタスク間でスタックの領域を別
の仮想空間に分けることは、やめた方がいいという考えに至りました。
以下、藤永さんへのコメントという形で説明させていただきます。
>> On Tue, 06 Jun 1995 00:17:00 +0900, 藤永清和 <NBA01614@niftyserve.or.jp> said:
> kernel-mlのみなさん、藤永です。
> 真鍋さんと同じく、わたしも「局所変数」を他のタスクと共有できなくてよいと考
> えています。
> 隆一さんが言われる、再帰呼び出しや再入の問題とタスク間での共有とはまったく
> 異なる話ではありませんか?
うーん、再帰呼び出しとか再入の話は、単にスタックを介して値を渡す例とし
て出しただけなんですが。。。
言いたいのは、タスクごとにスタック領域を別の仮想空間に分けた場合、ある
タスクがポインタを介して実際のデータにアクセスするときに、このポインタ
の指す先がスタック上の局所変数なのか、それとも大域変数なのか判別するこ
とが簡単にできるのかな? ということです。
注意しなければいけないのは、C 言語では、局所変数は必ずしもひとつの関数
の中でのみ見ることのできるデータを意味していないということです。
局所変数のアドレスを大域変数(ポインタ)に入れたり、引数で渡すことによっ
て、その関数以外でも見ることができるようになります。
> 下記のプログラムで、proc1とproc2では、proc2がアクセスするのは意味のないデ
> ータでしょう。
はい、意味のないデータです。
この場合には高々 20 行程度のプログラムですから、share_data の指す先が
スタック上にあることは、ひと目で分かります。
ただ、1000 行以上になったプログラムでこういうポインタの指す先がスタッ
ク上にあるかどうかを知るのは大変でしょう。
特に、この場合には share_data は大域変数ですから、まだ分かりやすいで
す。たとえば、proc2 が引数で share_data を別の関数に渡したとき、その関
数は share_data の指す先がスタック上にあるかを知るのは、難しいと思いま
す。
もちろん、ポインタの値を見れば、それがスタック上であることは判断できま
す。ただ、それが自分のスタックなのかそれとも他のタスクのスタックなのか
は判断できないと思います。
> 「タスク間でスタックの中身を共有できない」という仕様にしましょう。ただ、禁
> 止=検出(エラーチェック)は不可能かな?
というわけで、私は「タスク間でスタックの中身を共有できない」という仕様
には反対です。
-- 内藤隆一 (ggc00661@niftyserve.or.jp/night@bfree.rim.or.jp)