Linuxのプロセス/スレッドのサイズはどれくらいですか?プロセス/スレッドが作成され、task_struct
その中に他のデータ構造がある場合、他に何かありますか?
プロセス/スレッドのスタックは、プロセス/スレッドの初期化時に割り当てられますか(固定サイズ)?または、必要に応じて(仮想メモリのように)割り当てられますか?
標準のプロセス/スレッドがメモリに作成されたときに、そのサイズを知るにはどうすればよいですか?
Linuxのプロセス/スレッドのサイズはどれくらいですか?プロセス/スレッドが作成され、task_struct
その中に他のデータ構造がある場合、他に何かありますか?
プロセス/スレッドのスタックは、プロセス/スレッドの初期化時に割り当てられますか(固定サイズ)?または、必要に応じて(仮想メモリのように)割り当てられますか?
標準のプロセス/スレッドがメモリに作成されたときに、そのサイズを知るにはどうすればよいですか?
大きなメモリ ブロック (> ページサイズ = 4096 バイト) が最初に Linux に割り当てられると、ページ テーブル内の特別な "null" メモリ ページが使用されます。スレッド スタックのこれらのゼロ ページ。スタックが大きくなるにつれて、ページは実際のメモリでバックアップされたページに変換されます。この「ヌル」ページのバッキングのため、一般的に、大量のスタックを使用しても問題ありません。
スレッドとプロセスは両方とも、 clone(2)と呼ばれる同じ基本システムコールで作成されます。多くのオプションがあり、多くのことを行います。詳細man clone
な説明については、 を参照してください。
http://linux.die.net/man/2/clone
メモリの大きなブロックは、匿名のmmap(2)呼び出しで割り当てられます。
「linux overcommit bit」を Web 検索することにも興味があるかもしれません。
(質問を絞り込みたい場合は、より具体的にすることができます。)
アンドリューが言ったことは真実ですが、スレッド/プロセスが作成された瞬間から「メモリを使用」しないという意味ではありません。スタック用に予約されたスペースは、常にプロセス内の仮想アドレス空間を消費します。つまり、大きなスレッド スタックを使用すると、32 ビット マシンでアドレスがすぐに不足してしまいます (glibc のデフォルトのスレッド スタック サイズでは、約 300 スレッドで仮想アドレスが使い果たされます)。アドレス空間)。また、スタックは、オーバーコミットが無効になっているときに割り当てることができるメモリの合計量を決定するコミット チャージに貢献します。
Linux はデフォルトで、メイン スレッドのスタック用に 128k を事前コミットし、コミット チャージが使い果たされていない場合は、さらに多くを自動的に取得できるようにします。スレッド スタックは、ユーザー空間 (ほとんどの Linux システムでは glibc/NPTL) によって完全に割り当てられ、初期サイズを超えることはできません。バージョンとシステム設定に応じて、glibc/NPTL は通常、デフォルトでスレッドごとに 2 MB から 10 MB の間を割り当てます。