mmap映射的数据如何与对象分配配合使用?

3

我对在iOS或OSX框架中使用mmap()不太清楚。

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

通常使用alloc/init创建对象,分配内存块并初始化对象。但是,如果数据驻留在虚拟内存中,在mmap文件中呢?alloc需要在对象上调用吗?为对象分配的内存是否被填充了来自虚拟内存的数据?还是跳过alloc调用,只需传递指向虚拟内存中数据的指针即可?

例如,图像或声音文件,如果我知道文件在虚拟内存中的位置,该如何设置对象?

如果分配数据,如果数据已分页到RAM中,难道它不会被复制吗?

我认为使用虚拟地址的内存将消除在堆上分配的需要。

1个回答

1
如果您只在mmaped空间中存储一个对象,则可以直接跳过分配并直接使用该位置。但通常情况下,您将拥有多个对象,并且现在需要自己管理它们。通常,至少部分内容将以固定方式布局,以便两个进程都知道在哪里查找内容。您不再使用指针,而是使用相对于竞技场开头的偏移量,因为这在两个进程的地址空间中都有效。
实质上,您获得了一块内存块,就像您进行了一次大型malloc / alloc一样,您可以在其中进行操作。
如果您有,比如说
void *p = mmap( <appropriate arguments> );

如果你想在偏移量为200的位置放置一个类型为foo的对象,你可以这样说:
foo *f = (foo *)p+200;

现在,您可以按照正常的方式操作 f,前提是 f 不包含指向 mmapped 空间的指针。一般来说,用偏移量代替这些指针是很好的习惯,当您需要跟随其中一个时,您可以将其转换为指针(通过添加p)。


是的,将使用偏移量,我只是想确认如果偏移量已知并且正确的数据被视为对象,是否可以跳过alloc。例如UIImage,在已知数据上调用init,该数据已经被mmap映射。 - user773578
确认。一旦您知道偏移量,您可以将指针转换为该位置的指向您对象类型的指针,然后就可以开始运行了。 - DRVic
好的,谢谢。那么虚拟机数据是如何被访问的呢?是通过传递已知数据的偏移量和大小来实现的吗?以UIImage为例,如果我们知道偏移量500是一张图片,并且它有一定的大小,那么我们如何告诉系统只取一定量的数据并将其处理为图像呢? - user773578
我详细阐述了我的答案。希望有所帮助。如果它是一个图像或可能具有不同大小的东西,您需要像常规分配一样避免超出末尾。 - DRVic
关于在iOS中使用mmap...如果您有多个mmap对象,则必须使用偏移量,但是是否可以为每个类使用单独的mmap对象,还是它们都引用相同的虚拟内存地址空间? - taber
我自己尝试了一下,在不同的类中使用一些ivars,看起来工作得很好,很酷。 - taber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接