26

C プログラムまたは Ruby プログラム (C スタックを使用する) のスタック サイズを設定するulimitには、Bash シェルで使用することをお勧めします。しかし

$ ulimit -s
8192

$ ulimit -s 16384
-bash: ulimit: stack size: cannot modify limit: Operation not permitted

どちらもsudo役に立ちません。16MB、32MB、または64MBに設定する方法はありますか? システム全体のパラメーターを設定するのではなく、プログラムの呼び出しごとに設定する方法があるはずだと思いましたか?

現時点8192ではおそらく 8MB を意味しますが、これはプロセスが使用できる量と比較すると非常に小さく、時には 2GB もの RAM を使用することもあります。

(更新されたメモ: ulimit -a現在の値を表示できます)。

更新2:実際にulimit -s <value>はシェルごとのようで、最初に設定すると通常は機能します。問題は、2回目に設定するとエラーが返される場合があることです)

4

5 に答える 5

19

どうやらmac os x のスタック サイズにはハード リミットがあるようです。今でも当てはまりますが、設定するには ulimit -s hard を呼び出すだけです。その 65532. または約 65 MB です。

Snow Leopard 10.6.8 でいくつかのテストを行いましたが、正しいようです。

$ ulimit -a
...
stack size              (kbytes, -s) 8192
...
$ ulimit -s 65533
-bash: ulimit: stack size: cannot modify limit: Operation not permitted
$ ulimit -s 65532
$

私はこれも見つけましたhttp://linuxtoosx.blogspot.com/2010/10/stack-overflow-increasing-stack-limit.htmlテストしていませんが、それについてはあまり言えません。

アプリケーションが通常ヒープから取得される大量のメモリを消費する場合、スタックは通常、関数呼び出しの寿命に相当する比較的短い時間存在するローカル自動変数用に予約されます。ヒープは、ほとんどの永続データが存在する場所です。 .

ここに簡単なチュートリアルがあります:

#include <stdlib.h>

#define NUMBER_OF_BYTES 10000000 // about 10 megs
void test()
{
   char stack_data[NUMBER_OF_BYTES];          // allocating on the stack.
   char *heap_data = malloc(NUMBER_OF_BYTES); // pointer (heap_data) lives on the stack, the actual data lives on the heap.
}

int main()
{   
    test(); 
    // at this point stack_data[NUMBER_OF_BYTES] and *heap_data have being removed, but malloc(NUMBER_OF_BYTES) persists.
    // depending on the calling convention either main or test are responssible for resetting the stack.
    // on most compilers including gcc, the caller (main) is responssible.

    return 0;
}

$ ulimit -a
...
stack size              (kbytes, -s) 8192
...
$ gcc m.c
$ ./a.out
Segmentation fault
$ ulimit -s hard
$ ./a.out
$

ulimit は一時的なもので、毎回更新するか、対応する bash スクリプトを更新して自動的に設定する必要があります。

ulimit が設定されると、下げることはできますが、上げることはできません。

于 2012-11-06T23:59:54.127 に答える
1

システムのデフォルトのスタック サイズは、カーネルのバージョンによって異なります。私の 10.7 は 16384 であるため、ulimit -s 16384 は私の Mac で受け入れられます。試してみるsysctl kern.stack_sizeと、読み取り専用のスタック サイズが表示されます。私の場合は 16384
です。この技術記事http://developer.apple.com/library/mac/#qa/qa1419/_index.htmlで、C プログラムのデフォルトのスタック サイズを変更する方法を確認できます。Ruby はスクリプト言語であるため、Ruby インタプリタをリンクする際にスタックサイズを大きくする必要があります。非常に深い関数呼び出しや再帰がある場合、または非常に大きな配列とオブジェクトがスタックに割り当てられている場合を除いて、プログラムに巨大なスタック領域を持たせるべきではありません。代わりに、ヒープまたは動的割り当てを使用すると、必要に応じて最大 2GB の RAM を使用できます。

于 2012-11-06T05:58:31.530 に答える