В игре много факторов, и я не способен ни повторить большинство из них, ни понять их.Но вот небольшой обзор некоторых вещей, происходящих в фоновом режиме:
Виртуальная память
В большинстве современных пользовательских систем у вас фактически нет прямого доступа к ОЗУ.У вас есть несколько уровней косвенности, один из которых - виртуальная память.ВМ - это память, к которой ваш процесс обращается, как если бы это была обычная непрерывная ОЗУ, но которую на самом деле базовые системы конвертируют в нужный адрес в ОЗУ.Таким образом, доступ к физической памяти с помощью виртуального адреса почти наверняка не даст вам данных, которые вы искали.
Виртуальная память также имеет слои.Современные процессоры включают встроенную поддержку виртуальной памяти, и она часто контролируется с помощью MMU рядом или на том же кристалле, что и процессор.
Многие ОС также имеют свой собственный уровень виртуальной памятито, что они затем либо переводят в управляемую виртуальную память MMU на процессоре, либо напрямую в физическую память.
Просто пример того, как далеко заходит кроличья нора, в Linux на самом деле ленивое распределение памяти.Поэтому, когда вы впервые выделяете память, она не передается на ЦП, а сохраняется только в структуре данных ядра, и при последующем обращении к памяти ЦП генерирует Page Fault .Затем обработчик ошибок страницы ядра проверяет, была ли эта память отложена и, если это так, фактически выделяет ее.
Пространство ядра против пространства пользователя
Программам пространства пользователя не разрешено изменять физическую памятьнапрямую, а в случае * nixes они вызывают Системные вызовы , чтобы сделать это для них.Системные вызовы изменяют режим работы ЦП и часто являются относительно медленными операциями.
Библиотечные функции
Библиотечные функции, такие как malloc
, фактически должны вести большую бухгалтерию, чтобы убедиться, чтокогда вы звоните free
по указателю, вы освобождаете только эту часть.Но они также выделяются в объемах.malloc
on * nixes вызывает системный вызов mmap
для выделения страницы.Последующие malloc
звонки будут продолжать использовать эту страницу до тех пор, пока вам не понадобится больше.
Как это относится к этому вопросу?
Вышеприведенное является лишь проблеском того, что происходит, когда вы 'работа с памятью, и то, как вы распределяете память, какое количество и какие флаги вы передаете системе, многое меняет и может объяснить расхождения между результатами.
Предложение
Попробуйте запустить strace
на этих процессах, чтобы увидеть, где они проводят большую часть своего времени!