我有一个应用程序可能会有数百个内存映射,即mmap()
,在任何时间点打开文件。
我正在寻找一些帮助,以了解实际限制对打开的内存映射文件的数量是什么(如果有的话)。
我创建了这些mmap文件,如:
void* map = mmap(0, *capacity, PROT_READ | PROT_WRITE, MAP_SHARED, file, 0);
答案 0 :(得分:6)
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上运行。阅读专注于OS X的virtual memory上的苹果文档,但提到iOS上的差异