Ответы:
По требованию. Фактически, Linux будет медленно переводить физическую память для перестановки в режиме ожидания (см .: «swappiness»).
Во время обычной работы данные из подкачки загружаются в память по требованию, как отвечали другие, но есть еще один случай, когда это происходит: когда пространство подкачки отключено, при условии, что физической памяти достаточно для загрузки всего содержимого подкачки.
Просто делать:
swapoff -a
… И все ваши данные подкачки «вернутся» в память. Побочным эффектом является то, что дисковые буферы / кеши могут быть сброшены.
Иногда это может быть желательно сделать swapoff -a ; swapon -a
, например, после некоторого ошибочного процесса утечки памяти, перед сбоем, выметаются более важные процессы - чтобы убедиться, что любой процесс, работающий в системе, загружен в память и не будет ждать замены в несколько минут.
swapoff
который не потерпит неудачу, но вскоре после этого система исчерпает память, swapoff
а OOM остановит случайный процесс (в худшем случае оболочка swapon
или swapon
команда). На практике это маловероятно - кэш-память использует много памяти перед вызовом, swapoff
поэтому для выполнения обеих команд должно быть достаточно оперативной памяти.
Как уже отмечали другие, страницы будут копироваться обратно в ОЗУ только при необходимости (по требованию) вместо того, чтобы занимать ОЗУ, которое лучше оставить доступным для кеша / буферов.
Тот факт, что страницы копируются обратно в ОЗУ, а не перемещаются, важен и может привести к путанице, если вы не знаете об этом. Страница не будет освобождена из подкачки, если она больше не нужна вообще (т. Е. Страница полностью освобождена), не будет изменена в ОЗУ (так что копия в свопе больше не является правильной), или своп не заканчивается (и -дисковые блоки необходимы для замены некоторых других страниц). Таким образом, если в будущем страница должна быть заменена снова, запись на диск не требуется, поскольку ядро знает, что на диске уже есть хорошая копия - это может значительно уменьшить «перегрузку», когда объем доступной ОЗУ становится критически низким, но места подкачки также нет. перегруженным.
Вы можете видеть, сколько страниц в настоящее время находится как в оперативной памяти, так и в cat /proc/meminfo
разделе подкачки. SwapCached
Строка - это объем данных на страницах, которые в настоящее время находятся как в оперативной памяти, так и на диске. Если вы думаете, что ваш текущий своп использует его выше, чем вы ожидаете, проверьте значение SwapCached, так как это может хорошо объяснить расхождение.
Обычно это связано с оборудованием, которое вы используете. На большинстве аппаратных средств (включая Intel) MMU контролирует весь процесс.
Когда программа выделяет память, она запрашивает ее у MMU и возвращает виртуальный адрес. В свою очередь, MMU зарегистрирует эту страницу как «используемую» в глобальной карте адресного пространства.
Когда программа фактически получит доступ к этому пространству памяти, MMU будет искать страницу в карте адресов. Если эта страница находится в «живой» памяти, она отправит обратно «живой» указатель на ОС, которая будет обрабатывать чтение / запись памяти от имени программы. Если память в настоящее время не выделена, то это вызовет ошибку страницы. Это исключение процессора затем перехватывается ОС, которая затем выясняет, где находятся данные в файле подкачки, загружает их в физическую память и возвращает страницу обратно в MMU, чтобы можно было продолжить начальный процесс.
Это означает, что до тех пор, пока к странице памяти не будет произведен доступ, она никогда не вернется в «живую» память после помещения в swap. Вот почему обычно существует OS API, который позволяет программам указывать, что конкретный блок памяти НЕ должен быть перенесен на диск и должен храниться в памяти (я не знаю о Linux, но в Windows это функция VirtualLock) ,
mlock(2)
linux.die.net/man/2/mlock