2012-02-07 51 views
5

我有一个应用程序,可能有数百个映射的内存,即mmap(),文件在任何时间点打开。iOS中的内存映射文件数量是否存在实际限制?

我正在寻找一些帮助了解什么,如果有的话,实际限制是打开的内存映射文件的数量是。

我创造这样的MMAP文件:

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

差异,你试过只是创造他们,直到应用程序崩溃?您收到的错误消息会告诉您您首先遇到的限制。 – Douglas 2012-02-08 00:47:08

回答

5

的iOS内核分配各地的每个进程的虚拟内存700MB。所以这将是你的极限。

您在RAM上的限制将随着内核在您触摸映射数据时从虚拟内存中将数据分页到RAM中而有所不同。当RAM本身填满时,iphone 4上大约有40MB,这取决于其他应用程序连接了多少RAM,并且您请求更多的映射数据,内核将需要将数据分页出RAM,并用请求的数据替换它分页到RAM。

要记住的另一件事是,如果您使用PROT_READ | PROT_WRITE那么您允许将数据写入映射文件。如果您决定将数据写入映射文件,这将影响700MB的分配空间。

因此,虚拟内存的限制是700MB,无论你映射一个500MB的文件,然后再写入另一个200MB的数据,或者如果你有, 10 X 70mb您刚刚阅读的映射文件。

最后一件事是,只要您使用mmap()接收到成功映射的文件,就可以释放作为映射数据源的打开文件。

希望这会有所帮助。

附加信息:

  • 关于iPhone的700MB虚拟内存和40MB左右的RAM,这来自于使用的仪器做分析。

  • 关于系统内存管理的实际工作情况。请阅读virtual memory 关于这是如何在iOS上运行的。阅读苹果文档上virtual memory侧重于OS X,但提到在iOS

+0

感谢您的回答!这些信息是否定义在Apple网站的某个地方,这样我可以更详细地了解它? – 2012-04-04 17:06:13

+0

@TReddy - 我更新了我的答案。如果您对内核如何在较低级别处理内存感兴趣,请添加注释并添加更多源代码。 :D – jarryd 2012-04-07 19:00:05

+0

感谢您的链接...非常丰富... – 2012-04-08 01:59:23