Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции!!!.doc
Скачиваний:
10
Добавлен:
27.09.2019
Размер:
1.76 Mб
Скачать
  1. Работа с вырезками

[L1:u1, L2:u2] int A

«Паспорт» массива: хранятся границы и шаги (шаг2 – длина элемента, шаг1 – длина строки), адрес начала массива. При триммерной вырезкеи формируют новый паспорт в другом сегменте памяти. В статике лежит только адр. Массива (из-за того, что сегмент огранич 64 кб - ?)

Тогда адрес элемента A[i,j] вычисляется по формуле:

A[i,j] = A' + (i – L1)*шаг1 + (j – L2)*шаг2 =

= A' – L1*шаг1 – L2*шаг2 + i*шаг1 + j*шаг2

С0 = A' – L1*шаг1 – L2*шаг2 – можно вычислить заранее для ускорения работы

В "Самсоне" массивы представляются сегментами.

Длина паспорта – 16 байт.

Для одномерного массива с 2-х байтовыми элементами значения С0 в зависимости от L будут такими:

(С0 = A-L*шаг)

L=0 C0=16; L=1 C0=14; L=-1 C0=18

Если длина элемента 1, то умножать на шаг2 не надо. Если длина элемента 2, то можно сложить. Если длина элемента 4, то надо сдвинуть или два раза сложить.

индБ – байтовый, индЦ – двухбайтовый, индП – четырёхбайтовый.

инд1 , инд2, инд – для 1-, 2- и т.д. мерных массивов

Как избавиться от С0: договорились писать массивы от 0 или от 1, С0:=16 (если от 1, то останется дырка в два байта).

Если массив передаётся как параметр процедуре, то мы не знаем, с какими элементами мы работаем. Разделили массивы на «хорошие» – в которых умножать не надо, – и плохие. Для плохих генератор массива возвращает нулевое смещение, т.е. начало паспорта. Для хороших возвращает начало самого массива.

Для хороших массивов вырезка работает за три такта. //Вырезка – наиболее частая операция при умножении матриц, представленных в виде массивов (особенно одномерных).

Контроль за диапазонами индексов: включается или отключается на первом такте. Если включен, то все массивы считаются плохими.

Два режима работы 1) отладочный 2) режим счета

  1. Реализация виртуальной памяти

Впервые введена в языке Ада, ~ 1960 год.

Основная идея: создать иллюзию большой памяти.

Главная особенность: физические адреса нельзя запоминать (так как сегменты могут переместиться).

В таблице сегментов хранится либо адрес в памяти, либо ссылка на внешнюю память (различие, например, по младшему биту).

Физический адрес = адрес начала сегмента + смещение

Преобразование мат. адреса в физический ~ 10 тактов.

НО: обращение к памяти идёт неравномерно (есть небольшой кусок памяти, к которому происходит ~ 90% всех обращений) (Copyright Терехов 2004).

«Фокус» в "Самсоне":

Есть стек адресов – 16 записей по 24 бита.

ЧА – читает мат. адрес, преобразует в физический, записывает его на верхушку стека.

Условие: если на сегмент есть хотя бы одна ссылка из стека адресов, то этот сегмент откачке/перемещению не подлежит (проигрыш невелик).

Если сегментов не хватает, происходит "встряска": пробегаем по сегментам, находим тот, к которому было меньше всего обращений. Его вытесняем во внешнюю память (но с учётом условия)

ПА – по физическому адресу находит математический. Можно просто бежать по всем сегментам и искать, в какой попадает данный физический адрес (чтобы найти № сегмента). В "Самсоне": есть ещё один стек, параллельный стеку адресов (16 записей по 16 бит), в который записывается N сегмента. Тогда команда ПА по номеру сегмента в таблице сегментов находит адрес начала сегмента, вычитает его из физического адреса и получает смещение.