Linuxでプログラムの現在のスタックサイズをどのように決定しますか?
各プログラムのスタックサイズは Linux では 8 MB になると言われていますが、cat /proc//mmap を使用すると異なるサイズを示します。
また、関連付けられたスレッドのスタック サイズをどのように決定しますか? スレッドには独自のプライベートスタックがあると言われているので?
Linuxでプログラムの現在のスタックサイズをどのように決定しますか?
各プログラムのスタックサイズは Linux では 8 MB になると言われていますが、cat /proc//mmap を使用すると異なるサイズを示します。
また、関連付けられたスレッドのスタック サイズをどのように決定しますか? スレッドには独自のプライベートスタックがあると言われているので?
単に現在のスタック サイズが必要な場合は、main() の先頭で変数を宣言し、そのアドレスを取得して、「現在」を定義した場所で宣言された変数のアドレスと比較できます。違いは、スタックが成長したおおよそのサイズである必要があります。
スタック用に予約されているメモリの量を知りたい場合は、[stack] としてマークされた領域がある /proc/[pid]/maps を確認できます。たとえば、私の atd プロセスには次のものがあります。
7fff72a41000-7fff72a56000 rw-p 00000000 00:00 0 [stack]
0175b000-0177c000 rw-p 00000000 00:00 0 [heap]
それはあなたにアイデアを与えます。
私のプログラムが使用するスタックの最大サイズを知りたいときに、友人が私に教えてくれた巧妙なトリックは次のとおりです。誰かが役に立つと思った場合に備えて、ここに提示します:)
1) main() の先頭近くで呼び出される関数では、alloca() または非常に長い配列を使用して、0xDEADBEEF またはその他のそのような可能性が低い定数を、使用できると予想されるスタック全体に走り書きします。このメモリは、小さな関数が戻るときに「解放」されます。
2) main の最後で、再度 alloca() を使用してメモリの領域を取得し、それを「検索」して、落書きに使用した魔法の定数を探します (それらの 64 の最初のブロックまたは何かを見つけようとする場合があります)。割り当てられている可能性があるが、単に使用されていない可能性のあるメモリ領域をスキップします)、そのポインターが到達する場所は、スタックの最大使用量を示します。
完璧ではありませんが、私がしていたことには役に立ちました!
Steven が提案したように、スレッド用に予約されているスタック サイズと、スレッドが現在使用しているスタックには違いがあります。
1 つのスレッドに予約されているメモリの量を知りたい場合は、pthread 属性を使用できます。
pthread_attr_t attr;
size_t stacksize;
pthread_attr_init(&attr);
pthread_attr_getstacksize(&attr, &stacksize);
printf("%u\n", stacksize);
これにより、1 つのスレッドを作成するときに予約されたデフォルトのスタック サイズが出力されます。私の場合は8Mbです。
これを変更するには、pthread_attr_setstacksize() を使用し、attr 構造体を 2 つの引数として pthread_create 関数に渡します。
編集:遅延割り当ての問題にも注意する必要があるかもしれません。このメモリ空間のどこでも読み書きしない限り、8 Mb の仮想空間は 8Mb の物理メモリ空間を使用しません。