IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> Динамическое распределение памяти, c++
Rocket
сообщение 10.10.2008 21:56
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Доброго времени суток, Уважаемые Форумчане! Вот столкнулся с заданием, которое необходимо реализовать, как можно быстрей... Значит, нужно написать программу, моделирующую динамическое распределение памяти в операционной системе. В качестве модели оперативной памяти программа должна использовать байтовый массив размера не менее 256 байт. Использование других глобальных переменных в программе запрещено. В программе в обязательном порядке должны присутствовать следующие функции:
а) Выделить участок заданного размера. В случае успеха вывести начальный адрес выделенного участка. Если участка подходящего для выделения не найдено, необходимо вывести диагностическое сообщение о нехватке памяти.
б) Освободить ранее выделенный участок. В качестве параметра функция должна принимать начальный адрес освобождаемого участка. Ранее выделенный участок может быть освобожден только целиком (освобождение части участка не допускается).
в) Получение информации о свободных/занятых участках в «оперативной памяти» (количество участков каждого типа, начальные адреса, размеры, общее количество занятой и свободной памяти).
А хранить всю информацию, я должен ввиде списков блоков; алгоритм выделения- двоичное разбиение.
Помогите, пожалуйста с реализацией! Возможно у кого-ибудь найдутся соответветсвующие наработки....
Что вообще из себя представляет двоичное разбиение?...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Rocket
сообщение 18.10.2008 10:56
Сообщение #2


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Всё-таки пишу по-своему, то есть теми средствами языка, которые мне известны rolleyes.gif ...

#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;

char MyMem[32];

int stTwo(int size)
{
int k=0;
while (pow(2,k)<size)
k+=1;
return k;
}

void Raz(int st2,int sb)
{
int i=0,k;
while(MyMem[i+sb] != st2 )
{
k=(int)pow(2,MyMem[i+sb])/2;
MyMem[i+sb]=((int)MyMem[i+sb])-1;
MyMem[i+k+sb] = ((int)MyMem[i+sb]);
i = 0;
cout<<"!!!"<<endl;
}
}

void Sliyanie(int st2, int sb)
{ int i=0,k;
while(MyMem[i] != st2)
{
k=(int)pow(2,MyMem[i+sb]);
MyMem[i+sb]=((int)MyMem[i+sb])+1;
MyMem[i+k+sb] = 0;
i = 0;
cout<<"???"<<endl;
}





}

int AltChe(int sb, int st2)
{
int i=0,j,k,l,X;
for(i=0; i<32; i+=sb)
{
X=MyMem[i]-st2;
cout<<X<<endl;
getch();
if (X>0)
{
j=(int)(2,(int)MyMem[i]);
for (i=0; i<32; i+=j)
if (MyMem[i+1]!= 1)
{
Raz(st2,i);
cout<<"razbienie"<<endl;
}
else cout<<"Error!"<<endl;

}

if (X=0)
{
k=(int)(2,(int)MyMem[i]);
for (i=0; i<32; i+=k)
if (MyMem[i+1]!= 1)
{
MyMem[i+1]= 1;
cout<<"Blok is load!"<<endl;
}
else cout<<"BOLT"<<endl;

}

if (X<0)
{
l=(int)(2,(int)MyMem[i]);
for (i=0; i<32; i+=l)
if (MyMem[i+1]!= 1)
{ Sliyanie(st2,i);
cout<<"sliyanie"<<endl;
}
else cout<<"Error!"<<endl;
}
}
return 0;
}

