1

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

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

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

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

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

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

1 ответ1

2

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .