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

> Внимание!

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

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Менеджер оперативной памяти на СИ, Помогите немного исправить программу
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 146
Пол: Мужской

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


Необходимо написать программу, демонстрирующую следующий способ распределения ОП:
1. Стратегия размещения - первый подходящий
2. Структура данных-блоки фиксированного размера.

Написал программу, но при таком способе накладывания маски, как мне сказали, требуется 128-разрядная или даже более разрядная система. Подскажите плиз каким образом можно накладывать маску, чтобы такого не было. Программа сейчас работает неправильно, так как всегда пишет что все блоки свободны. Если вдруг знаете в чем тут дело, то тоже напишите плиз.

Программу компилировал в компиляторе GCC для Windows.

#include <stdio.h>
#include <stdlib.h>
int i1,nachalo,bit1,konec;
unsigned int bitkarta[128];
void proverka()
{
int i,numblock,x,j=0;
unsigned int bit;
for (i=0; i<128; i++)
for (bit=1;bit<=32768;bit=bit<<1)
{
x=bitkarta[i]&bit;
numblock++;
if (x!=0)
{
printf("Block nomer %d zanyat!\n",numblock);
j++;
}
}
if (j==0) printf("Vse blocki svobodni!");
if (j==2048) printf("Vse blocki zanyati!");
}
void poisk(int size)
{
int i,i1=0,numblock=0,x;
unsigned int bit;
int kolblock=(size/2048)+1;
for (i=0;i<128;i++)
for(i=i1;i<128;i++)
for (bit=1;bit<=32768;bit=bit<<1)
{
numblock++;
x=bitkarta[i]&bit;
if (x==0)
{
nachalo=numblock;
i1=i;
bit1=bit;
break;
}

if (x==0) break;
}
bit1=bit1<<1;
for (i=i1;i<128;i++)
for(bit=bit1;bit<=32768;bit=bit<<1)
{
numblock++;
x=bitkarta[i]&bit;
if (x!=0)
{
konec=numblock;
i1=i;
bit1=bit;
break;
}
if (x!=0) break;
}
}
int pamyat(int size)
{
int bit=1,i,spec;
int kolblock=(size/2048)+1;
printf ("Kolichestvo blokov=%d\n",kolblock);
spec=nachalo;
i=nachalo/16;
bit=bit<<(nachalo-(16*i)-1);
while (kolblock!=0)
{
bitkarta[i]=bitkarta[i]+bit;
bit=bit<<1;
if (bit>32768)
{
bit=1;
i++;
}
kolblock--;
}
return spec;
}
void free(int spec,int size)
{
int i,kolblock;
unsigned int bit;
int numblock=(size/2048)+1;
i=spec/8;
bit=bit<<(spec-16*i-1);
while (kolblock!=0)
{
bitkarta[i]=bitkarta[i]-bit;
bit=bit<<1;
if(bit>32768)
{
bit=1;
i++;
}
kolblock--;
}
}
main()
{
int i,mem1=25000,mem2=37000,mem3=50000,mem4=10000,p1,p2,p3,p4;
int *memory=(int*)malloc(2097152);
for (i=0; i<256; i++) bitkarta [i]=0;
proverka();
poisk(mem1);
p1=pamyat(mem1);
proverka();
getchar();
poisk(mem2);
p1=pamyat(mem2);
proverka();
getchar();
poisk(mem3);
p1=pamyat(mem3);
proverka();
getchar();
poisk(mem4);
p1=pamyat(mem4);
proverka();
getchar();
free(p1,mem1);
free(p3,mem3);
free(p2,mem2);
free(p4,mem4);
}

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Во-первых, почему здесь? Это ж не Паскаль все-таки... А во-вторых:

Динамическое распределение памяти
(тут если не именно то, что тебе нужно, то очень похожее)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 146
Пол: Мужской

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


Цитата(volvo @ 19.10.2008 19:05) *

Во-первых, почему здесь? Это ж не Паскаль все-таки... А во-вторых:

Динамическое распределение памяти
(тут если не именно то, что тебе нужно, то очень похожее)


Извиняюсь, ошибся, не там написал. Спасибо за ссылку, прочитал, но автор там для хранения информации об одном блоке использует целый байт, а это не правильно. Поясните чем определяется разрядность? Максимальным значением, которое может принимать элемент массива или все таки количеством элементов в массиве?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата
Программа сейчас работает неправильно, так как всегда пишет что все блоки свободны.
Не мудрено... Смотри:

1) main()
Цитата
    for (i=0; i<256; i++) bitkarta [i]=0;
Откуда 256? Ты ж вылетел за пределы массива... Что, профайлер тебе об этом не сообщает? Меняй на 128...

2) во всех функциях:
Цитата
    for (i=0; i<128; i++)
for (bit=1;bit<=32768;bit=bit<<1)
{
x=bitkarta[i]&bit;
numblock++;
if (x!=0)
{
printf("Block nomer %d zanyat!\n",numblock);
j++;
}
}
С чего ты решил, что максимальное значение маски для unsigned int = 32768? Я бы переписал это как минимум вот так:
    int jbit;
for (i=0; i<128; i++)
for (jbit = 0; jbit < 8*sizeof(unsigned int); jbit++) {
bit = 1 << jbit;
x = bitkarta[i] & bit;
numblock++;
if (x != 0) {
printf("Block nomer %d zanyat!\n",numblock);
j++;
}
}


3) Опять же, что-то там у тебя еще не в порядке (кроме того, что я написал), надо разбираться, запусти дебаггер и пройди пошагово... Скорее всего опять же работа с маской в free()...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 146
Пол: Мужской

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


