2011-02-01 17 views
5

iOS 4.2.1を実行しているiPhone 3Gに大量のメモリを割り当てようとしているときに、私は非常に奇妙なことに気付きました。奇妙なiOSメモリ割り当ての振る舞い

私はループ内でmalloc(512 * 1024)を呼び出すと、それは私が私が私のiPhoneは、RAMの750メガバイトをしないと思うので、それは、私を驚かNULL

app(2032,0x3e7518b8) malloc: *** mmap(size=524288) failed (error code=12) 
*** error: can't allocate region 

を取得した後、約1500回の有効なポインタを返します。 。その後、私はmallocの後にmemsetを追加し、割り当ての数を120に減らしました。これははるかに理にかなっています。 iPhoneはこれと同様の挙動を説明することができる任意の仮想メモリ・システムを持っていなかったけれども、私は

for (int i = 1; ; ++i) 
{ 
    void *p = malloc(512 * 1024); 
    NSLog(@"%d %p", i, p); 
    memset(p, 0, 512 * 1024); 
} 

:ここ

は、私が使用する超簡単なコードです。これについて合理的な説明は何でしょうか?

答えて

5

iOS(および他の多くのシステム)では、malloc()を呼び出すと実際にメモリが割り当てられません。 OS /カーネルからメモリを要求しますが、メモリへの書き込みが完了するまで要求は満たされません(たとえば、memset())。これにより、システムのメモリ管理の効率が向上しますが、誤った結果になる可能性があります。malloc()

2

iPhoneには仮想メモリシステムがあります。欠けているのは、メモリをディスクにページアウトする機能です。つまり、スワップスペースが不足しています。