/*int Checked(int sb,int st2)
{ int i=0,j;


for(i=0; i<32; i+=sb)
{
if (MyMem[i+1]!=1)
{if (MyMem[i]==st2)
{ MyMem[i+1]=1;
cout<<"FUCK"<<endl;
j=0;
break;
}
else
{j=(int)MyMem[i];
cout<<j<<endl;
cout<<"|||"<<endl;
}}


else j=1;

}
return j;
}

void Y(int sb,int st2)
{ int ch=Checked(sb,st2);
if(ch==1)
{ cout<<"razbiebie"<<endl;
Raz(st2,0);
}

}
*/
int main()
{
int size,st2,st,i=0,sb;
char ch;
st=stTwo(32);
MyMem[0]=st;

for(int i=0;i<32;i++)
{
cout<<(int)MyMem[i]<<" ";
}
cout<<endl;
while (ch != '4')

{ cout<<endl;
cout<<"********MENU*************"<<endl;
cout<<"1. To allocate memory "<<endl;
cout<<"2. To delete memory "<<endl;
cout<<"3. To display memory "<<endl;
cout<<"4. To Exit "<<endl;
cout<<"*************************"<<endl;
cout<<endl;
cin>>ch;

switch(ch)
{
case '1':

cout<<endl;
cout<<"Enter size of blok!"<<endl;
cin>>size;
st2=stTwo(size);
sb=(int)pow(2,st2);
AltChe(sb,st2);
break;

case '2':



case '3':

for(int i=0;i<32;i++)
{
cout<<(int)MyMem[i]<<" ";
}
break;
default: break;

}


}
}



Взял массив 32 байта(мне показалось, что в процессе разработки программы с таким легче работать). Значит, в первом байте блока я храню степень двойки, во втором байте 1 или 0. Реализовал функции разбиения и слияния блоков, то есть в принципе двоичное разбиение как таковое есть, но как организовать единый алгоритм? Это я пытаюсь делать в функции "AltChe"...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Rocket   Динамическое распределение памяти   10.10.2008 21:56
Rocket   Программистушки, ну подскажите пожалуйста с реализ...   12.10.2008 22:46
klem4   Ну вот узнаешь что-нибудь насчет двоичного разделе...   13.10.2008 6:39
volvo   Насколько я понимаю, под двоичным разбиением подра...   13.10.2008 22:02
Rocket   Насколько я понимаю, под двоичным разбиением подр...   13.10.2008 22:24
volvo   Binary buddy heap ?   13.10.2008 22:48
Rocket   Binary buddy heap ? Видать здесь о чём-то двоично...   13.10.2008 23:08
volvo   Перевод текста по ссылке: А теперь - от меня... ...   14.10.2008 1:39
Rocket   Дааа...алгоритм жесть...вообще в растеренности как...   15.10.2008 0:03
volvo   Ну, ты же понимаешь, что если написать программу в...   15.10.2008 18:58
Rocket   В общем, ждем начала твоей реализации... Вот он...   16.10.2008 21:18
volvo   Ууу... Нет-нет-нет... Это без меня... На чистом С ...   16.10.2008 21:41
Rocket   Ууу... Нет-нет-нет... Это без меня... На чистом С...   16.10.2008 22:07
volvo   Устраивает меня или нет - это к делу не относится....   18.10.2008 0:38
Rocket   (фрагмент программы компилируется, выполняется, па...   18.10.2008 3:08
Rocket   Всё-таки пишу по-своему, то есть теми средствами я...   18.10.2008 10:56
Rocket   Вобщем написал я это двоичное разбиение, с успехом...   4.11.2008 19:05
Rocket   Неужели никому не известно такое страшное слово ка...   8.11.2008 13:18
Lapp   Неужели никому не известно такое страшное слово ка...   10.11.2008 4:52
Гость   Память подкачки, выделяеться заранее. Используетьс...   10.11.2008 4:07
Гость   Извиняюсь перед Уважаемым Админисраором за оффтоп....   10.11.2008 4:36
Rocket   Значит данная программа реализует алгоритм двоично...   13.11.2008 20:00
volvo   А как добиться такого разбиения? Вот сразу после з...   13.11.2008 22:05
Rocket   А как добиться такого разбиения? Что надо делать...   13.11.2008 22:55
volvo   Так вот по алгоритму ты должен после того, как осв...   14.11.2008 0:30
Rocket   Но объединять мы можем только блоки равного размер...   14.11.2008 1:12
volvo   Ну смотри: вот процесс работы с твоей программой. ...   14.11.2008 1:50
Rocket   Так а я в принципе и не пытаюсь начинать объединят...   14.11.2008 10:42
volvo   Хочешь, расскажу, в чем разница между выделением б...   14.11.2008 11:58


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 18:48
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"