Помощь в написании студенческих работ
Антистрессовый сервис

Динамическое выделение оперативной памяти

КурсоваяПомощь в написанииУзнать стоимостьмоей работы

Процесс перезаписи таблицы существует для того чтобы при завершении процесса и удалении его из таблицы, его место занималось еще не выполненным процессом. Осуществляется это путем проверки таблицы на наличие пустых ячеек и, при их наличии, записи в них процессов, располагающихся ниже. После, идет удаление процессов. При переменной stat принадлежащей «процессу», равной «end» процесс считается… Читать ещё >

Динамическое выделение оперативной памяти (реферат, курсовая, диплом, контрольная)

МИНИСТЕРСТВО ТРАНСПОРТА РОСИЙСКОЙ ФЕДЕРАЦИИ ФЕДЕРАЛЬНОЕ АГЕНТСТВО ЖЕЛЕЗНОДОРОЖНОГО ТРАНСПОРТА ГОСУДАРСТВЕННОЕОБРАЗОВАТЕЛЬНОЕ УЧЕРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГООБРАЗОВАНИЯ СИБИРСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ПУТЕЙ СООБЩЕНИЯ Кафедра «Информационные технологии транспорта»

КУРСОВОЙ ПРОЕКТ По дисциплине «Операционные системы»

Тема: «Динамическое выделение в оперативной памяти»

Содержание Введение

1. Динамическое выделение в оперативной памяти

2. Имитатор динамического выделения оперативной памяти

3. Логическая структура программы

4. Тестирование Заключение

Введение

Программа-имитатор динамического распределения оперативной памяти выполнена на ОС Windows 7 в интегрированной среде разработки приложений с графическим интерфейсом Delphi XE3. В работе применены знания, полученные при изучении курса «Операционные системы, среды и оболочки». Данная программа наглядно показывает процесс динамического распределения процессов в оперативной памяти, фрагментацию оперативной памяти, работу программного объекта «сжатие» и пошаговое представление распределения процессов с заданными параметрами.

1. Динамическое выделение в оперативной памяти В этом случае память машины не делится заранее на разделы. Сначала вся память свободна. Каждой вновь поступающей задаче выделяется необходимая ей память. Если достаточный объем памяти отсутствует, то задача не принимается на выполнение и стоит в очереди. После завершения задачи память освобождается, и на это место может быть загружена другая задача. Таким образом, в произвольный момент времени оперативная память представляет собой случайную последовательность занятых и свободных участков (разделов) произвольного размера. На рисунке 1 показано состояние памяти в различные моменты времени при использовании динамического распределения. Так в момент t0 в памяти находится только ОС, а к моменту t1 память разделена между 5 задачами, причем задача П4, завершаясь, покидает память. На освободившееся после задачи П4 место загружается задача П6, поступившая в момент t3.

Рис. 1. Распределение памяти динамическими разделами

Задачами операционной системы при реализации данного метода управления памятью является:

· ведение таблиц свободных и занятых областей, в которых указываются начальные адреса и размеры участков памяти,

· при поступлении новой задачи — анализ запроса, просмотр таблицы свободных областей и выбор раздела, размер которого достаточен для размещения поступившей задачи,

· загрузка задачи в выделенный ей раздел и корректировка таблиц свободных и занятых областей,

· после завершения задачи корректировка таблиц свободных и занятых областей.

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

Выбор раздела для вновь поступившей задачи может осуществляться по разным правилам, таким, например, как «первый попавшийся раздел достаточного размера», или «раздел, имеющий наименьший достаточный размер», или «раздел, имеющий наибольший достаточный размер». Все эти правила имеют свои преимущества и недостатки.

По сравнению с методом распределения памяти фиксированными разделами данный метод обладает гораздо большей гибкостью, но ему присущ очень серьезный недостаток — фрагментация памяти. Фрагментация — это наличие большого числа несмежных участков свободной памяти очень маленького размера (фрагментов). Настолько маленького, что ни одна из вновь поступающих программ не может поместиться ни в одном из участков, хотя суммарный объем фрагментов может составить значительную величину, намного превышающую требуемый объем памяти.

