Вы неправильно понимаете виртуальную память. Программы и операционная система всегда работают в виртуальной памяти. Если вы выделите 10 байтов, или 10 миллионов, или 10 миллиардов, вы выделяете виртуальную память. Ваш код, пространство стека (автоматическое хранилище, alloca и т.д.), Ваше глобальное хранилище (если оно есть) также все находятся в виртуальной памяти. Если вы берете адрес чего-либо, как в &myVariable
, результатом будет виртуальный адрес. Вы никогда не используете адреса физической памяти в операционной системе виртуальной памяти.
Общая сумма виртуального адресного пространства, необходимого ОС, а также всем программам, которые у вас работают, будет обычно превышать объем оперативной памяти, даже в современных системах. Это может быть даже верно для одной программы. Таким образом, использование ОЗУ + "пространство подкачки" для одного процесса может легко превысить ОЗУ.
Черт, весь смысл виртуальной памяти - ну, один из важных моментов - состоит в том, чтобы позволить вам писать код, который требует больше "памяти" (будь то код, данные или что-то еще), чем у вас есть ОЗУ.
Как говорили другие в комментариях, операционная система должна решить, какая часть общего виртуального адресного пространства (для ОС + все процессы) хранится в оперативной памяти, а какая - на диске (в пространстве "подкачки"). Если вы ссылаетесь на какую-то страницу (обычно 4 Кбайт в системах x86/x64) вашего виртуального адресного пространства, которая не находится в ОЗУ, ОС "заменит ее" для вас (мы также говорим "вставляет в нее" или "отказывает в ней"). ", поскольку это стимулируется" ошибкой страницы "). Некоторое время спустя ОС может решить, что ей не хватает оперативной памяти, и может удалить некоторые из самых старых или наименее часто упоминаемых элементов из оперативной памяти. Если этот материал был изменен с тех пор, как он был в последний раз помещен в ОЗУ, измененная версия должна быть сохранена на диске - поэтому материал помещается в "пространство подкачки" (или, в терминах Windows, файл подкачки).
Кстати, пространство подкачки /swapfile /swap - далеко не единственное место, где хранится содержимое виртуальной памяти, если оно не находится в ОЗУ. Сопоставленные файлы, которые обычно включают в себя каждый файл кода, являются другим местом. Код редко изменяется в оперативной памяти, поэтому он обычно только заменяется, а не выгружается. Если он должен быть потерян из ОЗУ, он просто удаляется и при необходимости снова может быть заменен обратно из того же файла, из которого он изначально был получен.