mmap的数据如何与对象分配一起使用?

时间:2012-04-04 16:45:30

标签: objective-c cocoa memory-management mmap virtual-memory

我对mmap()如何使用iOS或OSX上的框架感到困惑。

如果使用mmap()将文件映射到虚拟内存并从中请求数据,则将数据中的内核页面映射到RAM。这实际上如何影响创建对象的方式?

如果通常使用alloc / init创建对象,则分配内存块并启动对象。但是,如果数据驻留在mmap'ed文件中的虚拟内存中会怎样?是否需要在对象上调用alloc?对象的已分配内存是否充满了来自虚拟内存的数据?或者是否跳过alloc调用并将指针传递给虚拟内存中的数据?

e.g。图像或声音文件,如果我知道文件在虚拟内存中的位置,我将如何设置对象?

如果有人分配数据,如果数据已经被分页到RAM中,它是否会重复?

我在想从虚拟地址中使用内存会消除在堆上分配的需要。

1 个答案:

答案 0 :(得分:1)

如果您只有一个对象存储在mmaped空间中,那么您只需跳过alloc并直接使用该位置。但是,通常您将拥有多个对象,现在您自己管理它。通常,它的至少一部分将以固定的方式布局,以便两个过程都知道在哪里找到东西。而不是指针,你可以从竞技场的开始使用偏移,因为它可以在两个进程的地址空间中工作。

从本质上讲,你会得到一大块内存,好像你已经完成了一个大的malloc / alloc,你可以在其中玩游戏。

如果有,请说

void *p = mmap( <appropriate arguments> );

并且你想把一个foo类型的对象放在偏移量200处,你会说

foo *f = (foo *)p+200;

现在你可以以所有正常方式操作f,但不包含任何指向mmapped空间的指针。将偏移替换为这样的指针通常是好的规则,然后当你需要跟随它时,你可以将它转换为指针(通过添加p)。