Одним из методов борьбы с фрагментацией является перемещение всех занятых участков в сторону старших либо в сторону младших адресов, так, чтобы вся свободная память образовывала единую свободную область (рисунок 2). В дополнение к функциям, которые выполняет ОС при распределении памяти переменными разделами, в данном случае она должна еще время от времени копировать содержимое разделов из одного места памяти в другое, корректируя таблицы свободных и занятых областей. Эта процедура называется «сжатием». Сжатие может выполняться либо при каждом завершении задачи, либо только тогда, когда для вновь поступившей задачи нет свободного раздела достаточного размера. В первом случае требуется меньше вычислительной работы при корректировке таблиц, а во втором — реже выполняется процедура сжатия. Так как программы перемещаются по оперативной памяти в ходе своего выполнения, то преобразование адресов из виртуальной формы в физическую должно выполняться динамическим способом.

Рис. 2. Распределение памяти перемещаемыми разделами

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

2. Имитатор динамического выделения оперативной памяти

1. Назначение программы.

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

2. Принцип работы программы Используется динамический массив. При нажатии кнопки старт создается запись. В записи присутствуют переменные Imya — имя процесса, PIDномер процесса, Razmer — размер процесса, prohoj — переменная, показывающая количество перемещений процесса при дефрагментации, cr, sin, zel — случайные переменные для задания цвета процесса. Затем в визуальном представлении рисуется прямоугольник с цветом процесса, и подписью, размерность которого рассчитывается относительно всего свободного пространства, размерность которого взята за 100%. Далее идет процесс дефрагментации. Если новый процесс, добавляемый после предыдущего, не помещается в остаток оперативной памяти, то происходит дефрагментация, при которой все процессы заново ставятся в начало один за другим. Далее идет запись нового процесса в таблицу процессов. Далее идет цикл, который содержит перезапись таблицы процессов, удаление процессов и таймер процессов.

Процесс перезаписи таблицы существует для того чтобы при завершении процесса и удалении его из таблицы, его место занималось еще не выполненным процессом. Осуществляется это путем проверки таблицы на наличие пустых ячеек и, при их наличии, записи в них процессов, располагающихся ниже. После, идет удаление процессов. При переменной stat принадлежащей «процессу», равной «end» процесс считается завершенным и удаляется из таблицы процессов, путем заполнения ячеек ««. Если же переменная stat не равна end и процесс выполняется ИЛИ возможность выполнения процесса меньше, чем случайное число, генерируемое перед циклом, то переменная vremya убавляется на 1© и соответствующая строка в таблице переписывается. Дальше идет удаление процесса из визуальной области. Удаление происходит при тех же условиях, что и удаление из таблицы. Прямоугольник удаленного процесса закрашивается таким же прямоугольником белого цвета. Далее идет расчет параметров для statusbar который показывает количество свободной и занятой оперативной памяти.

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

3. Логическая структура программы Автоматическая загрузка и исполнение процессов

begin

razmerpam:=strtoint (edit1.Text);

butt:=0;

StringGrid1.cells[1,0]: ='Название процесса';

StringGrid1.cells[2,0]: ='Pазмер процесса (Байт)';

StringGrid1.cells[3,0]: ='Bремя выполнения';

StringGrid1.cells[4,0]: ='Адрес в ОП';

repeat

delay (1000);

rand2:=random (2);

if rand2=0 then begin

setlength (process, i+1);

str:=inttostr (i);

process[i]. prohoj:=proh;

process[i].Imya:='Process #'+str;

process[i]. PID:=i;

j:=random (26)+4 ;

process[i]. Razmer:=inttostr (j);

process[i].PID:=i;

str2:=inttostr (random (9)+2);

process[i].Vremya:=str2;

process[i].ran:=random (99)+1;

