0

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がここで行っている違いは何ですか。

ありがとうニラジ・ラティ

4

2 に答える 2

0

私はその記事を読みましたが、私の割り当てパターンはほぼ一定であることがわかるように、約 20MB のメモリを割り当ててから解放し、再度 20MB のメモリを割り当てています。

そのため、Solaris libc が解放されたメモリを再利用している場合、brk を何度も呼び出すべきではなく、プロセス サイズは一定のままである必要がありますが、ここでは継続的に成長しており、解放されたメモリが再利用されることはないようです。

ありがとうニラジ・ラティ

于 2013-08-08T20:22:00.310 に答える