Таким образом, данные могут находиться в разных местах, где они могут изменяться автоматически (под действием операционной системы), и при работе в обычных программах вам вообще не нужно об этом знать.
Во-первых, тот факт, что вы объявляете массив в исходном коде, не обязательно означает, что полный массив или любой массив вообще создается в памяти. Компилятор может оптимизировать исходный код таким образом, чтобы исключить часть или весь массив.
Однако предположим, что массив действительно создан. Виртуальная память создается для создания иллюзии того, что процесс использует исключительно физическую память и/или что у него больше памяти, чем на самом деле доступно в виде физической памяти. Цель этой иллюзии состоит в том, что процессы не должны беспокоиться о том, где на самом деле находятся их данные. И подавляющее большинство нормальных процессов могут этим пренебречь.
Кроме того, по большей части компиляторы не будут обращать внимания на расположение небольших объектов относительно границ страницы. Обычно не имеет большого значения, размещается ли массив из 100 int
так, чтобы он полностью находился в пределах одной страницы или чтобы он занимал границу страницы.
Когда необходимо узнать или повлиять на то, где на самом деле находятся данные, возникает ряд проблем.
Существуют способы повлиять на расположение данных относительно границ страницы, либо используя для этой цели системные или библиотечные вызовы, либо выделяя избыточную память, а затем помещая данные в выбранное место внутри нее.
Если данные важны и желательно или требуется, чтобы они оставались в физической памяти, могут быть системные вызовы (конечно, в зависимости от системы), чтобы запросить это.
При отсутствии таких конкретных запросов местонахождение данных зависит от ряда факторов. Если вы объявите статический массив int
и инициализируете его данными времени компиляции, данные могут появиться в разделе исполняемого файла, который в конечном итоге генерируется. В некоторых системах при запуске исполняемого файла система загружает в память не весь файл. Он загружает различные части данных из исполняемого файла только тогда, когда на них есть ссылка. Таким образом, эти данные могут изначально находиться на диске. После загрузки в память, если система загружена другими вещами, которым нужна память, система может выбросить эти данные из памяти, чтобы они снова существовали только в исполняемом файле на диске.
С другой стороны, если данные генерируются во время выполнения программы, они, конечно же, находятся в памяти, когда программа их генерирует. Однако опять же, если система загружена другими требованиями, система может удалить данные из памяти. В этом случае, поскольку данные еще не существуют на диске (в отличие от данных в исполняемом файле), данные сначала записываются на страницу или в файл подкачки на диске.
Как правило, расположение данных может меняться со временем.
person
Eric Postpischil
schedule
09.09.2018