14

したがって、256 MB のメモリを割り当てるこのプログラムがあり、ユーザーが Enter キーを押すと、メモリが解放されて終了します。

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

int main(void) {
    char *p, s[2];

    p = malloc(256 * 1024 * 1024);
    if ( p == NULL) 
        exit(1);

    printf("Allocated"); 
    fgets(s, 2, stdin);
    free(p);
    return 0;
}

このプログラムを複数回実行し、割り当てることができる十分なメモリがなくなるまで、それぞれをバックグラウンドで実行しました。しかし、それは決して起こりません。Linuxtopコマンドを実行しましたが、このプログラムを何度も実行した後でも、空きメモリが 256 MB 近く減ることはありません。

ただし、calloc代わりに使用するmallocと、大きな違いがあります。

p = calloc(256 * 1024 * 1024, 1);

プログラムを実行してバックグラウンドで実行すると、実行するたびに空きメモリが 256 MB 減少します。どうしてこれなの?malloc使用可能な空きメモリが変更されないのはなぜcallocですか?

4

3 に答える 3

27

malloc()メモリを使用しません。それを割り当てます。

メモリを割り当てたら、データを割り当てて使用します。

size_t Size = 256 * 1024 * 1024;
p = malloc(Size);
if (p != NULL) {
  memset(p, 123, Size);
}

一部のプラットフォームmalloc()では、そのバイト (または、バイトのグループまたは「ページ」内のバイト) がアクセスされるまでメモリの物理的な消費が発生しないように実装されています。

calloc()メモリを実際に使用する場合と使用しない場合があります。システムは、少なくともデータが興味深いものになるまで、大量のメモリを同じ物理的にゼロ化されたメモリにマップできます。malloc+memset が calloc よりも遅い理由を参照してください 。

于 2013-11-15T01:07:46.663 に答える
13

メモリが実際には利用できない可能性があります。特にp、例で使用して、NULL. man mallocから

デフォルトでは、Linux は楽観的なメモリ割り当て戦略に従います。これはmalloc()、 non- が返された場合NULL、メモリが実際に使用可能であるという保証がないことを意味します。システムのメモリが不足していることが判明した場合、1 つまたは複数のプロセスが OOM キラーによって強制終了されます。詳細については、 の と の説明、および/proc/sys/vm/overcommit_memoryLinuxカーネル ソース ファイルのドキュメントを参照してください。/proc/sys/vm/oom_adjproc(5)/vm/overcommit-accounting

于 2013-11-15T01:10:00.093 に答える
4

calloc使いのシステムの † は、メモリをクリアすることで実際にメモリにアクセスします。多くのシステムでは、メモリが割り当てられているプロセスによってアクセスされるまで、メモリは実際には割り当てられません (したがって、「使い果たされます」)。したがって、malloc実行するだけでは、使用するまでメモリを「使用」しません。

† コメントを参照

于 2013-11-15T01:09:11.600 に答える