fdh*_*fdh 6 c c++ macos objective-c
我需要检索系统中存在的RAM总量和当前使用的总RAM,因此我可以计算一个百分比.这类似于:在MacOS X上检索系统信息?
但是,在那个问题中,最佳答案建议如何通过以下方式获取RAM:
/usr/bin/vm_stat
Run Code Online (Sandbox Code Playgroud)
由于我的程序的性质,我发现我不能从该文件中读取 - 我需要一种方法,它将为我提供RAM信息,而无需简单地打开文件并从中读取.我正在寻找与函数调用有关的东西.这样的事情最好是:getTotalRam()和getRamInUse().
我显然不希望它那么简单但我正在寻找除了从文件中读取之外的解决方案.
我正在运行Mac OS X Snow Leopard,但最好能获得适用于所有当前Mac OS X平台(即Lion)的解决方案.
解决方案可以是C++,C或Obj-C,但是在我的情况下C++是最好的解决方案,所以如果可能的话请尝试用C++提供.
sbo*_*oth 11
通过以下方式获取机器的物理内存很简单sysctl:
int mib [] = { CTL_HW, HW_MEMSIZE };
int64_t value = 0;
size_t length = sizeof(value);
if(-1 == sysctl(mib, 2, &value, &length, NULL, 0))
// An error occurred
// Physical memory is now in value
Run Code Online (Sandbox Code Playgroud)
虚拟机统计数据稍微有些棘手:
mach_msg_type_number_t count = HOST_VM_INFO_COUNT;
vm_statistics_data_t vmstat;
if(KERN_SUCCESS != host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vmstat, &count))
// An error occurred
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用vmstat中的数据来获取您想要的信息:
double total = vmstat.wire_count + vmstat.active_count + vmstat.inactive_count + vmstat.free_count;
double wired = vmstat.wire_count / total;
double active = vmstat.active_count / total;
double inactive = vmstat.inactive_count / total;
double free = vmstat.free_count / total;
Run Code Online (Sandbox Code Playgroud)
还有一个64位版本的界面.
你不应该从/ usr/bin/vm_stat读取,而是你应该运行它; 这是一个程序.看看前四行输出
Pages free: 1880145.
Pages active: 49962.
Pages inactive: 43609.
Pages wired down: 123353.
Run Code Online (Sandbox Code Playgroud)
在系统页面大小(由getpagesize()返回)中添加右列中的数字和多个数字,您将获得系统中物理内存的总量(以字节为单位).
vm_stat在Mac OS上不是setuid,所以我假设某个地方有一个非特权API来访问这些信息,而vm_stat正在使用它.但我不知道那个界面是什么.
您可以通过查看top命令的来源找出这个问题的答案.您可以从http://opensource.apple.com/下载源代码.该10.7.2源作为存档位置或浏览的形式在这里.我建议下载存档并打开,top.xcodeproj以便您可以使用Xcode查找定义(在Xcode中按命令单击非常有用).
该top命令显示标签"PhysMem"后的物理内存(RAM)编号.在项目中搜索该字符串,我们在函数update_physmem中找到它globalstats.c.它从vm_statstruct 的成员计算已使用和可用的内存数libtop_tsamp_t.
您可以命令 - 单击"vm_stat"以查找其声明为libtop_tsamp_tin 的元素libtop.h.它被声明为类型vm_statistics_data_t.命令单击跳转到其定义中/usr/include/mach/vm_statistics.h.
搜索项目为"vm_stat",我们发现,它是由函数填充在libtop_tsamp_update_vm_stats在libtop.c:
mach_msg_type_number_t count = sizeof(tsamp->vm_stat) / sizeof(natural_t);
kr = host_statistics(libtop_port, HOST_VM_INFO, (host_info_t)&tsamp->vm_stat, &count);
if (kr != KERN_SUCCESS) {
return kr;
}
Run Code Online (Sandbox Code Playgroud)
libtop_port如果要打电话,您需要弄清楚如何设置host_statistics.我相信你能为自己解决这个问题.
| 归档时间: |
|
| 查看次数: |
4503 次 |
| 最近记录: |