Как массивы хранятся в виртуальной памяти? - PullRequest
0 голосов
/ 09 сентября 2018

Если у вас есть массив

int arr[100];

Как именно он хранится на современной машине, которая, очевидно, работает с использованием виртуальной памяти?

Я понимаю, что мы должны использовать разбиение на страницы с виртуальной памятью, и поскольку массив является непрерывным блоком, если у нас есть страница размером 4 КБ, этот массив arr поместится на 1 странице.

Но тогда эта страница хранится на диске или в оперативной памяти?

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

Таким образом, данные могут находиться в разных местах, где они могут изменяться автоматически (действиями операционной системы), и при работе в обычных программах вам, как правило, не нужно знать об этом.

Во-первых, тот факт, что вы объявляете массив в исходном коде, не обязательно означает, что полный массив или какой-либо другой массив вообще создается в памяти. Компилятор может оптимизировать исходный код способами, исключающими часть или весь массив.

Однако предположим, что массив действительно создан. Виртуальная память создается для того, чтобы создать иллюзию того, что процесс использует исключительно физическую память и / или имеет больше памяти, чем фактически доступно в качестве физической памяти. Цель этой иллюзии состоит в том, что процессы не должны беспокоиться о том, где на самом деле находятся их данные. И подавляющее большинство нормальных процессов может пренебречь этим.

Кроме того, по большей части компиляторы будут уделять мало внимания расположению небольших объектов относительно границ страницы. Обычно не имеет большого значения, будет ли массив 100 int размещен так, чтобы он целиком находился в пределах одной страницы, или чтобы он занимал границу страницы.

Когда необходимо знать, где находятся данные, или влиять на них, возникает ряд вопросов.

Существуют способы повлиять на расположение данных относительно границ страниц, либо используя системные или библиотечные вызовы для этой цели, либо выделяя избыточную память, а затем помещая данные в выбранное место внутри нее.

Если данные важны и предпочитаются или должны оставаться в физической памяти, могут потребоваться системные вызовы (конечно, в зависимости от системы) для запроса этого.

При отсутствии таких конкретных запросов расположение данных зависит от ряда факторов. Если вы объявляете статический массив int и инициализируете его данными времени компиляции, данные могут появиться в разделе исполняемого файла, который в конечном итоге создается. В некоторых системах при запуске исполняемого файла система не загружает весь файл в память. Он загружает различные части данных из исполняемого файла только тогда, когда на них ссылаются. Таким образом, эти данные могут изначально находиться на диске. После загрузки в память, если система обременена другими вещами, нуждающимися в памяти, система может удалить эти данные из памяти, чтобы они снова существовали только в исполняемом файле на диске.

С другой стороны, если данные генерируются во время выполнения программы, они, конечно, находятся в памяти, когда программа генерирует их. Однако, опять же, если система обременена другими требованиями, система может удалить данные из памяти. В этом случае, поскольку данные еще не существуют на диске (как данные в исполняемом файле), данные сначала записываются на страницу или в файл подкачки на диске.

Обычно, когда данные могут меняться со временем.

0 голосов
/ 09 сентября 2018

Я понимаю, что мы должны использовать пейджинг с виртуальной памятью.

Вы не должны использовать пейджинг. Вы можете отключить подкачку.

Если у нас есть страница размером 4 КБ, этот массив arr поместится на 1 странице.

Он может умещаться на странице 4 КБ, но, скорее всего, он не будет выровнен на (или около) границе 4 КБ, поэтому в действительности он, вероятно, будет храниться на двух страницах.

Эта страница хранится на диске или в оперативной памяти?

Массивы ничем не отличаются от других структур данных. Они хранятся в памяти (ОЗУ), если операционная система не выгружает их на диск DISK, если в памяти недостаточно памяти.

...