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