23

Насколько я понимаю, подкачка и подкачка - это совершенно разные понятия. Хотя подкачка означает, что процесс полностью находится в физической памяти или на жестком диске, части процесса подкачки могут находиться в физической памяти, а другие части - на жестком диске.

Но зачем тогда linux раздел подкачки? Если физическая память заполнена, некоторые процессы будут переданы на внешний жесткий диск, а новый процесс будет сопоставлен с виртуальной памятью на физическую память.

Я просто не понимаю, зачем нужен раздел подкачки (или вообще подкачка)?

Или это просто вопрос терминологии и swap partition == virtual memory?

4 ответа4

25

Да, это просто вопрос терминологии, во многих случаях раздел подкачки используется в качестве виртуальной памяти.

Причина, по которой UNIX и UNIX-подобные системы предпочитают разделы подкачки файлам страниц, заключается в том, что они могут быть смежными, что приводит к меньшему времени поиска по сравнению с файлом страниц, который может быть фрагментирован.

14

Я не знаю, откуда вы взяли, что «подкачка означает, что процесс полностью находится в физической памяти или на жестком диске». Это значение не использовалось в течение нескольких десятилетий. Цитируя Википедию:

Исторически под обменом понималось перемещение из / во вторичное хранилище целой программы за раз по схеме, известной как свертывание / свертывание. В 1960-х годах, после того как было введено понятие виртуальной памяти - в двух вариантах, с использованием сегментов или страниц - термин «подкачка» был применен к перемещению, соответственно, сегментов или страниц, между диском и памятью. Сегодня, когда виртуальная память в основном основана на страницах, а не на сегментах, подкачка стала довольно близким синонимом подкачки, хотя с одним отличием. [Сомнительно - обсудить]

Действительно, в любом контексте, связанном с Linux (или другими Unix-системами в этом отношении), подкачка страниц и свопинг в значительной степени являются синонимами. И то, и другое относится к использованию виртуальной памяти, где данные страницы могут храниться либо в ОЗУ, либо на диске. (Страница размером 4 КБ на любом устройстве, с которым вы можете столкнуться.) Программа, использующая страницу памяти, не заботится и даже не знает, где хранятся данные, она просто использует виртуальный адрес. Ядро передает данные между ОЗУ и диском и обновляет таблицы MMU по мере продвижения, так что запись для виртуального адреса либо указывает на физическую страницу в памяти, либо содержит специальное значение, которое заставляет процессор выполнять некоторый код ядра который загрузит соответствующие данные с диска.

Пейджинг относится к этому общему процессу. Под обменом понимается случай, когда данные на диске находятся в выделенной области: области подкачки (раздел подкачки или файл подкачки). Пейджинг также может быть сделан между ОЗУ и файлом, и в данном случае это, как правило , не упоминается как замена. Например, когда вы выполняете программу, код должен быть загружен в память для выполнения; если кодовая страница должна быть удалена из ОЗУ, чтобы освободить место для чего-то другого, то нет необходимости записывать эту страницу в область подкачки, поскольку ее можно загрузить обратно из файла программы. (Это можно сделать для всех данных только для чтения, а не только для программного кода.)

Если физическая память (почти) заполнена, ядро ищет в оперативной памяти страницу (а не весь процесс), которая недавно не использовалась. Если эта страница воспроизводит содержимое файла диска (в ядре есть таблицы, указывающие на это), страницу можно восстановить. Если нет, страница записывается для обмена, а затем исправляется. В любом случае ядро обновляет запись в таблице виртуальной памяти процесса (которая становится таблицей MMU во время выполнения процесса), чтобы пометить ее как не в ОЗУ, и затем может повторно использовать физическую страницу для чего-то другого (другой программы или другой страницы та же программа).

9

Средство виртуальной памяти / пейджинга позволяет ядру "виртуализировать" память для процессов пользовательского пространства. Ядро может извлекать страницы из физической памяти и распределять их по страницам, чтобы они выглядели смежными с процессом пользовательского пространства.

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

Обычно пользовательские программы просят ядро расширить этот лимит через четко определенные интерфейсы (например, вызываемые функциями C malloc() и free() .). Ядро отвечает за отслеживание того, сколько и какой памяти выделено программе.

Этот механизм "сбоя страницы" может также позволить ядру поменять местами страницу, к которой процесс пытался получить доступ, с одной страницы с диска, если ядро способно перепроверять память (и Windows, и Linux поддерживают это), поэтому это называется своппингом. Если доступ к памяти действительно был недействительным (то есть процесс пытается получить доступ к памяти, которую он не запрашивал первым), то обычно процесс будет завершен с помощью SIGSEGV.

Таким образом, "замена" - это дополнительная функция (в Linux вы можете отключить ее полностью, если хотите), которая зависит от виртуальной памяти / подкачки, но не обязательна только потому, что процессор имеет виртуальную память / подкачку. Концепции не одинаковы, но обмен зависит от существующей подкачки / виртуальной памяти.


Кроме того, после более внимательного прочтения вашего вопроса, "подкачка страниц" иногда используется как синоним для "подкачки", но я никогда не слышал о "подкачке", означающей, что вся память процесса выгружается, а "подкачке" означает только часть это поменяно.

Но зачем тогда linux раздел подкачки? Если физическая память заполнена, некоторые процессы будут переданы на внешний жесткий диск, а новый процесс будет сопоставлен с виртуальной памятью на физическую память.

"Виртуальная память" - это физическая память, просто "переназначенная". Аппаратное обеспечение MMU не может напрямую сопоставляться с любым устройством хранения. MMU может выдать ошибку, которая сообщает ядру, что процесс пытался получить доступ к памяти, которой у него не должно быть - и ядро может использовать этот механизм, чтобы увидеть, что процесс хочет получить что-то с диска, который, как он думал, находился в памяти, и затем выполнить " своп". Дело в том, что именно операционная система решает сохранить страницы на диск, чтобы они могли использовать эти страницы для других процессов, а не для аппаратного обеспечения.

2

В общем случае раздел подкачки не равен виртуальной памяти.

Процессам может потребоваться больше памяти, чем реальной физической памяти, поэтому разработчики ОС решили предположить, что в системе больше памяти, которая называется "виртуальной памятью".

Эта виртуальная память в основном является физической памятью и частью диска. Эта часть диска называется "своп" в Linux.

Также разработчики предположили, что использование той части виртуальной памяти, которая находится на жестком диске, должно быть как можно ниже. Ради этого вся виртуальная память была разделена на небольшие порции, которые называются "страницами". Многие страницы используются с низкой скоростью, эти страницы должны быть записаны в часть виртуальной памяти на жестком диске. Эта операция называется "обмен". ОС должна отслеживать, какие страницы отсутствуют в физической памяти, чтобы найти их при необходимости. Ошибка страницы возникает, когда программа хочет записать / прочитать часть памяти, которая выгружается.

Чтобы ответить на ваш вопрос: Linux нужен раздел подкачки, чтобы выгрузить некоторые страницы памяти, и вы можете увидеть статистику использования виртуальной памяти с помощью vmstat:

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache    si   so    bi    bo   in   cs us sy id wa
2  0  35424 524560 134164 1858728    0    0    13    11   55   42  5  1 94  0
0  0  35424 526720 134164 1857872    0    0     0     0 2774 5224  7  2 91  0
1  0  35424 516328 134172 1870116    0    0     0     6 3464 6561 13  3 84  0
0  0  35424 522992 134212 1862676    0    0     0   125 4135 7135 12  4 84  1

В столбце «своп» отображается своп и статистика. Также эта ссылка объясняет виртуальную память и использование vmstat .

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