2013-01-04 26 views
2

我在玩c函数malloc和calloc,我有一些问题。可以使用calloc或malloc来分配OSX中的物理内存吗?

我想看看如果我可以使用这两个函数来分配物理内存,我的Mac有4GB或RAM,当我使用malloc时,我可以分配超过4GB的方式,这意味着malloc分配物理和虚拟内存。

我有几个问题:

  1. 是我可以使用任何功能,使我只能分配物理内存(W/O分配虚拟MEM)

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

一个简单的例子将是非常赞赏:)

感谢您的帮助:)

回答

3

简短的回答:没有,没有。

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

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

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

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

+2

那么,除了你可以锁定页面到RAM,如果你需要。 – LtWorf

+1

@LtWorf:好点;请参阅[mlock函数](http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man2/munlock.2.html)。 –

+0

我发布了一个关于这个问题的答案,我真的不需要链接。 – LtWorf

3

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

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

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

+0

我试图打电话给mlock和munlock来锁定/解锁少量的RAM,但它工作正常,但是当我查看mlock手册时,它说可以锁定多少资源是有限制的。我使用函数getrlimit()试图找出我可以锁定的最大内存(RLIMIT_MEMLOCK来打印出rlim_cur和rlim_max),但它打印无穷大(最大long long int),但是如果我试图用一个疯狂的数字调用mlock,返回-1,这意味着它无法锁定。那么如果我不能使用getrlimit(),我怎么才能找到这个限制呢? – Josh

+0

1:buf = malloc(size)。 2:if(buf)then getrlimit()。 3:if(size <= limit)然后mlock(buf,size)。 [见munlock](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/munlock.2.html)[见getrlimit](https://developer.apple.com/库/ MAC /文档/达尔文/参考/手册页/ MAN2/getrlimit.2.html)。 rlimit只告诉你可以锁定/解锁的最大可能大小,你不能锁定比你分配的更多 - 换句话说:rlimit不会告诉你可以分配多少内存。 – 2014-10-01 05:12:23