2

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

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

我有一些问题:

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

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

一个简单的例子将不胜感激:)

感谢您的帮助 :)

4

2 回答 2

3

简短的回答:不和不。

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

用户空间程序总是通过这个抽象层访问所有内存;也就是说,您的程序不能分配或访问除虚拟内存之外的任何内容。

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

我建议阅读 Apple 开发者网站关于内存管理的讨论以了解更多详细信息。

于 2013-01-04T15:47:40.913 回答
3

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

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

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

于 2013-01-05T09:58:09.123 回答