Solaris sparc サーバーで 1 つのテスト プログラムを作成し、Sun Studio を使用してコンパイルしました。
#include <iostream>
using namespace std;
int main()
{
const int size = 9999;
char *ptr[size];
while(1)
{
for(int i = 0; i < size; i++)
{
ptr[i] = new char[2048];
}
for(int i = 0; i < size; i++)
{
delete[] ptr[i];
}
}
return 9;
}
compiled it as
CC -m64 -g
これを実行すると、プロセス サイズが増加し続け、システム メモリの制限に達するとプロセスがクラッシュすることがわかります。truss を使用してトレースしたところ、brk システム コールしか表示されません。いくつかのオラクル サイトを検索して、LD_PRELOAD=libmapmalloc.so を設定すると、プロセス サイズは一定になりました。truss は、今回は malloc を使用して匿名メモリ ページをマップしていたことを示しています。
一方、RHEL Linux 2.6 x86 ボックスでもこの動作を確認しようとしましたが、トラスを使用していましたが、プロセス サイズは一定でした。
brk を使用してデータ セグメントのサイズを大きくする最初のケースでは、Solaris の動作がわかりませんが、削除してもサイズは小さくなりません。なぜsolarisがこのようにしているのか、誰か説明してもらえますか?
したがって、同じシステムコールも使用するため、プロセスサイズを一定に保つためにLinuxがここで行っている違いは何ですか。
ありがとうニラジ・ラティ