Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

AlgStr / Библиотека / ЛЕКЦИИ / Служба памяти

.DOC
Скачиваний:
32
Добавлен:
23.03.2015
Размер:
67.58 Кб
Скачать

Служба управления памятью.

Свойство ОП (оперативная память):Вся динамически распределенная память может рассматриваться как сплошной массив, состоящий из байтов и назы-ваемый кучей (НЕАР-областью). К элементам которого можно добраться по адресу (прямой доступ ) НЕАР- область размещается в памяти компьютера следом за памятью, которое занимает тело программы.

Квант памяти: несколько ячеек , распо-

ложенных рядом на которые

накладывается определенная

Дос интерпритация.

640К

Несколько квантов памяти образуют совокуп-

ность квантов

Куча

Программа

DOS 1

0

Куча

Б4 Б4

Б3

Б2 Б2

Б1

Кроме понятия кванта памяти при работе с памятью используются такие понятия как :

Звено памяти -несколько подряд расположенных квантов, которые интерпре-

тируются по-разному.

Вектор памяти- несколько расположенных подряд квантов и интерпрети-

руются одинаково.

При распределении памяти возникает проблема: отыскивание очередной порции памяти, подходящей для размещения в ней звена (кванта памяти) называется Управлением памятью

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

Служба памяти должна уметь:

  1. Инициализировать себя.

  2. Выделить память.

  3. Освободить память.

  4. Закончить работу.

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

Блок- участок памяти ,в котором существует служебные поля, которые

используются службой памяти.

блок

В зависимости от того, какого блок размера различают:

  • блоки фиксированной длины;

  • блоки переменной длины;

Компрессия- очень опасная операция. Заключается в том, что на освободившиеся области накладываются занятые области и все изменения записываются в файл.

Блоки переменной длины:

l1 L-l1

L L-l1 L-l1-l2 lk Free -список свободных блоков

Free

При выделении памяти возникает проблема - как выделять? (Блок подходящего размера)

Для выбора блока существует 3 стратегии:

  • Первый подходящий (first) удовлетворяющий размеры;

  • Наиболее подходящий (max) наименьший из удовлетворяющих:

  • Наименее подходящий (min)

Подготовка памяти для повторного использования:

а) простое восстановление памяти.

б) сложное восстановление памяти.

а) При простом восстановлении два блока так и

остаются,а при сложном они объединяются

б)

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

-алгоритм близнецов;

-алгоритм фибоначчиевых близнецов.

Рассмотрим алгоритм близнецов.

К maxsize

1,2,4,8,16,...2, ...2 -объекты памяти.

Обозначим через А адрес блока.

к

Близнецами порядка к называются 2 блока размером 2 , расположенных рядом с

к

адресами 2 кратности.

Следствие : Адреса близнецов порядка К имеют специальную структуру:

А=старшие разряды х 00...0

к+1 разряд младшие к разрядов

адрес близ-

нецов.

Х: 0-младший близнец

1-старший близнец

Формула, по которой определяется адрес близнеца:

к

близнец к а=2 ХОR а

Служба памяти по методу близнецов

H1

голова списков

Body rep

sizebody

head

0

1 size

. =2

.

size

Рассмотрим программную реализацию этой системы.

Unit TWIN;

interfase

const

Null=32768;

maxsize=15;

sizekvant=2;

type

index=0..32768;

HeapBodyType=array[0 ..maxsize]of index;

BodyPtr=^HeapBodyType;

Heap=object

size:byte;

Head:array[0..maxsize]of index;

Body:Body Ptr

End;

Procedure Init(sizeheap:byte);

function Get_Mem(k:byte):Index;

procedure Free_Mem(a:index,k:byte);

procedure Done;

Implementation;

Procedure Init(sizeheap:byte);

var

bodysize:word;

i:byte;

begin

bodysize=(1shl sizeheap)*sizekvant;

Get_Mem(Body,Bodysize);

size:=sizeheap;

For i:=0 to size-1 do

heap[i]:=null;

heap^[size]:=0;

body^[0]:=null;

end;

Function Bliznuk(a:index;k:byte):index;

begin

Bliznuk:=(1 shl k)XOR a;

end;

Function Heap.Get_Mem;

var

z:index;

вegin

if Head[k]<>Null then

begin

z:=Head[k];

Head[k]:=Body^[z];

Get_Mem:=z;

end

else if k=size then

Get_mem:=Null

else

begin

z:=Get_Mem(k+1);

if z;Null then Get_Mem:=Null

else

Body^[z]:=Head[k];

Head[k]:=z;

Get_Mem:=Bliznuk(z,k);

end;

end;

end;

Procedure Free_Mem;

var

p:index;

G: index;

Q: index;

begin

if k=size then

begin

Head[size]:=0;

Body[0]:=Null;

end

else

begin

p:=Head[k];

g:=Bliznuk{a,k);

Body^[a]:=p;

Head[k]:=a;

q:=a;

while(p<>Null)and(p<>g) do

begin

q:=p;

p:=Body^[p];

end;

if p<=g then

begin

Body^[a]:=Body^[p];

Head[k]:=Body[a];

if a>g then

Free_Mem(g,k+1)

else

Free_Mem(a,k+1);

end;

end;

end;

end;