Почему Linux использует раздел подкачки, если ядро ​​все равно поддерживает пейджинговую / виртуальную память?

23

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

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

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

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

JohnnyFromBF
источник
5
Помните, что «виртуальная память» в компьютерной архитектуре является техникой, тогда как MS Windows (неправильно IMO) определяет ее как «Виртуальная память - это пространство хранения на жестком диске вашего компьютера, которое Windows использует вместе с оперативной памятью (RAM)». IE google windows "Виртуальная память"
опилки

Ответы:

25

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

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

Patuck
источник
6
И таким образом также проще разделить один раздел подкачки между установками Linux.
Октябрь
3
обычно файл подкачки полностью создается при первой загрузке, поэтому он не будет фрагментирован (ну ... есть еще несколько возможностей ...)
AndreaCi
12
Самые ранние версии UNIX имели только подкачку, но не подкачку страниц, и могли выполнять только обмен на выделенный раздел. Пейджинг был реализован, как только аппаратное обеспечение его поддержало, но название «раздел подкачки» застряло. Пейджинг к файлу более поздний и имеет более высокие издержки ОС, а также риск фрагментации, поэтому его все равно не рекомендуется.
Звол
1
msgstr "раздел подкачки используется как виртуальная память." - Только Microsoft Windows определяет вторичное хранилище (например, файл подкачки на диске) как «виртуальную память». Но даже они пытаются отойти от этого использования. Попробуйте погуглить окна «виртуальная память», и синопсис для первого результата («Виртуальная память - это пространство хранения ...») не соответствует содержимому страницы. Правильное утверждение будет «раздел подкачки используется на виртуальной памяти.»
опилки
14

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

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

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

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

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

Жиль "ТАК - перестань быть злым"
источник
Первый абзац вашего ответа говорит ему, откуда у него идея: старые документы. (Я помню, когда была разница между подкачкой и подкачкой, тоже.)
RonJohn
9

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

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

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

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

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


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

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

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

LawrenceC
источник
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.

soroosh
источник