• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:cloneのスタック管理)

cloneのスタック管理方法の検討とpthread_create()のスタック管理について

このQ&Aのポイント
  • cloneのスタック管理方法を検討中です。現在は、malloc()でスレッド用のスタックエリアを確保し、アドレスをcloneのパラメータとして渡す方法と、calloc()でスタックエリアを確保し、インデックス値をcloneのパラメータとして渡す方法を検討しています。
  • pthread_create()の場合は、スタックの管理方法について詳細を知りたいです。
  • Linuxでのスレッドについて詳しいHPや参考書などを教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • kaz-sugi
  • ベストアンサー率50% (3/6)
回答No.1

ちょっと探してみたのですが、時間がなくて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使うのはヤなんですか?

zukka
質問者

お礼

ありがとうございました。 アドバイスのようにアドレス管理テーブルを持って対処する方法でいきます。 pthreadを使うのはイヤでは無いのですが、 詳しい使用方法が載っている参考書等が手元になくcloneを先に検討しました。。 pthreadの使い方が分かりやすく載っている参考書、HPなどが有れば教えていただきたいです。お願いします。

その他の回答 (1)

  • kaz-sugi
  • ベストアンサー率50% (3/6)
回答No.2

たまたまみつけたのですが、下に紹介しますIBMのページの日本語記事一覧の中に 「POSIXスレッドの説明」というのが第3回まで連載しているようです。。。 ちらっと見ただけですが、けっこう詳しく書いてますね。 この中で、書籍等の説明もしているようです。

参考URL:
http://www-6.ibm.com/jp/developerworks/linux/library.html
zukka
質問者

お礼

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