Пространство

Программист обращается к памяти с помощью некоторого набора логических имен.

Имена переменных и входных точек модулей составляют область имен.

Физическая памятьпредставляет собой множество ячеек, которые

пронумерованы, к каждой ячейке можно обратиться, указав ее порядковый номер (адрес).

Количество ячеек физической памяти ограничено и фиксировано.

Системное программное обеспечение должно связать каждое указанное

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

пространства имен на физическую память компьютера. Это происходит в два этапа;

- посредством системы программирования;

- посредством операционной системы (с помощью специальных программных

модулей управления памятью и использования соответствующих аппаратных

средств вычислительной системы).

Между этими этапами обращение к памяти имеет форму виртуальногоили

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

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

виртуальную память.

Виртуальное адресное пространство зависит от:

- архитектуры процессора;

- системы программирования.

Виртуальное адресное пространство не зависит от:

- объема реальной физической памяти, установленной в компьютере.

Адреса команд и переменных в готовой машинной программе, подготовленной к

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

В результате работы системы программирования полученные виртуальные адреса

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

физическим адресам производится на этапе загрузки программы в память перед ее

непосредственным выполнением.

Если система программирования генерирует абсолютную двоичную программу,

то виртуальные адреса точно соответствуют физическим. Часть программ любой ОС

должны быть абсолютными двоичными программами, размещаться по фиксированным

физическим адресам и обеспечивать размещение остальных программ на различных

физических адресах.

В простейших компьютерных системах используется тождественность

виртуального адресного пространства исходному пространству имен. Отображение

выполняется самой ОС, которая во время исполнения использует таблицу символьных

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

трансляции практически неразличимы.

В простейшем случае транслятор-компилятор генерирует относительные адреса,

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

разделов. Второе отображение осуществляется перемещающим загрузчиком. После

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

физическим адресам.

Термин виртуальная памятьфактически относится к системам, которые

сохраняют виртуальные адреса во время исполнения. Второе отображение

осуществляется в процессе выполнения задачи, поэтому адреса физических ячеек могут

изменяться.

Простое непрерывное распределение – это самая простая схема, согласно которой

вся память условно может быть разделена на три части:

- область, занимаемая операционной системой;

- область, в которой размещается исполняемая задача;

- незанятая ничем (свободная) область памяти.

Эта схема предполагает, что ОС не поддерживает мультипрограммирования,

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

Чтобы предоставить задачам максимальный объем памяти, ОС строится таким образом,

чтобы постоянно в памяти располагалась только самая нужная ее часть – ядро ОС,

остальные модули загружаются при необходимости.

Эта схема влечет два вида потерь:

- потери процессорного времени из-за простоя в связи с вводом/выводом;

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

полностью.

Если программа должна будет использовать логическое (и виртуальное) адресное

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

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

Этот метод предполагает, что вся программа может быть разбита на части – сегменты.

Каждая оверлейная программа имеет одну главную часть (main) и несколько сегментов

(segment), причем, в памяти одновременно могут находиться только главная часть и один

или несколько сегментов.

Для организации мультипрограммного режима необходимо обеспечить

одновременное расположение в оперативной памяти нескольких задач (целиком или

частично). Самая простая схема распределения памяти между несколькими задачами

предполагает, что память, незанятая ядром ОС, может быть разбита на несколько

непрерывных частей (зон, разделов). Разделы характеризуются:

- именем;

- типом;

- границами (начало раздела и его длина).

Разбиение памяти на несколько разделов может быть:

- фиксированным(статическим);

- динамическим(выделение нового раздела памяти происходит

непосредственно при появлении новой задачи).

Методы распределения памяти, при которых задаче уже не предоставляется

сплошная (непрерывная) область памяти, называются разрывными. Для реализации

этого метода нужно иметь соответствующую аппаратную поддержку – относительную

адресацию: если указать адрес начала текущего фрагмента программы u1080 и величину

смещения относительно этого начального адреса, то можно указать необходимую

переменную или команду. Виртуальный адрес можно представить состоящим из двух

полей:

- указатель на часть программы (с которой идет работы) для определения

местоположения этой части;

- относительный адрес нужной ячейки памяти (по отношению к найденному

адресу).

Программист может самостоятельно разбивать программу на фрагменты или

возложить эту задачу на систему программирования.

Для сегментного способа организации виртуальной памятипрограмму нужно

разбить на части и уже каждой части выделить физическую память. Каждый

программный модуль или их совокупность могут быть восприняты как отдельные

сегменты. Каждый сегмент размещается в оперативной памяти как самостоятельная

единица. Логически обращение к элементам программы производится как указание

имени сегмента и смещения относительно его начала. Физически имя (или порядковый

номер) сегмента соответствует некоторому адресу, с которого этот сегмент начинается

при его размещении в памяти, и смещение должно прибавляться к этому адресу.

Страничный способ организации виртуальной памяти– способ разрывного

размещения задач в памяти, при котором все фрагменты задачи имеют одинаковый

размер, кратный степени двойки (чтобы вместо операции сложения для получения

физического адреса можно было использовать операцию конкатенации). При таком

способе все фрагменты программы, на которые она разбивается (кроме последней части)

получаются одинаковыми. Одинаковыми должны быть и единицы памяти,

предоставляемые для размещения фрагментов программы. Эти одинаковые части

называются страницами:

- оперативная память разбивается на физические страницы;

- программа разбивается на виртуальные страницы.

Часть виртуальных страниц располагается в оперативной памяти, а часть – во

внешней (файл подкачки, страничный файл, swap-файл).