2012-02-07 12 views
5

私は潜在的に数百のメモリがマップされているアプリケーションを持っています。すなわち、mmap()というファイルがいつでも開いています。iOSのメモリマップファイル数には実際的な制限がありますか?

私は実際の制限が開いているメモリのマップされたファイルの数に何があるかを理解するための助けを探しています。

void* map = mmap(0, *capacity, PROT_READ | PROT_WRITE, MAP_SHARED, file, 0); 
+0

アプリがクラッシュするまで作成したことがありますか?あなたが得るエラーメッセージは、あなたが最初に打つ限界を教えてくれるでしょう。 – Douglas

答えて

5

iOSのカーネルはプロセスあたりの仮想メモリの700メガバイトの周りに割り当てます。

は、私のようなこれらのmmapファイルを作成します。それがあなたの限界になるでしょう。

マップされたデータをタッチすると、カーネルがデータをRAMに仮想メモリからページングする際のRAMの制限が異なります。 RAM自体がいっぱいになると、他のアプリケーションでどのくらいのRAMが接続されているかに応じて、iPhone 4で約40MBのデータが要求され、さらにマップされたデータを要求すると、カーネルはRAMからデータをページングし、 RAMにページングします。

覚えておくべきもう1つのことは、PROT_READ | PROT_WRITEを使用すると、マッピングされたファイルにデータを書き込むことができるということです。マッピングされたファイルにデータを書き込むことを決めた場合、これは割り当てられた領域の700 MBに影響を与えます。

仮想メモリの上限は700MBで、1つのファイルを500MBにマップしてから別の200MBのデータを書き込むかどうか、たとえば、あなたが今読み込んだ10 X 70mbの地図ファイル。

最後に、mmap()を使用して正常にマップされたファイルを受信すると、マップされたデータのソースであった開いたファイルを解放することができます。

これが役に立ちます。

追加情報:

  • iphoneの700メガバイトの仮想メモリと40メガバイトのRAMの周りに関しては、これは楽器を使用してプロファイリングを行うことから来ています。

  • システムメモリ管理の実際の動作について。 virtual memory iOSでの動作についてOS Xに焦点を当てたvirtual memoryのAppleドキュメントを読むが、iOSの違いについて触れている

+0

答えをありがとう!この情報はAppleのサイトのどこかで定義されているので、私はそれについてもっと詳しく読むことができますか? –

+0

@TReddy - 私は自分の答えを更新しました。カーネルが実際に下位レベルのメモリをどのように扱っているか興味があれば、コメントを追加して、さらにソースを追加することができます。 :D – jarryd

+0

リンクありがとうございました...非常に有益... –

関連する問題