Виртуальная память и каналы
Виртуальная память представляет собой непрерывную для пользователя, с ней работающего, область памяти, которая может быть вложена в другую виртуальную память. Виртуальная память состоит из сегментов, связанных между собой в двунаправленную цепь. Каждому сегменту известно его положение относительно нижнего логического уровня. Работа с виртуальной памятью происходит через канал, выделенный для нее. Канал – это набор характеристик описывающих: где расположена виртуальная память, и в каком ее месте мы находимся. Количество каналов ограничено, поэтому канал выделяется той виртуальной памяти, которая нужна в данный момент. Система имеет набор каналов, которые могут иметь ссылку на виртуальную память, либо быть незанятыми. Первые 5 каналов – это базовые каналы, отображенные на физические носители (оперативная память, файл). Вторые 5 каналов – каналы виртуальной памяти, хранящие каталоги объектов. Остальные каналы предназначены для работы с объектами. Все каналы основываются на каких-либо других каналах, образуя, в общем случае, 5 независимых деревьев. Корень – один из базовых каналов (0..4). Одна и та же виртуальная память не может быть загружена в два канала. При переходе от верхнего канала к нижнему выполняется трансляция адреса.

Рис 3: Связь каналов с хранилищами объектов
Таблица 2: Параметры канала
Параметр канала | Семантика | ||
NCHAN | Номер текущего канала | ||
LOWCH | Нижний канал; в него вложен этот канал | ||
CHGCTX | Признак изменения данных заголовка фрагмента | ||
TEKADR | Текущая позиция для чтения/записи | ||
SYNCADDR | Адрес начала заголовка текущего сегмента в нижнем канале | ||
TEKADR0 | Позиция, соответствующая началу данных фрагмента | ||
PREDADDR | Адрес заголовка предыдущего фрагмента (–1, если его нет) | ||
NEXTADDR | Адрес заголовка следующего фрагмента (–1, если его нет) | ||
BUSYLEN | Занятая длина | ||
LEN | Выделенная длина |
Таблица 3: Операции доступа к данным виртуальной памяти
Операция | Семантика (все операции работают с текущим каналом) | ||
IBS | Чтение байта из канала | ||
OBS | Запись байта в канал | ||
GOTO | Переход по адресу в канале | ||
@GOTO | Переход по смещению в канале | ||
UPSIZE | Выделить доп. память в конце канала и встать на ее начало | ||
DEFRAG | Сделать виртуальную память непрерывной на уровне нижнего канала (т.е. однофрагментной) |
Начало виртуальной памяти соответствует нулевому значению TEKADR. Доступ осуществляется через операции позиционирования (GOTO и @GOTO), чтения байта (IBS) и записи байта (OBS). Остальные функции, реализуются через них (например, чтение длинного слова). К памяти может быть применена функция UPSIZE с аргументом, содержащим необходимое количество байт для выделения. Память может гарантированно выделяться до заполнения всей выделенной длины. При исчерпании выделенной длины, делается запрос к нижестоящему уровню о выделении дополнительной памяти. Если такой запрос применяется к каналу ниже 5-го, соответствующего дисковому файлу, файл увеличивается в размере, если его выделенная длина исчерпана. Если увеличение размера файла невозможно из-за нехватки дискового пространства, то, в случае невозможности выделения памяти за счет упаковки, возбуждается ситуация NOMEMORY. При попытке доступа за пределы определенной виртуальной памяти (например, чтение после расположения данных), возникает ситуация OUTDATA.