Mac OS X
总虚拟内存
这在Mac OS X上很棘手,因为它不像Linux那样使用预设的交换分区或文件。以下是苹果公司文档中的一段:
注意:与大多数基于unix的操作系统不同,Mac OS X不为虚拟内存使用预先分配的交换分区。相反,它会使用机器引导分区上的所有可用空间。
因此,如果想知道还有多少虚拟内存可用,就需要知道根分区的大小。你可以这样做:
struct statfs stats;
if (0 == statfs("/", &stats))
{
myFreeSwap = (uint64_t)stats.f_bsize * stats.f_bfree;
}
当前使用的虚拟总数
使用“vm. conf”调用systcl。Swapusage "键提供有关交换使用的有趣信息:
sysctl -n vm.swapusage
vm.swapusage: total = 3072.00M used = 2511.78M free = 560.22M (encrypted)
如果如上一节所述需要更多的交换空间,这里显示的总交换空间使用情况不会发生变化。总的就是当前掉期的总和。在c++中,可以这样查询这些数据:
xsw_usage vmusage = {0};
size_t size = sizeof(vmusage);
if( sysctlbyname("vm.swapusage", &vmusage, &size, NULL, 0)!=0 )
{
perror( "unable to get swap usage by calling sysctlbyname(\"vm.swapusage\",...)" );
}
请注意,在sysctl.h中声明的“xsw_usage”似乎没有文档,我怀疑有一种更可移植的方式来访问这些值。
进程当前使用的虚拟内存
可以使用task_info函数获取当前进程的统计信息。这包括进程的当前驻留大小和当前虚拟大小。
#include<mach/mach.h>
struct task_basic_info t_info;
mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
if (KERN_SUCCESS != task_info(mach_task_self(),
TASK_BASIC_INFO, (task_info_t)&t_info,
&t_info_count))
{
return -1;
}
// resident size is in t_info.resident_size;
// virtual size is in t_info.virtual_size;
可用总RAM
使用sysctl系统函数,系统中可用的物理RAM数量如下所示:
#include <sys/types.h>
#include <sys/sysctl.h>
...
int mib[2];
int64_t physical_memory;
mib[0] = CTL_HW;
mib[1] = HW_MEMSIZE;
length = sizeof(int64_t);
sysctl(mib, 2, &physical_memory, &length, NULL, 0);
当前使用的RAM
可以从host_statistics系统函数获得一般内存统计信息。
#include <mach/vm_statistics.h>
#include <mach/mach_types.h>
#include <mach/mach_init.h>
#include <mach/mach_host.h>
int main(int argc, const char * argv[]) {
vm_size_t page_size;
mach_port_t mach_port;
mach_msg_type_number_t count;
vm_statistics64_data_t vm_stats;
mach_port = mach_host_self();
count = sizeof(vm_stats) / sizeof(natural_t);
if (KERN_SUCCESS == host_page_size(mach_port, &page_size) &&
KERN_SUCCESS == host_statistics64(mach_port, HOST_VM_INFO,
(host_info64_t)&vm_stats, &count))
{
long long free_memory = (int64_t)vm_stats.free_count * (int64_t)page_size;
long long used_memory = ((int64_t)vm_stats.active_count +
(int64_t)vm_stats.inactive_count +
(int64_t)vm_stats.wire_count) * (int64_t)page_size;
printf("free memory: %lld\nused memory: %lld\n", free_memory, used_memory);
}
return 0;
}
这里需要注意的是,在Mac OS x中有五种类型的内存页,它们如下所示:
Wired pages that are locked in place and cannot be swapped out
Active pages that are loading into physical memory and would be relatively difficult to swap out
Inactive pages that are loaded into memory, but haven't been used recently and may not even be needed at all. These are potential candidates for swapping. This memory would probably need to be flushed.
Cached pages that have been some how cached that are likely to be easily reused. Cached memory probably would not require flushing. It is still possible for cached pages to be reactivated
Free pages that are completely free and ready to be used.
值得注意的是,仅仅因为Mac OS X可能会显示很少的实际空闲内存,这可能不是一个很好的指示有多少准备在短时间内使用。
内存当前被我的进程使用
请参阅上面的“进程当前使用的虚拟内存”。同样的代码也适用。