Существует множество способов, с помощью которых ОС может справиться со сценарием, описанным в вопросе, а именно, как эффективно справиться с нехваткой свободной оперативной памяти. В зависимости от архитектуры ЦП и целей ОС есть несколько способов решения этой проблемы.
Одним из решений является простое уничтожение процессов, когда они пытаются использовать malloc (или какой-либо другой подобный механизм), а свободных страниц нет. Это эффективно позволяет избежать проблемы, поставленной в исходном вопросе. На первый взгляд это кажется плохой идеей, но у нее есть преимущества, заключающиеся в упрощении кода ядра и потенциальном ускорении переключения контекста. На самом деле, в некоторых приложениях, если работающий код должен использовать пространство подкачки для размещения страниц, которые не могут поместиться в ОЗУ, с использованием энергонезависимого хранилища, приложение получит такой удар по производительности, что система все равно фактически выйдет из строя. С другой стороны, не все компьютеры даже имеют энергонезависимую память для использования в качестве пространства подкачки!
Как уже упоминалось, альтернативой является использование энергонезависимого хранилища для хранения страниц, которые не помещаются в ОЗУ. Фактические конкретные реализации могут варьироваться в зависимости от конкретных потребностей системы. Вот несколько возможных способов прямого ответа на то, как могут существовать отображения V1->P1 и V2->P1.
1 - Часто нет строгих требований к тому, чтобы ОС поддерживала сопоставление V1->P1 и V2->P1. Пока содержимое виртуального пространства остается неизменным, поддерживающий его физический адрес прозрачен для работающей программы. Если обе программы должны работать одновременно, ОС может остановить программу, работающую в V2, и переместить память P1 в новый регион, скажем, P2. Затем переназначьте V2 на P2 и возобновите выполнение программы в V2. Это предполагает наличие свободной оперативной памяти для отображения, конечно.
2 - ОС может просто не отображать полное виртуальное адресное пространство программы в физическое адресное пространство, поддерживаемое ОЗУ. Предположим, что не все адресное пространство V1 было напрямую отображено в физическую память. Когда программа в версии 1 сталкивается с неразмеченным разделом, ОС может перехватить вызванное этим исключение. Если доступной оперативной памяти мало, ОС может использовать пространство подкачки в энергонезависимой памяти. ОС может освободить часть ОЗУ, передав некоторые физические адреса региона, который в настоящее время не используется, для подкачки пространства в энергонезависимом хранилище (например, пространство P1). Затем ОС может загрузить запрошенную страницу в освободившуюся оперативную память, настроить сопоставление виртуального и физического, а затем вернуть выполнение программе в V1.
Преимущество такого подхода в том, что ОС может выделить больше памяти, чем имеет ОЗУ. Кроме того, во многих ситуациях программы часто обращаются к небольшой области памяти. В результате отсутствие всей страницы области виртуального адреса в ОЗУ может не привести к такому большому снижению производительности. Основным недостатком этого подхода является то, что его сложнее кодировать, он может замедлять переключение контекста, а доступ к энергонезависимому хранилищу чрезвычайно медленный по сравнению с оперативной памятью.
person
vxWizard
schedule
02.10.2017