Необходимо написать программу, демонстрирующую следующий способ распределения ОП:
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);
}
Во-первых, почему здесь? Это ж не Паскаль все-таки... А во-вторых:
http://forum.pascal.net.ru/index.php?s=&showtopic=22896&view=findpost&p=126559
(тут если не именно то, что тебе нужно, то очень похожее)
for (i=0; i<256; i++) bitkarta [i]=0;
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++;
}
}
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++;
}
}
1. Да, я эту ошибку заметил.
2. Я неправильно написал, нам нужно не максимальное значение, а значение в двоичном виде 1000000000000000 (т.е. 15 нолей и 1 в старшем разряде). В десятичном виде это как раз число 32768.
Я нашел ошибку, из-за которой всегда писалось все блоки заняты. В этой строке " int i,i1=0,numblock=0,x; " я еще раз описывал глобальную переменную. Осталась одна проблема: как накладывать маску, чтобы это подходило для 32-разрядной системы?
Исправил еще несколько ошибок, но не выделяется память для четвертого процесса. Кто-нибудь знает из-за чего это? Причем если изменить количество байтов, которое необходимо выделить, то какие-то блоки сами по себе оказываются свободными.
Вот почти окончательный вариант программы:
#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);
}
Ну, до окончательного ему еще далеко... Надо отлаживать...
Необходимо внести как минимум 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;
}