4

私はcをブラッシュアップし、古いエクササイズをやり直して、このスニペットを実行するといくつかの異常な結果を取得しています(リークはわかっていますが、システムがどれだけ許容できるかを知りたいです)。

#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
    void *page = 0; int index;
    index = 0;
    while(1)
    {
        page = malloc(1073741824); //1GB
        if(!page)break;
        ++index;
    }
    printf("memory failed at %d\n",index);
    return 0;
}

私は実際に得ています:

131070でメモリが失敗しました

これは、割り当てられた131070 x 1GBのメモリ(たっぷりとリークしている)を考慮していることを示しています

私は以前、すべての仮想メモリを消費する前にmallocが失敗するはずだと理解していました。確かに、1つのブロックでmalloc 20GBを試してみると、これは失敗します。

私のセットアップ:ubuntu 10 8Gb ram、<= 2Gbスワップ、HD 1TB(これは重要ですか?)

誰もが私が持っているよりも多くのメモリをリークすることができる方法についての考えを持っています

4

1 に答える 1

4

  • http://www.win.tue.nl/~aeb/linux/lk/lk-9.html

    2.1.27以降、sysctlVM_OVERCOMMIT_MEMORYとprocファイル/proc / sys / vm / overcommit_memoryがあり、値は1:オーバーコミットし、0(デフォルト):しない。残念ながら、これではカーネルにもっと注意を払うように指示することはできません。カーネルにあまり注意を払わないように指示することしかできません。overcommit_memoryを1に設定すると、すべてのmalloc()が成功します。0に設定すると、古いヒューリスティックが使用されますが、カーネルは引き続きオーバーコミットします。

また、mallinfoを使用したインストルメンテーションも検討することをお勧めします。

最後のリンク:

ある意味で、Linuxは航空会社が飛行機のチケットを販売する方法でメモリを割り当てます。航空会社は、一部の乗客が現れないことを期待して、実際の座席よりも多くのチケットを販売します。Linuxのメモリも同様の方法で管理されますが、実際にははるかに深刻です。

于 2012-05-02T19:29:09.847 に答える