Требуется некоторое копание в источнике, чтобы выяснить это, но Top использует вызов task_info () для взаимодействия с ядром Mach и сбора статистики памяти.Вы можете прочитать в основном правильную информацию о task_info () в http://www.gnu.org/software/hurd/gnumach-doc/Task-Information.html. Я говорю в основном правильно, потому что есть по крайней мере одно отличие, которое я обнаружил в реализации OS X: размеры памяти указываются в байтахНе страницывам нужна «базовая информация», категория, в которую попадают размеры виртуальной и резидентной памяти.Затем 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;
}
};