вероятность того, что в пространстве подкачки находится больше данных, чем в моей физической памяти

вероятность того, что в пространстве подкачки находится больше данных, чем в моей физической памяти

ЦитируяРуководство по развертыванию от centos.orgто есть,

Пространство подкачкив Linux используется, когда объем физической памяти (ОЗУ) заполнен.

И этоВикипедиятакже сказал, что,

Термин «своп» [используется] для описания как процесса перемещения страниц памяти между оперативной памятью и диском, так и области диска, на которой хранятся страницы.

Теперь, как так получается, что в некоторых случаях в пространстве подкачки находится больше данных, чем в моей физической памяти? Я считаю, что когда системе требуется больше памяти, чем физически доступно, ядро ​​выгружает менее используемые страницы и отдает память текущему приложению (процессу), которому память нужна немедленно. Поэтому в пространстве подкачки не должно храниться данных, превышающих объем оперативной памяти.

Вот откуда я исходил, пожалуйста, посмотрите на скриншот ниже.

введите описание изображения здесь

решение1

Вы неправильно понимаете виртуальную память. Программы и операционная система всегда работают в виртуальной памяти. Если вы выделяете 10 байт, или 10 миллионов, или 10 миллиардов, вы выделяете виртуальную память. Ваш код, ваше стековое пространство (автоматическое хранение, alloca и т. д.), ваше глобальное хранилище (если оно у вас есть) также находятся в виртуальной памяти. Если вы берете адрес чего-либо, как в &myVariable, результатом будет виртуальный адрес. Вы ''никогда'' не используете адреса физической памяти в ОС виртуальной памяти.

Суммарный объем виртуального адресного пространства, необходимого ОС, а также всех запущенных вами программ составитрегулярнопревышает размер ОЗУ, даже на современных системах. Это может быть справедливо даже для одной программы. Таким образом, использование ОЗУ + "пространство подкачки" для одного процесса может легко превысить размер ОЗУ.

Черт возьми, весь смысл виртуальной памяти — вернее, один из важных моментов — в том, чтобы позволить вам писать код, которому требуется больше «памяти» (будь то код, данные или что-то еще), чем у вас есть в оперативной памяти.

Как уже отмечалось в комментариях, операционная система сама решает, какая часть общего виртуального адресного пространства (для ОС и всех процессов) хранится в оперативной памяти, а какая — на диске (в пространстве «свопа»). Если вы ссылаетесь на какую-то страницу (обычно 4 Кбайт на системах x86/x64) вашего виртуального адресного пространства, которая не находится в оперативной памяти, ОС «подкачивает» ее для вас (мы также говорим «подкачивает» или «вызывает ошибку», поскольку это вызвано «ошибкой страницы»). Через некоторое время ОС может решить, что у нее не хватает оперативной памяти, и может удалить из оперативной памяти часть самых старых или наименее часто используемых данных. Если эти данные были изменены с момента последнего помещения в оперативную память, измененную версию необходимо сохранить на диске — вот почему данные помещаются в «пространство подкачки» (или, в терминах Windows, в файл подкачки).

Кстати, файл подкачки/файл подкачки/пространство подкачки — далеко не единственное место, где хранится содержимое виртуальной памяти, если оно не находится в ОЗУ. Отображенные файлы, которые обычно включают в себя каждый файл кода, — это еще одно место. Код редко изменяется, пока находится в ОЗУ, поэтому он обычно только выгружается, а не выгружается. Если его нужно потерять из ОЗУ, его просто удаляют, и при необходимости его можно выгрузить обратно из того же файла, из которого он изначально был взят.

Связанный контент