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で質問しましょう!
似たような質問が見つかりました
- その他(コンピューター・テクノロジー) 量子コンピュータの動作原理がわかりません。同じビットが、1でも0でも有って良いだろうか? 3 2023/02/04 03:20
- アンテナ・ケーブル LS56 水平スタック vs LS206TMH 1本 ・指向性 ・利得 ・前後比 ・バイトパターン 4 2023/05/18 16:59
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- カスタマイズ(車) 自動車の亀の子スタックを引っ張り出すには何トンぐらいのけん引力が要りますか? 3 2022/12/25 10:31
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- 統計学 ARMAモデルが適用できる状態について 1 2022/12/30 05:58
- iPhone(アイフォーン) iPhone(ちなみちiPhone 14 Pro) の、通知って不具合ずっと起きていませんか?(スタ 1 2023/02/10 18:40
- グループウェア slackについて取り急ぎ教えて頂きたいことがあります 2 2022/04/08 09:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.netでDLLを読み込んで実行す...
-
printf / sprintf のスタック消...
-
Cプログラミングの関数電卓のア...
-
スタックの仕組み
-
アセンブラでmain関数から作成...
-
スタックとキューの使い所
-
マス目上の移動のアルゴリズム
-
C言語・スタックを使用した逆...
-
基本情報技術者のデータ構造あ...
-
エラー?メッセージ
-
パソコンでインターネット接続...
-
ubuntuで デイスク/deb/loopと...
-
タイピングの癖
-
ルータの負荷対策でL2スイッチ...
-
第一級陸上特殊無線技士
-
SP領域とはなんですか?
-
タイピングソフト
-
乱数をC言語で
-
サブネットマスクが255.255.255...
-
イーサネット10Mbpsの通信速度...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.netでDLLを読み込んで実行す...
-
最大スタックサイズを大きくす...
-
エラー?メッセージ
-
printf / sprintf のスタック消...
-
_CRTIMPの意味は?
-
スタックを用いて整数配列を入...
-
スタックフレームの消滅
-
関数呼び出しでのスタック消費量
-
スタックの伸張方向
-
スタック領域変更
-
逆ポーランド記法
-
関数のプロローグとエピローグ...
-
Ethernetヘッダの取得 NDIS
-
スタックとキューの使い所
-
再帰処理を非再帰処理に書き換...
-
CASLとCASL2の違いについて
-
マス目上の移動のアルゴリズム
-
コンパイラオプション
-
VC++6.0 Stack Overflow !!
-
VCでのスタックサイズ
おすすめ情報