
cloneのパラメータでスタックのアドレスを渡しますがその際のスタック管理で良い方法はないでしょうか?
条件:
1.cloneで生成されるスレッドは多数存在する。
2.各スレッドは不定期に消滅する。
3.他のスレッドからも消滅させられる。
現在以下の2つのパターンで検討していますが、他に良い方法はないでしょうか?
1.生成される度にmalloc()でスレッド用のスタックエリアを確保し、そのアドレスをcloneのパラメータとして渡す。消滅時にそのパラメータを使用しfree()で解放する。(但し、他のスレッドから消滅させられる場合にスタックのアドレスが分からない。)
2.生成されると思われる個数分のスタックエリアをcalloc()で確保し、そのインデックス値をcloneのパラメータとして渡す。消滅時にそのパラメータを使用しスタックエリアをクリアし次にcloneで生成されるスレッド用として使用する。(但し、他のスレッドから消滅させられる場合にスタックのインデックス値が分からない。)
pthread_create()の場合、スタックの管理はどうなっているのでしょうか?
Linuxでのスレッドについて詳しいHP、参考書等知っていれば教えて下さい。
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使うのはヤなんですか?
ありがとうございました。
アドバイスのようにアドレス管理テーブルを持って対処する方法でいきます。
pthreadを使うのはイヤでは無いのですが、
詳しい使用方法が載っている参考書等が手元になくcloneを先に検討しました。。
pthreadの使い方が分かりやすく載っている参考書、HPなどが有れば教えていただきたいです。お願いします。
No.2
- 回答日時:
たまたまみつけたのですが、下に紹介しますIBMのページの日本語記事一覧の中に
「POSIXスレッドの説明」というのが第3回まで連載しているようです。。。
ちらっと見ただけですが、けっこう詳しく書いてますね。
この中で、書籍等の説明もしているようです。
参考URL:http://www-6.ibm.com/jp/developerworks/linux/lib …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vba Replace関数について教えて...
-
CSSが全く分かりません、お助け...
-
CPUが16bitでも32bitOSでコンパ...
-
最初に聞かれたこと
-
c言語の問題の説明、各所ごとに
-
Cのオブジェクトファイルの逆ア...
-
C言語 関数、変数の宣言について
-
C言語について。
-
C言語でファクト関数を使わずに...
-
プログラミング 素数か素数では...
-
あってる
-
DNCL(共テ用プログラミング言語...
-
int16_t の _t は何?
-
DLLファイルの逆コンパイラにつ...
-
visual studio 2022でのC#プロ...
-
プログラミングc++を全く分か...
-
DNCL(共テ用プログラミング言語...
-
C言語 配列と関数の練習問題
-
gccを行ってもexeファイルが生...
-
C言語 列挙型(enum型)変数について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.netでDLLを読み込んで実行す...
-
printf / sprintf のスタック消...
-
最大スタックサイズを大きくす...
-
ゆゆにゃ。
-
Ethernetヘッダの取得 NDIS
-
gccでスタックサイズを変更する...
-
Visual C++ 2008 オーバーフロ...
-
H8マイコン スタック領域に...
-
ポーランド記法(前置記法)のア...
-
Cプログラミングの関数電卓のア...
-
WINAPについて
-
pthreadのスタックサイズ設定取...
-
_CRTIMPの意味は?
-
逆ポーランド記法
-
エラー?メッセージ
-
再帰処理を非再帰処理に書き換...
-
スタック領域変更
-
スタックのpush/pop動作について
-
VC++でプログラムから現在のス...
-
CASLIIについて
おすすめ情報