可以使用calloc或malloc在OSX中仅分配物理内存吗?

时间:2013-01-04 12:13:11

标签: macos memory malloc memory-address calloc

我正在使用c函数malloc和calloc,我有一些问题。

我想看看我是否可以使用这两个函数来仅分配物理内存,我的mac有4gb或ram,当我使用malloc时,我可以分配超过4gb的方式,这意味着malloc分配物理和虚拟内存。 / p>

我有几个问题:

  1. 有没有我可以使用的功能,所以我只能分配物理内存(没有分配虚拟内存)

  2. 在调用malloc和calloc时,当指针返回时,有什么方法可以使用指针来确定分配了多少物理内存以及分配了多少虚拟内存?

  3. 一个快速的例子将非常感激:)

    感谢您的帮助:)

2 个答案:

答案 0 :(得分:3)

简答:不,不。

答案很长:“虚拟内存”并不意味着它存储在磁盘上,这意味着它的实际位置被抽象掉了,所以你的程序无法分辨出它实际存储的位置。这意味着VM系统可以移动“相同”内存以优化计算机的整体内存使用。一页虚拟内存最初存储在RAM中是完全正常的,然后(如果它暂时不使用)分页到磁盘为其他东西腾出空间,然后(当它实际被访问时)被分页回到RAM中,然后回到磁盘,然后回到RAM等等。

用户空间程序始终通过此抽象层访问所有内存;也就是说,您的程序无法分配或访问除虚拟内存之外的任何内容。

有一类称为“有线”的内存。它仍然是虚拟的,但是分页策略不允许将其移出磁盘。你的程序不能分配这个;只有内核可以。

我建议您阅读Apple开发者网站的discussion of memory management了解详情。

答案 1 :(得分:3)

是的,您可以使用mlock()将内存区域仅保留在RAM中,避免将其分页。它通常用于加密,以避免密钥进入磁盘,之后有被攻击者检索的危险。

当然,您可以锁定在RAM中的内存量是有限的。 它仍然是虚拟内存,但不会进入磁盘,我想这就是你想要的。

malloc / calloc是围绕操作系统实际调用分配内存的libc包装器(我不知道OSX上可能有什么),并且它们保留内部缓冲区以避免过于频繁的系统调用。您应该看到这些调用的libc实现,并查看它们保存数据的位置和格式,以便您可以访问它。