AlgStr / Библиотека / ЛЕКЦИИ / Служба памяти
.DOCСлужба управления памятью.
Свойство ОП (оперативная память):Вся динамически распределенная память может рассматриваться как сплошной массив, состоящий из байтов и назы-ваемый кучей (НЕАР-областью). К элементам которого можно добраться по адресу (прямой доступ ) НЕАР- область размещается в памяти компьютера следом за памятью, которое занимает тело программы.
Квант памяти: несколько ячеек , распо-
ложенных рядом на которые
накладывается определенная
Дос интерпритация.
640К
Несколько квантов памяти образуют совокуп-
ность квантов
Куча
Программа
DOS 1
0
Куча
Б4 Б4
Б3
Б2 Б2
Б1
Кроме понятия кванта памяти при работе с памятью используются такие понятия как :
Звено памяти -несколько подряд расположенных квантов, которые интерпре-
тируются по-разному.
Вектор памяти- несколько расположенных подряд квантов и интерпрети-
руются одинаково.
При распределении памяти возникает проблема: отыскивание очередной порции памяти, подходящей для размещения в ней звена (кванта памяти) называется Управлением памятью
Внутри программы формируется последовательность заявок выделение памяти. По каждой заявке служба памяти должна выделить память.
Служба памяти должна уметь:
-
Инициализировать себя.
-
Выделить память.
-
Освободить память.
-
Закончить работу.
Для различных структур данных необходима память различных размеров. Память распределяется и освобождается блоками.
Блок- участок памяти ,в котором существует служебные поля, которые
используются службой памяти.
блок
В зависимости от того, какого блок размера различают:
-
блоки фиксированной длины;
-
блоки переменной длины;
Компрессия- очень опасная операция. Заключается в том, что на освободившиеся области накладываются занятые области и все изменения записываются в файл.
Блоки переменной длины:
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;