Виртуальная память

В первых ЭВМ программирование велось с использованием физических адресов оперативной памяти. Каждая задача программировалась с использованием одних и тех же адресов, то есть на машине в каждый период времени могла выполняться лишь одна задача (фактически первые ЭВМ были машинами “на одну персону”, имея в виду программиста или оператора, работавшего на машине). Размер задачи (объем ее программ и данных) во многих случаях практически сразу стал существенно превосходить размер оперативной памяти машины. Пришлось программировать отдельные части (блоки, модули) задачи на одни и те же адреса памяти и вызывать их в программе на эти адреса оперативной памяти из внешней памяти (на магнитных барабанах, магнитных лентах).

Такие действия, называемые “перекрытием программных модулей” (и модулей данных) в памяти или “попеременной загрузкой” модулей (overlay) вызывали большие затруднения при программировании.

Шагом вперед в организации оперативной памяти стало введение аппаратуры, обеспечивающей использование информации задачи на любом месте оперативной памяти. Использовался “регистр базы”, на который помещался начальный адрес размещения задачи в оперативной памяти, и регистр длины (размера) информации задачи. Это позволило программировать задачи на одни и те же адреса, называвшиеся “относительными”, “логическими”, “математическими” и, наконец, “виртуальными” адресами, а размещать (с помощью операционной системы) информацию задачи на любом месте оперативной памяти. Тем самым обеспечивалась возможность помещения в память одновременно информации многих задач и выполнения этих задач в многозадачном (многопрограммном) режиме. Эффект использования такого режима достигается за счет более полной загрузки процессора. Когда временно (например, из-за выполнения обмена данными между оперативной и внешней памятью) не может выполняться одна задача, тут же начинает выполняться другая задача. Поскольку информация задачи занимает непрерывный диапазон адресов, использование регистра длины информации задачи позволяет не допускать обращения в задаче в невыделенную для нее область памяти и тем самым обеспечивать защиту памяти других задач.

К сожалению, такая организация памяти (задаче предоставлялся ограниченный “линейный” участок оперативной памяти) не избавляла программиста от заботы об организации упоминавшегося перекрытия программных модулей в его таким образом организованной “виртуальной” памяти. Рассмотренный способ организации использования оперативной памяти (с достаточно простой аппаратной “поддержкой”) имеет обобщающее название – память “односегментного отображения”.

Освободить программиста от организации перекрытия программных модулей в памяти и обеспечить при программировании понимание возможности использования виртуальной памяти задачи практически любого объема позволило введение поддержанной аппаратно структурированной виртуальной памяти задачи.

Видами такой организации памяти стали: “сегментная”, “страничная” и “сегментно-страничная” организации.