2012-03-24 19 views
4

Cプログラムのlinux-64ビットの/ proc/pid/mapsからスタックサイズがわかりました。私はスタックサイズに関する次の行を見ることができました。stack size from proc/pid/maps in C

7fffc2e14000-7fffc2e35000 rw-p 00000000 00:00 0 [stack] 

私は上記の値を理解していません。私は違いを取る場合、私は小数で135168の違いを得る。しかしこれは8MBに近いものではありません。私はそれを間違って解釈していますか?

しかし、私はRLIMITを印刷する場合:

int main (void) 
{ 
    struct rlimit limit; 

    getrlimit (RLIMIT_STACK, &limit); 
    printf ("\nStack Limit = %ld and %ld max\n", limit.rlim_cur, limit.rlim_max); 
} 

出力: スタックリミット= 8388608と-1最大

私は8メガバイトまで来スタックリミット= 8388608取得します。

+0

私は、スタック上にあるすべてが 'struct rlimit'であることを考えると、それほど大きな驚きです。 ;-)それは成長する余地があると思う...スタックの成長にどれくらいの余裕があるかを知るために、 'limit'のアドレスを出力するのは興味深いでしょう。 – mpontillo

答えて

4

rlim_curは、そのプロセスのスタックはに成長することができますどのように「ソフトリミット」です。現在のスタック使用量の指標ではありません。 man pageから: RLIMIT構造によって定義されるよう

各リソースは、関連するソフトおよびハードリミットを有する:

struct rlimit { 
    rlim_t rlim_cur; /* Soft limit */ 
    rlim_t rlim_max; /* Hard limit (ceiling for rlim_cur) */ 
}; 

ソフトリミットは、カーネルが 対応するリソースのために強制した値であります。ハードリミットはソフト 限界の上限として作用:非特権プロセスは、ハード限界まで0の範囲内の値 へのソフトリミットを設定し、(不可逆的)その ハード限界を下げることができます。一方、

/proc/[pid]/maps、あなたは現在、そのプロセスの中にマッピングされているかを示しています。私は最も可能性が高い(33)4kページ0x21000を参照してください。これはおそらく、そのプロセスの現在のスタック使用状況を示す良い指標です。しかし、おそらくスタック以外のもの、例えば環境変数が含まれています。

+1

あなたは正しいです。私は巨大な配列double [100000]を定義し、スタックサイズを調べたところ、7fffe6e97000-7fffe6f5d000で811008バイトでした。ありがとう – Pkp

+1

問題ありません。また、あなたの質問に答えた場合は、*回答を受け入れることを覚えておいてください。あなたの受け入れ率は将来の回答者にはあまり勧められません。 –

0

RLIMIT_STACKは、あなたのスタックが成長できる点で最大上限を指定します。現在、スタックは132 KBです。より多くの自動変数を使用していた場合は、/proc/pid/mapsで見たスタックサイズはもっと大きくなりました。

+0

それは多くの自動車バールを必要とするでしょう。おそらく最大で4kが実際に使用されています。 132kはプログラム開始時に事前にコミットされた任意の量です。 –

2

Linuxは、プロセスの開始時にスタックのrlimitサイズ全体をコミットしません。これは、(スタックの成長を阻むことができないように)他のmmapなどが仮想アドレス空間を予約するだけであり、スタックを動的に最大限に成長させることができます。しかし、既定のコミットされたスタックサイズもあります。これはシステムによって128kまたは132kと思われますが、それを調整/調整する方法はわかりません。

関連する問題