poz:=poz + prcent;

prcent:=(j/(razmerpam/100))*5;

process[i]. Adress:=inttostr (round (poz));

opraz:=opraz+strtoint (process[i].Razmer);

prcent1:=Round (prcent) ;

poz1:=round (poz);

process[i]. cr:=random (255)+1;

process[i].sin:=random (255)+1;

process[i].zel:=random (255)+1;

with ListBox1. Canvas do

begin

Pen.Color:=RGB (0,0,0);

brush.Color:=RGB (process[i]. cr, process[i]. sin, process[i]. zel);

Rectangle (Bounds (0, poz1, 400, prcent1));

TextOut (10, poz1+1, process[i]. Imya);

end;

if opraz>razmerpam then begin

Proh:=proh+1;

with ListBox1. Canvas do

begin

Pen.Color:=clwhite;

brush.Color:=clwhite;

Rectangle (Bounds (0, 0, 400,500));

end;

opraz:=0;

poz:=0;

prcent:=0;

for h := 1 to i do begin

if process[h]. stat <> 'end' then begin

process[h]. prohoj:=proh;

opraz:=opraz+strtoint (process[h].Razmer);

if opraz

poz:=poz + prcent;

prcent:=(strtoint (process[h]. Razmer)/(razmerpam/100))*5;

process[h].Adress:=inttostr (round (poz));

razm:= ((strtoint (process[h]. Razmer))/(razmerpam/100))*5 ;

razm1:=round (razm);

with ListBox1. Canvas do

begin

Pen.Color:=clblack;

brush.Color:=RGB (process[h]. cr, process[h]. sin, process[h]. zel);

Rectangle (Bounds (0, strtoint (process[h]. adress), 400, razm1));

TextOut (10, strtoint (process[h]. adress)+1, process[h]. Imya);

end;

StringGrid1.cells[4,process[h].pid]:=process[h].adress ;

end else begin MessageDlg ('Память переполнена.', mtWarning, [mbOk], 0);

button2.Click;

end;

StringGrid1.RowCount:= stringgrid1. rowcount+1;

StringGrid1.cells[1,i]: =process[i].imya;

StringGrid1.cells[2,i]:=process[i].razmer;

StringGrid1.cells[3,i]:=process[i].vremya;

StringGrid1.cells[4,i]:=process[i].adress;

end

else i:=i-1;

rand:=random (79)+1;

for h:= 1 to i do

begin

for j1 := 1 to i do begin

if (StringGrid1.cells[1,process[h]. pid-1]='') and (process[h]. stat<>'end') then begin

if process[h]. pid>1 then begin

StringGrid1.cells[1,process[h]. pid-1]:= process[h]. Imya ;

StringGrid1.cells[2,process[h]. pid-1]:=process[h].Razmer ;

StringGrid1.cells[3,process[h]. pid-1]:=process[h].vremya ;

StringGrid1.cells[4,process[h]. pid-1]:=process[h].adress ;

StringGrid1.cells[1,process[h]. pid]:='';

StringGrid1.cells[2,process[h].pid]:='';

StringGrid1.cells[3,process[h].pid]:='';

StringGrid1.cells[4,process[h].pid]:='';

process[h].pid:= process[h]. pid-1;

end;

if (process[h]. stat<>'end') and (strtoint (process[h]. vremya)=0) then begin

process[h]. stat:='end';

StringGrid1.cells[1,process[h].pid]:='';

StringGrid1.cells[2,process[h].pid]:='';

StringGrid1.cells[3,process[h].pid]:='';

StringGrid1.cells[4,process[h].pid]:='';

end ;

if (process[h]. stat<>'end') and (strtoint (process[h]. vremya)>0) then begin

if (process[h]. ran > rand) or (process[h]. ran1=1) {or (kran>0)} then begin

process[h]. Vremya:=inttostr (strtoint (process[h].vremya)-1);

process[h].ran1:=1;

