Память и отображения, виртуальное адресное пространство


Если не принимать во внимание программирование на машинном языке (эта технология практически не используется уже очень давно), то можно сказать, что программист обращается к памяти с помощью некоторого набора логических имен, которые чаще всего являются символьными, а не числовыми и для которо­го отсутствует отношение порядка. Другими словами, в общем случае множество переменных неупорядочено, хотя отдельные переменные и могут иметь частич­ную упорядоченность (например, элементы массива). Имена переменных и вход­ных точек программных модулей составляют пространство имен.

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

Системное программное обеспечение должно связать каждое указанное пользо­вателем имя с физической ячейкой памяти, то есть осуществить отображение пространства имён на физическую память компьютера. В общем случае это ото­бражение осуществляется в два этапа (рис.2.5): сначала системой программи­рования, а затем операционной системой (с помощью специальных программ­ных модулей управления памятью и использования соответствующих аппаратных средств вычислительной системы). Между этими этапами обращения к памяти имеют форму виртуального или логического адреса. При этом можно сказать, что множество всех допустимых значений виртуального адреса для некоторой программы определяет её виртуальное адресное пространство или виртуальную память. Виртуальное адресное пространство программы прежде всего зависит от архитектуры процессора и от системы программирования и практически не за­висит от объёма реальной физической памяти, установленной в компьютер. Мож­но ещё сказать, что адреса команд и переменных в готовой машинной программе, подго
 
 

товленной к выполнению системой программирования, как раз и являются виртуальными адресами.

 

Рис. 2.5. Память и отображения

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

Одним из частных случаев отображения пространства имен на физическую па­мять является тождественность виртуального адресного пространства физической памяти. При этом нет необходимости осуществлять второе отображение. В дан­ном случае говорят, что система программирования генерирует абсолютную дво­ичную программу; в этой программе все двоичные адреса таковы, что программа может исполняться только в том случае, если её виртуальные адреса будут точно соответствовать физическим. Часть программных модулей любой операционной системы обязательно должна быть абсолютными двоичными программами. Эти программы размещаются по фиксированным адресам и с их помощью уже мож­но впоследствии реализовывать размещение остальных программ, подготовлен­ных системой программирования таким образом, что они могут работать на раз­личных физических адресах (то есть на тех адресах, на которые их разместит операционная система).

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

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

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

Если рассматривать общую схему двухэтапного отображения адресов, то с пози­ции соотношения объёмов упомянутых адресных пространств можно отметить наличие следующих трех ситуаций:

¨ объём виртуального адресного пространства программы Vv меньше объёма физической памяти Vp;

¨ Vv = Vp;

¨ Vv > Vp.

Первая ситуация, при которой Vv < Vp, ныне практически не встречается, но тем не менее это реальное соотношение. Скажем, не так давно 16-разрядные мини-ЭВМ имели систему команд, в которых пользователи-программисты могли адресовать до 216=64K адресов (обычно в качестве адресуемой единицы выступала ячейка памяти размером с байт). А физически старшие модели этих мини-ЭВМ могли иметь объём оперативной памяти в несколько мегабайт. Обращение к памя­ти столь большого объёма осуществлялось с помощью специальных регистров, содержимое которых складывалось с адресом операнда (или команды), извле­каемым и/или определяемым из поля операнда (или из указателя команды). Со­ответствующие значения в эти специальные регистры, выступающие как базовое смещение в памяти, заносила операционная система. Для одной задачи в регистр заносилось одно значение, а для второй (третьей, четвертой и т. д.) задачи, раз­мещаемой одновременно с первой, но в другой области памяти, заносилось, соот­ветственно, другое значение. Вся физическая память, таким образом, разбива­лась на разделы объёмом по 64 Кбайт, и на каждый такой раздел осуществлялось отображение своего виртуального адресного пространства.

Ситуация, когда Vv = Vp встречается очень часто, особенно характерна она была для недорогих вычислительных комплексов. Для этого случая имеется большое количество методов распределения оперативной памяти.

Наконец, в наше время мы уже достигли того, что ситуация Vv > Vp встречается даже в ПК, то есть в самых распространенных и недорогих компьютерах. Теперь это самая распространенная ситуация и для неё имеется несколько методов рас­пределения памяти, отличающихся как сложностью, так и эффективностью.

 



Дата добавления: 2022-02-05; просмотров: 305;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.007 сек.