Почему virtual_size в macOS так отличается от VmSize в Linux?Linux

Ответить
Anonymous
 Почему virtual_size в macOS так отличается от VmSize в Linux?

Сообщение Anonymous »

Я читал, что virtual_size в macOS (из MACH_TASK_BASIC_INFO) примерно эквивалентен VmSize в Linux (как сообщает /proc/self/status). Но разница между ними более чем в 1000 раз.
Рассмотрим этот пример программы:

Код: Выделить всё

#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;
}
Я компилирую и запускаю его с помощью gcc -o memusage memusage.c && ./memusage. (Конечно, в macOS gcc на самом деле представляет собой Apple Clang, но работает та же командная строка.)
Вот результат, который я получаю в 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, оно также вполне вероятно.
Но сообщается, что использование виртуальной памяти в macOS превышает 4 ГБ. Как такая тривиальная программа использует более 4 ГБ виртуальной памяти?
Кажется очевидным, что mach_task_basic_info_data_t.virtual_size в macOS должен определяться или измеряться совершенно иначе, чем VmSize на Линуксе. Но может кто-нибудь объяснить, в чем конкретно разница? И есть ли какой-либо API в macOS, который будет определять использование виртуальной памяти процессом, используя определение, примерно такое же, как в Linux? Я не ожидаю чего-то точно такого же, но тысячекратная разница - это далеко не "примерно похожее определение".

Подробнее здесь: https://stackoverflow.com/questions/788 ... e-on-linux
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»