StringGrid1.cells[3,process[h].pid]:=process[h].vremya

end;

if (process[h]. stat = 'end') and (process[h]. prohoj = proh) then

begin

razm:= (strtoint (process[h]. Razmer)/(razmerpam/100))*5 ;

razm1:=round (razm);

with ListBox1. Canvas do

begin

Pen.Color:=clwhite;

brush.Color:=clwhite;

Rectangle (Bounds (0, strtoint (process[h]. adress), 400, razm1));

end;

sump:=0;

for j3 := 1 to i do begin

if process[j3]. stat <> 'end' then

sump:=strtoint (process[j3]. Razmer)+sump;

statusbar1.Panels.items[0].text:='Свободно памяти: '+inttostr (strtoint (edit1.Text)-sump)+' Mb';

statusbar1.Panels.items[1]. text:='Занято памяти: '+inttostr (sump)+' Mb'

end;

i:=i+1;

until butt=1 ;

end;

программа оперативный память интерфейс Ручное добавление процессов

StringGrid1.cells[1,0]: ='Название процесса';

StringGrid1.cells[2,0]: ='Pазмер процесса (Байт)';

StringGrid1.cells[3,0]: ='Bремя выполнения';

StringGrid1.cells[4,0]: ='Адрес в ОП';

randomize;

razmerpam:=strtoint (edit1.Text);

setlength (process, i+1);

str:=inttostr (i);

process[i]. prohoj:=proh;

process[i].Imya:='Process #'+str;

process[i]. PID:=i;

j:=random (19)+4 ;

if edit3. text ''then process[i]. Razmer:=edit3.text else process[i]. Razmer:=inttostr (j);

process[i].PID:=i;

str2:=inttostr (random (9)+2);

if edit2. text then process[i]. Vremya:=edit2.text else process[i]. Vremya:=str2;

if edit4. text then process[i]. ran:=strtoint (edit4.text) else process[i]. ran:=random (99)+1;

poz:=poz + prcent;

prcent:=(strtoint (process[i]. Razmer)/(razmerpam/100))*5;

process[i].Adress:=inttostr (round (poz));

opraz:=opraz+strtoint (process[i].Razmer);

prcent1:=Round (prcent) ;

poz1:=round (poz);

process[i]. cr:=random (255)+1;

process[i].sin:=random (255)+1;

process[i].zel:=random (255)+1;

with ListBox1. Canvas do

begin

Pen.Color:=RGB (0,0,0);

brush.Color:=RGB (process[i]. cr, process[i]. sin, process[i]. zel);

Rectangle (Bounds (0, poz1, 400, prcent1));

TextOut (10, poz1+1, process[i]. Imya);

end;

if opraz>razmerpam then begin

Proh:=proh+1;

with ListBox1. Canvas do

begin

Pen.Color:=clwhite;

brush.Color:=clwhite;

Rectangle (Bounds (0, 0, 400,500));

end;

opraz:=0;

poz:=0;

prcent:=0;

for h := 1 to i do begin

if process[h]. stat <> 'end' then begin

process[h]. prohoj:=proh;

opraz:=opraz+strtoint (process[h].Razmer);

if opraz

poz:=poz + prcent;

prcent:=(strtoint (process[h]. Razmer)/(razmerpam/100))*5;

process[h].Adress:=inttostr (round (poz));

razm:= ((strtoint (process[h]. Razmer))/(razmerpam/100))*5 ;

razm1:=round (razm);

with ListBox1. Canvas do

begin

Pen.Color:=clblack;

brush.Color:=RGB (process[h]. cr, process[h]. sin, process[h]. zel);

Rectangle (Bounds (0, strtoint (process[h]. adress), 400, razm1));

end;

end else begin MessageDlg ('Память переполнена.', mtWarning, [mbOk], 0);

button2.Click;

end;

StringGrid1.RowCount:= stringgrid1. rowcount+1;

StringGrid1.cells[1,i]: =process[i].imya;

