Рассмотрим этот пример программы:
Код: Выделить всё
#include
#include
#include
#ifdef __APPLE__
#include
#include
#include
#endif
#define MEGABYTE 1048576.0
#ifdef __linux__
typedef struct {
size_t virtual_size;
size_t resident_size;
size_t resident_size_max;
} memory_stats_t;
#endif
int main(void) {
#if defined(__linux__)
memory_stats_t stats = {};
FILE* file = fopen("/proc/self/status", "r");
if (file == NULL) return perror("fopen"), EXIT_FAILURE;
char line[256];
while (fgets(line, sizeof(line), file)) {
if (sscanf(line, "VmSize: %lu kB", &stats.virtual_size) == 1) {
stats.virtual_size *= 1024;
} else if (sscanf(line, "VmRSS: %lu kB", &stats.resident_size) == 1) {
stats.resident_size *= 1024;
} else if (sscanf(line, "VmHWM: %lu kB", &stats.resident_size_max) == 1) {
stats.resident_size_max *= 1024;
}
}
fclose(file);
#elif defined(__APPLE__)
task_t task = MACH_PORT_NULL;
kern_return_t kr = task_for_pid(mach_task_self(), getpid(), &task);
if (kr != KERN_SUCCESS) {
return fprintf(stderr, "task_for_pid error: %s\n", mach_error_string(kr)), EXIT_FAILURE;
}
mach_task_basic_info_data_t stats;
mach_msg_type_number_t task_info_count = MACH_TASK_BASIC_INFO_COUNT;
kr = task_info(task, MACH_TASK_BASIC_INFO, (task_info_t)&stats, &task_info_count);
if (kr != KERN_SUCCESS) {
return fprintf(stderr, "task_info error: %s\n", mach_error_string(kr)), EXIT_FAILURE;
}
#else
# error "Unsupported OS"
#endif
// Print memory usage information
printf("=== Current process memory usage [PID: %d]\n", getpid());
printf("Virtual: %.3f MB\n", stats.virtual_size / MEGABYTE);
printf("Resident: %.3f MB\n", stats.resident_size / MEGABYTE);
printf("Resident-Peak: %.3f MB\n", stats.resident_size_max / MEGABYTE);
return EXIT_SUCCESS;
}
Вот результат, который я получаю в Linux:
Код: Выделить всё
=== Current process memory usage [PID: 1403418]
Virtual: 2.594 MB
Resident: 1.125 MB
Resident-Peak: 1.125 MB
Для сравнения, вот что сообщает macOS:
Код: Выделить всё
=== Current process memory usage [PID: 68603]
Virtual: 4169.246 MB
Resident: 0.699 MB
Resident-Peak: 0.699 MB
Но сообщается, что использование виртуальной памяти в macOS превышает 4 ГБ. Как такая тривиальная программа использует более 4 ГБ виртуальной памяти?
Кажется очевидным, что mach_task_basic_info_data_t.virtual_size в macOS должен определяться или измеряться совершенно иначе, чем VmSize на Линуксе. Но может кто-нибудь объяснить, в чем конкретно разница? И есть ли какой-либо API в macOS, который будет определять использование виртуальной памяти процессом, используя определение, примерно такое же, как в Linux? Я не ожидаю чего-то точно такого же, но тысячекратная разница - это далеко не "примерно похожее определение".
Подробнее здесь: https://stackoverflow.com/questions/788 ... e-on-linux
Мобильная версия