Динамическое выделение оперативной памяти
Применение программы-имитатора динамического распределения оперативной памяти, выполнение ее на ОС Windows 7 в интегрированной среде. Разработка приложений с графическим интерфейсом Delphi XE3. Автоматическая загрузка, исполнение и добавление процессов.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 12.01.2015 |
Размер файла | 284,7 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
МИНИСТЕРСТВО ТРАНСПОРТА РОСИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ЖЕЛЕЗНОДОРОЖНОГО ТРАНСПОРТА
ГОСУДАРСТВЕННОЕОБРАЗОВАТЕЛЬНОЕ УЧЕРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГООБРАЗОВАНИЯ
СИБИРСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ПУТЕЙ СООБЩЕНИЯ
Кафедра «Информационные технологии транспорта»
КУРСОВОЙ ПРОЕКТ
По дисциплине «Операционные системы»
Тема: «Динамическое выделение в оперативной памяти»
Содержание
Введение
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);
rand_2:=random(2);
if rand_2=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;
str_2:=inttostr(random(9)+2);
process[i].Vremya:=str_2;
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<razmerpam then begin
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].ran_1=1) {or (kran>0)} then begin
process[h].Vremya:=inttostr(strtoint(process[h].vremya)-1);
process[h].ran_1:=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;
str_2:=inttostr(random(9)+2);
if edit2.text then process[i].Vremya:=edit2.text else process[i].Vremya:=str_2;
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<razmerpam then begin
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].ran_1 <> 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].ran_1=1) then begin
process[h].Vremya:=inttostr(strtoint(process[h].vremya)-1);
process[h].ran_1:=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
Заключение
Динамическое распределение оперативной памяти хотя и являлось прогрессивной находкой для своего времени, но полностью не удовлетворяло пользователей ПК, как из-за фрагментации памяти, вызывающей потерю пространства оперативной памяти, так и из-за невозможности использования дискового пространства. Пусть данная система и не применяется в настоящее время, она достойно заняла свое место в истории развития вычислительной техники и дала множество идей разработчикам следующих систем работы с памятью.
Размещено на Allbest.ru
Подобные документы
Стратегии размещения информации в памяти. Алгоритмы распределения адресного пространства оперативной памяти. Описание характеристик модели и ее поведения, классов и элементов. Выгрузка и загрузка блоков из вторичной памяти. Страничная организация памяти.
курсовая работа [708,6 K], добавлен 31.05.2013Улучшение параметров модулей памяти. Функционирование и взаимодействие операционной системы с оперативной памятью. Анализ основных типов, параметров оперативной памяти. Программная часть с обработкой выполнения команд и размещением в оперативной памяти.
курсовая работа [99,5 K], добавлен 02.12.2009Классификация компьютерной памяти. Использование оперативной, статической и динамической оперативной памяти. Принцип работы DDR SDRAM. Форматирование магнитных дисков. Основная проблема синхронизации. Теория вычислительных процессов. Адресация памяти.
курсовая работа [1,5 M], добавлен 28.05.2016Обобщение основных видов и назначения оперативной памяти компьютера. Энергозависимая и энергонезависимая память. SRAM и DRAM. Триггеры, динамическое ОЗУ и его модификации. Кэш-память. Постоянное запоминающее устройство. Флэш-память. Виды внешней памяти.
курсовая работа [1,7 M], добавлен 17.06.2013История появления и развития оперативной памяти. Общая характеристика наиболее популярных современных видов оперативной памяти - SRAM и DRAM. Память с изменением фазового состояния (PRAM). Тиристорная память с произвольным доступом, ее специфика.
курсовая работа [548,9 K], добавлен 21.11.2014Распределение оперативной памяти фиксированными, динамическими и перемещаемыми разделами. Распределение с использованием внешней памяти. Принципы рaботы матричного принтера. Проектирование символов и разработка программы, реализующей их вывод на печать.
курсовая работа [241,3 K], добавлен 01.07.2011Простейшая схема взаимодействия оперативной памяти с ЦП. Устройство и принципы функционирования оперативной памяти. Эволюция динамической памяти. Модуль памяти EDO-DRAM BEDO (Burst EDO) - пакетная EDO RAM. Модуль памяти SDRAM, DDR SDRAM, SDRAM II.
реферат [16,1 K], добавлен 13.12.2009Основы работы с многооконным графическим пользовательским интерфейсом операционной системы Windows95/NT. Основы работы с прикладными программами Windows и DOS. Разработка простого приложения для Windows при помощи средства разработки приложений DELPHI.
контрольная работа [281,0 K], добавлен 15.01.2009Понятие и функциональные особенности запоминающих устройств компьютера, их классификация и типы, сравнительная характеристика: ROM, DRAM и SRAM. Оценка преимуществ и недостатков каждого типа оперативной памяти, направления и пути их использования.
презентация [118,1 K], добавлен 20.11.2013Изучение свойств оперативной памяти, являющейся функциональной частью цифровой вычислительной машины, предназначенной для записи, хранения и выдачи информации, представленных в цифровом виде. Характеристика объема разных видов оперативной памяти.
реферат [24,0 K], добавлен 30.12.2010