39

iOSプラットフォームは、メモリ不足のシナリオでメモリマップトファイルをどのように処理しますか?低メモリシナリオとは、OSUIApplicationDidReceiveMemoryWarningNotificationがアプリケーション内のすべてのオブザーバーに通知を送信するときを意味します。

私たちのファイルは、を使用してメモリにマッピングされます+[NSData dataWithContentsOfMappedFile:]

マップされたファイルは、仮想メモリ技術を使用して、実際に必要になるまでファイルのページをメモリにコピーしないようにします。

これは、ページが使用されなくなったときにOSがページのマップを解除することを意味しますか?ページを使用されなくなったものとしてマークすることは可能ですか?シナリオが変更された場合、このデータは読み取り専用です。mmap()直接使用する場合はどうでしょうか。これは望ましいですか?

4

6 に答える 6

20

メモリ マップト ファイルは、データをディスクからメモリに一度に 1 ページずつコピーします。未使用のページは、 を使用して物理メモリに配線されていない限り、他の仮想メモリと同じように自由にスワップアウトできますmlock(2)。メモリ マッピングでは、ディスクからメモリに何をコピーし、いつ OS にコピーするかを決定します。

使用するために Foundation レベルから BSD レベルに落としてもmmap、他の Foundation コードとのインターフェースを必要とするコードをやや扱いにくくする以外に、大きな違いが生じる可能性は低いです。

于 2011-06-02T14:43:39.793 に答える
11

(これは答えではありませんが、役立つ情報になります。)

@ID_AA_Carmackツイートから、

@ID_AA_Carmackは、iOSのメモリマップファイルが低メモリ状態で自動的にマップ解除されますか?(+ [NSData dataWithContentsOfMappedFile]を使用しますか?)

ID_AA_Carmackはこれに対して返信しました、

@KhrobEdmondsはい、それはiOSでマップトファイルを使用することの大きな利点の1つです。ただし、mmap()を使用します。

それが本当かどうかはわかりません...

于 2011-06-08T04:14:01.543 に答える
7

私の実験では、NSData はメモリ警告に応答しません。メモリにマップされた NSData を作成し、ファイルの一部にアクセスしてメモリにロードし、最終的にメモリ警告を送信することでテストしました。メモリ警告の後、メモリ使用量の減少はありませんでした。ドキュメントには、メモリが不足している状況でメモリが NSData の実際のメモリ使用量を減らすとは書かれていないため、メモリ警告に応答しないと思われます。たとえば、NSCache のドキュメントには、メモリ使用量に関して適切に動作することが示されています。さらに、システムが発生させるメモリ不足の警告に応答すると言われています。

また、iPod Touch (第 4 世代) での簡単なテストでは、約 600 MB のファイル データを仮想メモリの使用にマッピングすることができました+[NSData dataWithContentsOfMappedFile:]。次に、NSData インスタンスの bytes プロパティを介してページにアクセスし始めました。私が行ったように、この実メモリは増加し始めましたが、実メモリ使用量が約 30 MB で成長が止まりました。そのため、実装方法によって、使用される実メモリの量が制限されているようです。

つまり、NSData オブジェクトのメモリ使用量を減らしたい場合、最善の方法は、それらが完全に解放されていることを実際に確認し、システムが自動的に行うものに依存しないことです。

于 2011-06-07T18:49:50.290 に答える
4

iOS が他の Unix のようなものである場合 (この点に関してはお金に賭けるだろう)、 mmap() 領域内のページは「スワップアウト」されません。それらは単純に削除される (クリーンな場合) か、基になるファイルに書き込まれてから削除されます (ダーティな場合)。このプロセスは、ページの「削除」と呼ばれます。

メモリ マップは読み取り専用であるため、ページは常にクリーンです。

カーネルは、物理メモリが不足したときにどのページを削除するかを決定します。

posix_madvise()を使用して、どのページを保持/削除したいかについてカーネルヒントを与えることができます。特に、POSIX_MADV_DONTNEED自由にページを削除するようにカーネルに指示します。または、あなたが言うように、「ページが使用されなくなったことをマークする」。

iOS が「不要」ヒントを受け入れるかどうかを確認するためのテスト プログラムを作成するのは非常に簡単です。これは BSD から派生したものなので、そうなるに違いありません。

于 2011-06-08T00:54:35.553 に答える
1

ファイルでバックアップされたメモリの標準的な仮想メモリ技術では、OS は後でページをいつでも取得できるため、必要なときにいつでも自由にページを破棄できるとされています。私は iOS を使用したことがありませんが、これは長い間、他の多くのオペレーティング システムでの仮想メモリの動作でした。

これをテストする最も簡単な方法は、いくつかの大きなファイルをメモリにマップし、それらを読み取ってメモリにページングすることを保証し、メモリ不足の状況を強制できるかどうかを確認することです。できない場合は、OS がページが使用されていないと判断した後で、ページのマップを解除したに違いありません。

于 2011-06-02T13:55:24.903 に答える
0

このdataWithContentsOfMappedFile:メソッドは、iOS5 から非推奨になりました。

これらの状況を回避するため、mmap を使用します。

于 2012-04-03T01:52:01.063 に答える