я запутался с некоторыми понятиями, что мне нужен кто-то, чтобы уточнить это для меня.

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

примечание: до этого момента мне нужен кто-то, чтобы поправить меня, если я ошибаюсь !!

Теперь, когда программа хочет использовать данные, которые хранятся на диске (страницах), но не отображаются в памяти (кадры), память должна выполнять замену страниц правильно ?!

например, он использует оптимальный алгоритм замены страницы, теперь, когда мы знаем (если это правда), что в физической памяти есть кадры, и каждый кадр имеет размер в байтах (как блок данных, содержащий серию байтов, представляющих инструкции программа правильная ?! ) если программа запрашивала данные, которые не отображаются в память (ошибка страницы) и нуждаются в замене страницы, используя оптимальный алгоритм, я знаю, что мой следующий вопрос глуп, потому что замена страницы очевидна, так как она заменяет полная страница, но действительно ли она заменяет полную страницу или байты внутри страницы (то есть рамки страницы), потому что я видел этот пример в следующем видео, и я запутался в том, что он сказал в начале видео, которое мы имеем кадр размера 3 (не 3 кадра в памяти), и он начинает заменять страницы на странице размером 3, я имею в виду, чтобы заменить 3 страницы, у вас должно быть 3 соответствующих страницы в физической памяти, верно ?!

Пожалуйста, мне нужно, чтобы кто-нибудь объяснил мне, что происходит, потому что я понял, как работает алгоритм, но у меня проблемы с концепциями, которые он использует !!

видео: https://www.youtube.com/watch?v=uYcVtK65KHk

PS: Извините, что слишком долго объяснил, и извините за мой плохой английский,

С уважением

1 ответ1

2

Отказ от ответственности: большая часть этого ответа ориентирована на Windows, особенно на некоторые термины, и на x86/x64. Большинство концепций применимы к большинству других универсальных операционных систем виртуальной памяти и большинству других платформ, хотя мелкие детали и некоторые термины будут отличаться.

часть программы хранится на жестком диске во время выполнения, то есть в виртуальной памяти, верно ?!

Э-э, да, но это еще не все для ВМ. (Примечание: "ВМ" в этом ответе всегда будет означать "виртуальная память", а не "виртуальная машина".) В типичной среде виртуальных машин все адресное пространство программы + операционной системы рассматривается как находящееся в виртуальной памяти.

В любой момент подмножество виртуальной памяти является "резидентным", что означает «в ОЗУ и на которое можно ссылаться, не вызывая ошибки страницы». Большая часть остатка находится во "вторичном хранилище", которое в наши дни почти всегда является диском или твердотельным накопителем. (Другое название "вторичного хранилища", которое специально используется для хранения нерезидентной виртуальной памяти, - "резервное хранилище".)

Существует третье подмножество виртуального адресного пространства, которое находится в оперативной памяти, но тем не менее для доступа к нему потребуется ошибка страницы - в Windows это будет страница в списке измененных или резервных страниц или уже открытая страница с общим доступом. в ОЗУ для какого-либо другого процесса, но еще не действителен для того, который вызвал ошибку. Есть также ошибки "ноль спроса". Все это примеры "мягких ошибок", то есть тех, которые не требуют чтения с диска. Я не буду вдаваться в эти случаи здесь, потому что это будет длинный ответ в любом случае, а также они не имеют отношения к вашему вопросу: ни один из них не связан с заменой страницы.

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

Это страницы ОЗУ, которые называются "фреймами страниц", а не их содержимое (т.е. не данные). Кроме того, кстати, это не только данные, но и код программы, который вводится с помощью подкачки.

Существует ли таблица сопоставления между виртуальной памятью и физической памятью, верно?

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

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

а также есть логический адрес, сгенерированный процессором и сопоставленный с реальным физическим адресом памяти, верно ?! Таким образом, отображение страниц и сопоставление логических адресов - это две разные вещи, но некоторые из них работают так же, как правильно или неправильно ?!

