Достоинства виртуальной памяти весьма привлекательны, но насколько практична данная схема? Одно время на эту тему шли оживленные дебаты, однако опыт ее использования многими операционными системами продемонстрировал бесспорную жизнеспособность этой схемы — виртуальная память стала неотъемлемым компонентом большинства современных операционных систем.
Чтобы понять, в чем заключается ключевое свойство виртуальной памяти и почему она вызвала такие бурные дебаты, обратимся вновь к задачам операционной системы, связанным с виртуальной памятью. Рассмотрим большой процесс, состоящий из длинного кода и ряда массивов данных. В каждый небольшой промежуток времени выполнение программы сосредотачивается в малой части кода (например, в одной из подпрограмм), и обращается эта часть кода, как правило, только к одному или двум массивам данных. В таком случае загружать в память все данные и код, в то время как перед приостановкой и выгрузкой процессаиз памяти будут использоваться только небольшие их части, — расточительство. Память будет использоваться гораздо эффективнее, если загружать в нее только необходимые части программы. Соответственно, в этом случае при обращении к данным или коду, которых в настоящий момент нет в основной памяти, происходит прерывание выполнения программы, которое говорит операционной системе о необходимости загрузки в основную память затребованной части программы.
Таким образом, в основной памяти в каждый момент времени находится только некоторая, как правило, небольшая, часть данного процесса и, следовательно, в основной памяти может быть одновременно размещено большее количество процессов. К тому же при этом получается определенная экономия времени, так как неиспользуемые части процессов не приходится постоянно выгружать из памяти и загружать вновь. Однако операционная система должна очень разумно работать с такой схемой управления памятью. В установившемся состоянии практически вся основная память занята фрагментами процессов, чтобы процессор и операционная система могли работать с как можно большим количеством процессов одновременно. Следовательно, при загрузке в основную память некоторого блока другой блок должен быть выгружен оттуда. Если из памяти выгрузить блок, который тут же потребуется вновь, операционная система будет заниматься постоянным перемещением одних и тех же блоков в основную память и на диск. Большое количество таких перебросок приводит к ситуации, известной какснижение пропускной способности (thrashing): процессор в основном занимается не выполнением процессов, а выгрузкой и загрузкой в основную память. Задаче устранения этого нежелательного эффекта посвящен ряд исследовательских работ, выполнявшихся в 70-х годах, приведших к появлению различных сложных, но эффективных алгоритмов. По сути, они сводятся к попыткам определить на основании последних событий в системе, какие блоки памяти потребуются в ближайшем будущем.
Эти методы базируются на принципе локализации(см. главу 1, "Обзор компьютерных систем"), который гласит, что обращения к коду и данным в процессе имеют тенденцию к кластеризации.
Таким образом, наличие принципа локализации позволяет надеяться на эффективность работы виртуальной памяти. Для этого требуется, чтобы, во-первых, имелась аппаратная поддержка страничной организации и/или сегментации, а во-вторых, операционная система должна включать программное обеспечение для управления перемещением страниц и/или сегментов между вторичной и основной памятью, В этом разделе мы рассмотрим аппаратный аспект проблемы и познакомимся с необходимыми управляющими структурами, создаваемыми и поддерживаемыми операционной системой, но используемыми аппаратным обеспечением; вопросы же работы операционной системы будут рассмотрены в следующем разделе.