最顶尖的语言是什么?我想编写一个c ++程序,可以看到各个进程在OSX中使用了多少内存。我不能使用/ proc,因为那不是在OSX上。 top能够找出正在使用多少内存进程,因此它也不会使用它。我想知道它是如何发现的。
答案 0 :(得分:4)
可能比您正在寻找的信息更多,但OS X中的顶级产品是在开源许可下发布的:
答案 1 :(得分:4)
需要通过源代码来挖掘它,但是Top使用task_info()调用与Mach内核接口并收集内存统计信息。您可以在http://www.gnu.org/software/hurd/gnumach-doc/Task-Information.html阅读有关task_info()的一些 正确信息。我说大多数都是正确的,因为我在OS X实现中发现了至少一个区别:内存大小以字节为单位报告,而不是页面。
总结一下,你传递task_info()一个“目标任务”(mach_task_self()如果你想要你的程序本身的信息,否则使用task_for_pid()或processor_set_tasks())并告诉它你想要“基本信息”,虚拟和常驻内存大小下降的类别。然后task_info()使用您想要的信息填充task_basic_info结构。
这是我写的一个用来获取常驻内存大小的类。它还显示了如何使用sysctl获取有关系统的信息(在这种情况下,您拥有多少物理内存):
#include <sys/sysctl.h>
#include <mach/mach.h>
#include <cstdio>
#include <stdint.h>
#include <unistd.h>
////////////////////////////////////////////////////////////////////////////////
/*! Class for retrieving memory usage and system memory statistics on Mac OS X.
// (Or probably any system using the MACH kernel.)
*///////////////////////////////////////////////////////////////////////////////
class MemoryInfo
{
public:
/** Total amount of physical memory (bytes) */
uint64_t physicalMem;
////////////////////////////////////////////////////////////////////////
/*! Constructor queries various memory properties of the system
*///////////////////////////////////////////////////////////////////////
MemoryInfo()
{
int mib[2];
mib[0] = CTL_HW;
mib[1] = HW_MEMSIZE;
size_t returnSize = sizeof(physicalMem);
if (sysctl(mib, 2, &physicalMem, &returnSize, NULL, 0) == -1)
perror("Error in sysctl call");
}
////////////////////////////////////////////////////////////////////////
/*! Queries the kernel for the amount of resident memory in bytes.
// @return amount of resident memory (bytes)
*///////////////////////////////////////////////////////////////////////
static size_t Usage(void)
{
task_t targetTask = mach_task_self();
struct task_basic_info ti;
mach_msg_type_number_t count = TASK_BASIC_INFO_64_COUNT;
kern_return_t kr = task_info(targetTask, TASK_BASIC_INFO_64,
(task_info_t) &ti, &count);
if (kr != KERN_SUCCESS) {
printf("Kernel returned error during memory usage query");
return -1;
}
// On Mac OS X, the resident_size is in bytes, not pages!
// (This differs from the GNU Mach kernel)
return ti.resident_size;
}
};