StringGrid1.cells[2,i]:=process[i].razmer;

StringGrid1.cells[3,i]:=process[i].vremya;

StringGrid1.cells[4,i]:=process[i].adress;

sump:=0;

for j3 := 1 to i do begin

if process[j3]. stat <> 'end' then

sump:=strtoint (process[j3]. Razmer)+sump;

statusbar1.Panels.items[0].text:='Свободно памяти: '+inttostr (strtoint (edit1.Text)-sump)+' Mb';

statusbar1.Panels.items[1]. text:='Занято памяти: '+inttostr (sump)+' Mb'

end; i:=i+1;

Ручное выполнение процесса

StringGrid1.cells[1,0]: ='Название процесса';

StringGrid1.cells[2,0]: ='Pазмер процесса (Байт)';

StringGrid1.cells[3,0]: ='Bремя выполнения';

StringGrid1.cells[4,0]: ='Адрес в ОП';

rand:=100;

for I1 :=1 to i do

if process[i1]. PID =StringGrid1.Row then h:=i1;

for i1:=1 to strtoint (process[h]. Vremya)+1 do begin

if (process[h]. stat<>'end') and (strtoint (process[h]. vremya)=0) then begin

process[h]. stat:='end';

StringGrid1.cells[1,process[h].pid]:='';

StringGrid1.cells[2,process[h].pid]:='';

StringGrid1.cells[3,process[h].pid]:='';

StringGrid1.cells[4,process[h].pid]:='';

end ;

for j2:=1 to i do

if process[j2]. ran1 <> 0 then kran:= kran+1;

if (process[h]. stat<>'end') and (strtoint (process[h]. vremya)>0) then begin

if (process[h]. ran < rand) or (process[h]. ran1=1) then begin

process[h]. Vremya:=inttostr (strtoint (process[h].vremya)-1);

process[h].ran1:=1;

StringGrid1.cells[3,process[h].pid]:=process[h].vremya

end;

if (process[h]. stat = 'end') and (process[h]. prohoj = proh) then

begin

razm:= (strtoint (process[h]. Razmer)/(razmerpam/100))*5 ;

razm1:=round (razm);

with ListBox1. Canvas do

begin

Pen.Color:=clwhite;

brush.Color:=clwhite;

Rectangle (Bounds (0, strtoint (process[h]. adress), 400, razm1));

end;

delay (100);

end;

sump:=0;

for j3 := 1 to i-1 do begin

if process[j3]. stat <> 'end' then

sump:=strtoint (process[j3]. Razmer)+sump;

statusbar1.Panels.items[0].text:='Свободнопамяти: '+inttostr (strtoint (edit1.Text)-sump)+' Mb';

statusbar1.Panels.items[1]. text:='Занято памяти: '+inttostr (sump)+' Mb'

end;

Очистка

with ListBox1. Canvas do

begin

Pen.Color:=clwhite;

brush.Color:=clwhite;

Rectangle (Bounds (0, 0, 400,500));

end;

opraz:=0;

proh:=1;

poz:=0;

prcent:=0;

butt:=0;

i:=1;

randomize; with StringGrid1 do begin

for vv:=0 to ColCount-1 do

Cols[vv]. Clear;

end;

setlength (process, 0);

4. Тестирование

1. Штатный режим работы программы.

Рисунок 3

2) Внештатный режим работы программы. Возникает при переполнении оперативной памяти и отсутствии места для поступающих процессов.

Рисунок 4

Заключение

Динамическое распределение оперативной памяти хотя и являлось прогрессивной находкой для своего времени, но полностью не удовлетворяло пользователей ПК, как из-за фрагментации памяти, вызывающей потерю пространства оперативной памяти, так и из-за невозможности использования дискового пространства. Пусть данная система и не применяется в настоящее время, она достойно заняла свое место в истории развития вычислительной техники и дала множество идей разработчикам следующих систем работы с памятью.

Показать весь текст
Заполнить форму текущей работой