Помощь - Поиск - Пользователи - Календарь
Полная версия: Модель распределения памятью
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Ellsa
Всем привет.
Помогите пожалуйста с алгоритмом решения задачи.
Тема:реализация модели управления памятью с помощью битовых массивов.
Суть:память делится на блоки определенной величины.Подается процесс (навенрно я буду вводить с клавиатуры его размер,чтоб потом узнать сколько блоков он занимает).Если необходимое количество блоков есть-я занимаю их этим процессом и рассматриваю следующий процесс.

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

у меня несколько вопросов.

1. как узнать что процесс закончился?
Я думала,может вводить его длительность с клавиатуры?Но я не умею работать с реальным,так сказать,временем.Может мне выразить время в каких-либо еденицах,например t и поставить счетчик,чтоб когда достигло такого-то значения-обнулился бит?
Но ведь счетчик надо ставить на какое-то условие.....
и вообще,не уверена,что этот метод разумен.

2. как сделать такчтоб пока один процесс выполняется-взяться за другой?

Спасибо за хотя бы какие-нибудь предложения. Извините,если я что не так сделала.
andriano
То, о чем ты пишешь, называется менеджером памяти.
Обычно он реализуется либо средствами ОС, либо самой выполняющейся программы (когда есть основания полагать, что ОС будет распределять память неоптимально.
1. Об этом должен сообщить сам процесс.
2. Память выдается (и возвращается) по запросу: отдал кусок памяти, вернул управление процессу, ждешь следующего запроса.
Ellsa
возможно,но мне нужно написать программу,и я не понимаю,как процесс мне сообщит что он закончен и какого запроса мне ждать,если я вроде бы сама ввожу все эти запросы....
andriano
А я не понимаю, что именно должна делать твоя программа.
Во-первых, менеджер памяти предполагается как часть программы, использующей память, или как часть ОС?
Собственно, и в первом и во втором случае процесс должен сообщить менеждеру памяти о том, что ему требуется какое-то количество памяти. Иначе он, естественно, никакой памяти не получит. Точно таким же способом он должен сообщить менеджеру, что память ему больше не нужна.
Случай, когда проесс по каким-то причинам вернул не всю запрошенную память (что свидетельствует о том, что процесс написан неправильно), будет обрабатываться по-разному в случае со встроеммым либо внешним менеджером памяти. При встроенном он заканчивает работу вместе с программой и аккуратное возвращение всей запрошенной памяти ОСи перекладывается уже на ее собственый менеджер памяти.
Если же мы рассматриваем менедлер памяти ОС, то его работа начинается раньше, чем будет запущен процесс - ведь для него сначала надо выделить память, и только потом в эту память можно будет загрузить коды запускаемого процесса. В процессе работы процесса менеджер памяти ведет учет памяти, запрошенной КАЖДЫМ процессом, а о его завершении ОС, естественно, сообщает менеджеру, после чего менеджер освобождает ВСЮ память, отведенную процессу - как запрошенную им в процессе работы, так и выделенную для загрузки кодов.
Ellsa
помогите пожалуйста найти ошибку...
скорее всего,я запуталась в циклах.

 program kyrs;
type mas=array [1..100] of integer;
masbool=array [1..100] of boolean;
massiv=array [1..100] of real;
var
i,j,l,m,s,n,time,o:integer;
block:integer;
p:massiv;
works:masbool;
b,fl:boolean;
r,t,x,k,nomer:mas;
begin
writeln('vvedite koli4estvo processov');
readln(n);
writeln('vvedite kolichestvo bitov pamyati');
readln(m);
writeln ('vvedite razmeri processov');
for i:=1 to n do
readln(r[i]);
writeln ('vvedite dlitelnosti');
for i:=1 to n do readln(t[i]);
writeln('vvedite razmer bloka');
readln(o);
begin
j:=1;fl:=false; b:=true;time:=0;
for i:=1 to n do
works[i]:=false;
for i:=1 to n do k[i]:=round(r[i]/o);

while (b) do
for i:=1 to n do
begin
if (works[i]=true) then begin
t[i]:=t[i]-1;writeln ('process',i,'rabotaet');
while ((j<=n) and (not fl)) do

begin
s:=j+1;
if (p[j]=0) then

begin
if (k[i]=1) then

begin
fl:=true;
works[i]:=true;
nomer[i]:=1;
end;

block:=1;
while ((s<=n) and (p[j]=0) and (not fl)) do

begin
block:=block+1;
if (block=k[i]) then

begin
fl:=true;
works[i]:=true;
nomer[i]:=s;
end;

j:=j+1;

end;

end;

if not (fl) then i:=j;
end;

if not (fl) then writeln('no') else

begin
nomer[i]:=s;
for l:=i to (k[i]-1) do

begin
p[l]:=1;
writeln(l,' ');
end;

readln;
end;
b:=false;
if t[i]<=0 then

begin
works[i]:=false;
writeln('process',i,'zaverwilsya');
j:=nomer[i];
for j:=nomer[i]-k[i] to nomer[i] do p[j]:=0;
end;

end;


end;
end;
end.









Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.