【问题标题】:How does mmap'ed data work with object allocation?mmap 数据如何与对象分配一起工作?
【发布时间】:2012-04-18 10:17:44
【问题描述】:

我对 mmap() 如何与 iOS 或 OSX 上的框架一起工作有点困惑。

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

如果通常使用alloc/init 创建对象,则分配内存块并启动对象。但是如果数据驻留在虚拟内存中,在mmap'ed 文件中怎么办? alloc 是否需要在对象上调用?为对象分配的内存是否被虚拟内存中的数据填充?还是跳过alloc 调用,只传递指向虚拟内存中数据的指针?

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

如果分配数据,如果数据已经被分页到RAM中,它不会重复吗?

我在想,使用来自虚拟地址的内存将消除在堆上分配的需要。

【问题讨论】:

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


    【解决方案1】:

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

    本质上,您获得了一大块内存,就好像您完成了一个大的 malloc/alloc 并且您可以在其中玩耍。

    如果你有,说

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

    如果你想在偏移量 200 处放置一个 foo 类型的对象,你会说

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

    现在您可以以所有正常方式操作 f,但 f 不包含任何指向映射空间的指针。将偏移量替换为此类指针通常是一种很好的纪律,然后当您需要跟随一个时,您可以将其转换为指针(通过添加 p)。

    【讨论】:

    • 是的,将使用偏移量,我只是想确认如果偏移量已知并且正确的数据被视为对象,是否可以跳过alloc。例如 UIImage,在 mmap'ed 的已知数据上调用 init
    • 已确认。知道偏移量后,您可以将指向该位置的指针转换为指向您的对象类型的指针,然后您就可以开始运行了。
    • 好的,谢谢。那么如何访问 vm 数据呢?是否通过已知数据的偏移量和大小?以 UIImage 为例,如果已知偏移量 500 是图像,并且它是一定大小的,我们如何告诉系统只取一定数量的数据并将其作为图像处理?
    • 我详细说明了我的答案。希望有帮助。如果它是一个图像,或者可能有不同大小的东西,你需要避免像定期分配一样在末端徘徊。
    • 关于在 iOS 中使用 mmap ...所以如果您有多个 mmap 对象,则必须使用偏移量,但是每个类是否可以有一个单独的 mmap 对象,或者它们都引用相同的虚拟内存地址空间?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    相关资源
    最近更新 更多