Всегда ли доступна виртуальная память?

Принципы виртуальной памяти:

Идея виртуальной памяти заключается в создании виртуального адресного пространства, которое не соответствует фактическим адресам в оперативной памяти. Система хранит официальную копию памяти на диске и кэширует в ОЗУ только наиболее часто используемые данные. Чтобы это работало, мы разбиваем виртуальную память на куски, называемые страницами; типичный размер страницы составляет четыре килобайта. Мы также разбиваем оперативную память на фреймы страниц, каждый из которых имеет размер страницы и готов вместить любую страницу виртуальной памяти.

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

Что делать, если на диске нет области подкачки, есть ли в системе виртуальная память?

Проще говоря, всегда ли доступна виртуальная память в системе Linux и всегда ли процесс будет иметь виртуальные адреса?

0
04.07.2017, 21:56
2 ответа

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

Таким образом, если у вас нет свопа, у вас все еще есть виртуальная память, ЦП по-прежнему использует MMU и разбивает память на страницы, но ОС не может перемещать эти страницы на диск.

http://wiki.osdev.org/Paging

5
28.01.2020, 02:45

Как упомянул пользователь 996142, есть две вещи, называемые виртуальным адресным пространством. Однако определение, которое вы показываете в своем вопросе, более конкретно говорит о пространстве подкачки. В любом случае, я думаю, что оба утверждения довольно запутаны.

На уровне ЦП вам необходимо иметь MMU, чтобы иметь то, что называется адресами виртуальной памяти. Как упоминал другой пользователь, у компьютера есть физическая память, которой присвоены физические адреса. В большинстве случаев физическая память начинается с 0 и увеличивается до общего объема имеющейся у вас памяти. Некоторым архитектурам также нравится иметь память в конце (по адресам -1, -2, -3... ). Все процессоры не имеют чипов MMU, особенно во встроенных системах. Некоторые такие системы все еще используют 8-битные процессоры, которые действительно не могут использовать MMU (, они в любом случае ограничены адресуемой памятью 64 КБ ).

Как вы упомянули, на системном уровне виртуальная память — это своп. Опять же, это не обязательно доступно. В большинстве дистрибутивов Linux своп создается автоматически во время установки. Однако есть системы, которые не делают этого автоматически (, например, DigitalOcean предлагает машины с Ubuntu, которые по умолчанию не предлагают пространство подкачки... )процессы, убитые ОС для восстановления оперативной памяти (, и в результате вы понятия не имеете, что только что произошло ).

Ядро отвечает за управление всем этим для вас.

Часть MMU имеет очень низкий уровень. Для большинства реализаций требуется запускать процессы под Linux. Без этой функции вам либо нужны процессы, которые могут выполняться в любом месте (, что было забавно на старых компьютерах Mac, работающих на процессорах 68 КБ, вы бы создавали блоки кода размером около 64 КБ, которые можно было разместить в любом месте памяти ). ] или найти способ переместить процесс...

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

Важным аспектом является то, что код процесса (ассемблерного кода для интерпретируемых языков, таких как python и php, который был бы двоичным файлом интерпретатора )не изменяется и доступен на диске для чтения -только режим. Это означает, что :вы можете заменить часть кода процесса и перезагрузить его позже по мере необходимости без огромных штрафов за замену данных, найденных в ОЗУ. Данные должны записываться на диск, а это медленно. Код нужно только прочитать. Таким образом, если часть кода процесса никогда не выполняется, эта страница кода может быть очень быстро заменена и перезагружена на случай, если позже она снова будет выполнена. Для этого подкачки не нужен диск подкачки или файл подкачки. Таким образом, даже если ваше пространство подкачки равно 0 КБ, ядро ​​​​все равно может выгрузить код запущенных процессов, чтобы сэкономить немного оперативной памяти.

1
02.10.2021, 18:10

Теги

Похожие вопросы