プロが教えるわが家の防犯対策術!

cloneのパラメータでスタックのアドレスを渡しますがその際のスタック管理で良い方法はないでしょうか?
条件:
1.cloneで生成されるスレッドは多数存在する。
2.各スレッドは不定期に消滅する。
3.他のスレッドからも消滅させられる。

現在以下の2つのパターンで検討していますが、他に良い方法はないでしょうか?
1.生成される度にmalloc()でスレッド用のスタックエリアを確保し、そのアドレスをcloneのパラメータとして渡す。消滅時にそのパラメータを使用しfree()で解放する。(但し、他のスレッドから消滅させられる場合にスタックのアドレスが分からない。)
2.生成されると思われる個数分のスタックエリアをcalloc()で確保し、そのインデックス値をcloneのパラメータとして渡す。消滅時にそのパラメータを使用しスタックエリアをクリアし次にcloneで生成されるスレッド用として使用する。(但し、他のスレッドから消滅させられる場合にスタックのインデックス値が分からない。)


pthread_create()の場合、スタックの管理はどうなっているのでしょうか?



Linuxでのスレッドについて詳しいHP、参考書等知っていれば教えて下さい。

A 回答 (2件)

ちょっと探してみたのですが、時間がなくてLinuxのpthreadライブラリの


ソースは見つけられなかったです。。。
探して見てみるのが一番です。

多分、pthread側ではあまり考えずに、mmapかなにかでメモリ割り当て
していると思います。。。
ちゃんとしたPOSIXスレッドなら、スレッドそのものが使いまわされる
ので、いちいちpthread_createで毎回スレッドが作られるわけじゃ
ないですしね。
つまり、スタックの割り当て・解放もそう頻繁には起きないです。


以下は、ご参考レベルで私の意見を述べます。
試してみていないので、ほんとにご参考・ヒントのレベルです。。。。

cloneプロセスが外部から終了させられる、、というのは、
シグナル等の非同期な手段で終了させているのでしょうか?
そうであるなら、SIGHUPかなにかで終了させるようにし、
シグナルを受けた終了すべきプロセスでは、すぐに終了せずに、
シグナルハンドラへ飛んでから自分でスタックを開放してから終了する、、
あるいは、「終了したよ」という印を共有メモリに書きこんで
それを監視するプロセスにより、メモリ解放・再割り当てを
行うようにしてはどうでしょうか?

例えば、
使用中/未使用のフラグ、
cloneプロセスの状態(生きてるよ、終了したよ)などのフラグや、
そのcloneプロセスが使用するスタックのアドレスなどを
格納する構造体を作成し、それを、cloneプロセスの
最大数分の配列にし、独自のcloneプロセス管理テーブルとする。

cloneでプロセスを作成して関数コールをする際に、引数を
渡せますが、そこのなかに自分で管理した未使用のIDを付与するようにして、
cloneされたプロセスは、そのIDをキーにして、管理テーブルを
参照更新するようにする。。。

cloneプロセス作成前に、割り当てられたIDから管理テーブルを
見つけ、スタックのアドレスが入っていなければ、mallocをして
そこにアドレスを入れ、アドレスが入っていれば、それをそのまま使い、
使用中フラグをたててから、cloneする。cloneプロセスにはそのIDを渡す。。。

mallocに失敗したら、未使用テーブルのスタックを解放して
メモリを確保する、あるいは定期的にテーブルを走査して
未使用のスタックを解放する、、などの方法もありますね。。。


ところで、pthread使うのはヤなんですか?
    • good
    • 0
この回答へのお礼

ありがとうございました。
アドバイスのようにアドレス管理テーブルを持って対処する方法でいきます。

pthreadを使うのはイヤでは無いのですが、
詳しい使用方法が載っている参考書等が手元になくcloneを先に検討しました。。

pthreadの使い方が分かりやすく載っている参考書、HPなどが有れば教えていただきたいです。お願いします。

お礼日時:2001/03/05 10:38

たまたまみつけたのですが、下に紹介しますIBMのページの日本語記事一覧の中に


「POSIXスレッドの説明」というのが第3回まで連載しているようです。。。

ちらっと見ただけですが、けっこう詳しく書いてますね。
この中で、書籍等の説明もしているようです。

参考URL:http://www-6.ibm.com/jp/developerworks/linux/lib …
    • good
    • 0
この回答へのお礼

ありがとうございます。
参考にし勉強します。
分からないことが有ったら、またアドバイスお願いします。。

お礼日時:2001/03/06 21:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!