iOS中的内存映射文件的数量是否有实际的限制?
我有一个应用程序,可能有数百内存映射,即mmap()
,在任何时间点打开的文件。
我正在寻找一些帮助,理解什么,如果有的话,实际限制是在打开的内存映射文件的数量是。
我创build这些mmap文件,如:
void* map = mmap(0, *capacity, PROT_READ | PROT_WRITE, MAP_SHARED, file, 0);
iOS内核每个进程分配大约700MB的虚拟内存。 所以这将是你的极限。
RAM上的限制会随着内核从虚拟内存中将数据分页到RAM中而不同。 当RAM本身填满时,iphone 4上大约有40MB,取决于其他应用程序连接了多lessRAM,并且您请求更多的映射数据,内核将需要从RAM中分页数据,并用请求的数据replace分页到RAM。
另外要记住的是,如果你使用PROT_READ | PROT_WRITE
PROT_READ | PROT_WRITE
然后你允许数据被写入映射的文件。 如果您决定将数据写入映射文件,这将影响700MB的分配空间。
所以虚拟内存的限制是700MB,无论是映射一个500MB的文件,然后再写入200MB的数据,或者如果您有例如10 X 70mb的刚刚读取的映射文件。
最后一件事是,只要您使用mmap()
接收到成功映射的文件,就可以释放已经映射的数据源的打开文件。
希望这可以帮助。
附加信息:
-
关于iPhone的700MB的虚拟内存和约40MB的RAM,这来自使用仪器进行分析。
-
关于系统内存pipe理的实际工作。 阅读虚拟内存关于这是如何工作在iOS上。 阅读专注于OS X的虚拟内存上的苹果文档,但在iOS上提到了差异