И "логический адрес", и "линейный адрес" являются терминами, обычно связанными с сегментной адресацией x86. (или как мы, живущие в плоских адресных пространствах с 70-х годов, называем это "безумной адресацией".) "Логический адрес" состоит из "смещения" или "смещения", которое исходит из операнда команды, плюс базовый адрес "сегмента памяти", неявно или явно используемый этим операндом. Существует шесть возможных сегментов, которые называются C для кода (неявно используются для всего, что ссылается на поток инструкций, например инструкции CALL и JMP), D для данных (используются неявно для большинства ссылок, не связанных с кодом), S для стека (неявно используются для ссылок, включающих регистр указателя стека) и три "дополнения", E, F и G, которые можно использовать для чего угодно. Кодирование операнда позволяет вам переопределить сегмент по умолчанию в некоторых случаях. MMU добавляет смещение к базовому адресу сегмента вместе, чтобы сформировать "линейный адрес".

На практике в современных ОС сегментирование практически отключено. Я имею в виду, что почти все сегменты (кроме сегментов F и G) имеют базовый адрес 0, поэтому "смещение", определяемое операндами инструкции, просто становится линейным адресом. , А когда в процессоре включена "подкачка страниц" (это происходит очень рано при загрузке ОС и никогда не отключается во время работы ОС), линейный адрес затем переводится как виртуальный адрес через таблицы страниц. Таким образом, мы действительно не думаем с точки зрения "линейных адресов" в операционных системах VM. Смещение такое же, как линейный адрес такой же, как виртуальный адрес, и мы просто думаем о виртуальных адресах.

Кстати, разработчики x64 в AMD, посоветовавшись с инженерами ядра различных ОС, практически полностью исключили механизм сегментирования ... за исключением сегментов F и G, которые Windows и другие ОС используют для определения ключевых структур данных ОС.

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

Теперь, когда программа хочет использовать данные, которые хранятся на диске (страницах), но не отображаются в памяти (кадры), память должна выполнять замену страниц правильно ?!

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

  1. Определение, где на диске хранится содержимое нужной страницы
  2. Нахождение доступной физической страницы ОЗУ и назначение ее в сбойный процесс
  3. Чтение содержимого диска на доступную страницу
  4. Обновление записи таблицы страниц для местоположения страницы и для установки "действительного" бита
  5. Отклонение исключения ошибки страницы

Шаг 2 МОЖЕТ включать замену страницы, но чаще использует страницу, которая в данный момент не используется. Типичные виртуальные машины поддерживают списки таких страниц.

действительно ли он заменяет полную страницу или байты внутри страницы (то есть рамки страницы), потому что я видел этот пример в следующем видео, и я запутался в том, что он сказал в начале видео, что у нас есть кадр размера 3 (не 3 кадра в памяти), и он начинает заменять страницы на странице размером 3, я имею в виду заменить 3 страницы, у вас должно быть 3 соответствующих страницы в физической памяти, верно ?!

На шаге 3 в моем списке выше целевые страницы всегда полностью перезаписываются. Я, честно говоря, не знаю, что означало бы "заменить страницы размером 3 страницы".

Теперь, одна из оптимизаций, о которых я говорил выше, заключается в том, что если вам нужна виртуальная страница n сейчас, вам, вероятно, понадобится виртуальная страница n+1 довольно скоро и т.д. Поэтому пейджеры обычно выполняют некоторую часть чтения, ожидая больше, чем страница в время. Да, если вы хотите читать на трех страницах, вы будете иметь дело с тремя страницами в физической памяти. Они не обязательно должны быть смежными, ни в рабочем списке, ни с точки зрения физических адресов ОЗУ. Фактически, одно из огромных преимуществ виртуальной памяти заключается в том, что забота о смежной свободной виртуальной памяти практически исчезает.

Рекомендации:

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