1. Да, я эту ошибку заметил.
2. Я неправильно написал, нам нужно не максимальное значение, а значение в двоичном виде 1000000000000000 (т.е. 15 нолей и 1 в старшем разряде). В десятичном виде это как раз число 32768.

Я нашел ошибку, из-за которой всегда писалось все блоки заняты. В этой строке " int i,i1=0,numblock=0,x; " я еще раз описывал глобальную переменную. Осталась одна проблема: как накладывать маску, чтобы это подходило для 32-разрядной системы?

Сообщение отредактировано: Neon6868 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Пионер
**

Группа: Пользователи
Сообщений: 146
Пол: Мужской

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


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

Вот почти окончательный вариант программы:
#include <stdio.h>
#include <stdlib.h>
int i1=0,nachalo,bit1,konec;
unsigned int bitkarta[32];
void proverka()
{
int i,numblock=0,x,j=0;
unsigned int bit;
for (i=0; i<32; i++)
for (bit=1;bit<=32768;bit=bit<<1)
{
x=bitkarta[i]&bit;
numblock++;
if (x!=0)
{
printf("Block nomer %d zanyat!\n",numblock);
j++;
}
}
if (j==0) printf("Vse blocki svobodni!");
if (j==512) printf("Vse blocki zanyati!");
}
void poisk(int size)
{
int i=0,numblock=0,x;
unsigned int bit;
int kolblock=(size/1024)+1;
for(i=i1;i<32;i++)
{
for (bit=1;bit<=32768;bit=bit<<1)
{
numblock++;
x=bitkarta[i]&bit;
if (x==0)
{
nachalo=numblock;
i1=i;
bit1=bit;
break;
}
}
if (x==0) break;
}
bit1=bit1<<1;
for (i=i1;i<32;i++)
{
for(bit=bit1;bit<=32768;bit=bit<<1)
{
numblock++;
x=bitkarta[i]&bit;
if (x!=0)
{
konec=numblock;
i1=i;
bit1=bit;
break;
}
if (x!=0) break;
}
}
}
int pamyat(int size)
{
int bit=1,i,spec;
int kolblock=(size/1024)+1;
printf ("Kolichestvo blokov=%d\n",kolblock);
spec=nachalo;
i=nachalo/16;
bit=bit<<(nachalo-(16*i)-1);
while (kolblock!=0)
{
bitkarta[i]=bitkarta[i]+bit;
bit=bit<<1;
if (bit>32768)
{
bit=1;
i++;
}
kolblock--;
}
return spec;
}
void free(int spec,int size)
{
int i,kolblock;
unsigned int bit;
int numblock=(size/1024)+1;
i=spec/16;
bit=bit<<(spec-16*i-1);
while (kolblock!=0)
{
bitkarta[i]=bitkarta[i]-bit;
bit=bit<<1;
if(bit>32768)
{
bit=1;
i++;
}
kolblock--;
}
}
main()
{
int i,mem1=5000,mem2=15350,mem3=11000,mem4=2000,p1,p2,p3,p4;
int *memory=(int*)malloc(524288);
for (i=0; i<32; i++) bitkarta [i]=0;
proverka();
poisk(mem1);
p1=pamyat(mem1);
proverka();
getchar();
poisk(mem2);
p2=pamyat(mem2);
proverka();
getchar();
poisk(mem3);
p3=pamyat(mem3);
proverka();
getchar();
poisk(mem4);
p4=pamyat(mem4);
proverka();
getchar();
free(p1,mem1);
free(p3,mem3);
free(p2,mem2);
free(p4,mem4);
}


Сообщение отредактировано: Neon6868 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Ну, до окончательного ему еще далеко... Надо отлаживать...

Необходимо внести как минимум 3 изменения:
void poisk(int size)
{
int i=0, numblock=0, x;
unsigned int bit;
int kolblock=(size/1024)+1;

for(i=i1;i<32;i++) {
for (bit=1;bit<=32768;bit=bit<<1) {
numblock++;
x=bitkarta[i]&bit;
if (x==0) {
nachalo=(16*i1) + numblock; // <--- Изменение #1
i1=i;
bit1=bit;
break;
}
}
if (x==0) break;
}
bit1=bit1<<1;
for (i=i1;i<32;i++) {
for(bit=bit1;bit<=32768;bit=bit<<1) {
numblock++;
x=bitkarta[i]&bit;
if (x!=0) {
konec=numblock;
i1=i;
bit1=bit;
break;
}
if (x!=0) break;
}
}
}

int pamyat(int size)
{
int bit=1,i,spec;
int kolblock=(size/1024)+1;
printf ("Kolichestvo blokov=%d\n",kolblock);
spec=nachalo;
i=(nachalo-1)/16; // <--- Изменение #2
bit=bit<<((nachalo-1)%16); // <--- Изменение #3
while (kolblock!=0) {
bitkarta[i]=bitkarta[i]+bit;
bit=bit<<1;
if (bit>32768) {
bit=1;
i++;
}
kolblock--;
}
return spec;
}

№1 - потому что иначе ты "теряешь" предыдущую заполненную ячейку bitkarta (обрати внимание, перед вызовом poisk(mem4) значение переменной nachalo = 31, а после работы poisk оно сбрасывается на 16... "Это ж-ж-ж неспроста..." (С) )

№2 и №3 - потому что до тех пор, пока у тебя не начали поступать значения, точно равные n*16, твой код создавал видимость правильной работы, но как только nachalo стало = 32, он работать-то и перестал... Посмотри, что у тебя было, и что получалось при nachalo = 32...
 К началу страницы 
+ Ответить 

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

 





- Текстовая версия 27.10.2020 10:44
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name