Отчет по дисциплине Операционные системы

Автор: Пользователь скрыл имя, 15 Июня 2012 в 14:25, лабораторная работа

Описание работы

Продумайте систему сегментного хранения информации. Исходные данные:
Программа на Cи (Си++), под Windows, Консольное приложение.
Вся доступная память представлена массивом 10 КБайт. Все операции с выделением, доступом и освобождением памяти проводятся только с памятью внутри этого массива.

Работа содержит 1 файл

оси.doc

— 81.00 Кб (Скачать)

                  }

}

void FreeMemory(int MemoryHandle)

{

      struct Block *tmp;

      tmp=(struct Block*)&Ar[sizeof(I)];

      while(!(tmp->Handle==MemoryHandle)) tmp=tmp->next;

      for(int i=tmp->Adres; i<tmp->Adres+tmp->Size; i++)

      {

            Ar[tmp->Adres]='\0';

      }

            tmp->Bit=0;

}

int WriteMemory(int MemoryHandle, int Offset, int Size, void *Data)

{

      char *m=(char*)Data;

      struct Block *tmp;

      tmp=(struct Block*)&Ar[sizeof(I)];

      while(!(tmp->Handle==MemoryHandle)) tmp=tmp->next;

      if(Offset>=tmp->Size) return 1;

      if((Offset+Size)>=tmp->Size) return 1;

      if(Offset<0) return 1;

      if(Size<=0) return 1;

      for(int i=0; i<Size;i++)

      {

            Ar[tmp->Adres+Offset]=*m;

            Offset++;

            *m++;

      }

      tmp->Bit=1;

      return 0;

}

int ReadMemory(int MemoryHandle, int Offset, int Size, void *Data)

{

      char *m=(char*)Data;

      struct Block *tmp;

      tmp=(struct Block*)&Ar[sizeof(I)];

      while(!(tmp->Handle==MemoryHandle)) tmp=tmp->next;

      if(Offset>=tmp->Size) return 1;

      if((Offset+Size)>=tmp->Size) return 1;

      if(Offset<0) return 1;

      if(Size<=0) return 1;

      for(int i=0; i<Size; i++)

      {

            *m=Ar[tmp->Adres+Offset];

            Offset++;

            *m++;

      }

      Data=(void*)m;

}

void DumpMemory(void)

{

      int m;

      struct Block *tmp,*tmp1;

      tmp=(struct Block*)&Ar[sizeof(I)];

      tmp1=tmp;

      m=tmp1->Adres;

      tmp1=tmp1->next;

      while(tmp1)

      {

            if(m>tmp1->Adres)

                  m=tmp1->Adres;

            tmp1=tmp1->next;

      }

      while(tmp)

      {

            if (tmp->Handle)

            {

            printf("H:%d B:%d S:%d F:%d %c,%c,%c,%c,%c,%c,%c,%c,%c,%c\n",tmp->Handle,tmp->Adres,tmp->Size,tmp->Bit, Ar[tmp->Adres], Ar[tmp->Adres+1],Ar[tmp->Adres+2],Ar[tmp->Adres+3],Ar[tmp->Adres+4],Ar[tmp->Adres+5],Ar[tmp->Adres+6],Ar[tmp->Adres+7],Ar[tmp->Adres+8],Ar[tmp->Adres+9]);

            } 
 

            tmp=tmp->next;

      }

      int k=*(int*)&Ar[0];

      printf("Free memory %d from %d to %d\n\n",k,m-k,m);

} 

void SortMemory(void)

{

      int m=0;

      int f=0;

      struct Block *t;

      t=(struct Block*)&Ar[sizeof(I)];

      while(t)

      {

            f++;

            t=t->next;

      }

      int z=*(int*)&Ar[0];

      int k=10000;

      struct Block *b,*b1;

      b=(struct Block*)&Ar[sizeof(I)];

      b1=(struct Block*)&Ar[sizeof(I)];

      while(b)

      {

            if(k>b->Adres)

            {

                  k=b->Adres;

            }

            b=b->next;

      }

      while(b1->next)

      {

            if (!b1->Bit)

            {

                  for(int j=1;j<=b1->Adres-k;j++) Ar[b1->Adres+b1->Size-j]=Ar[b1->Adres-j];

                  struct Block *tmp;

                  tmp=b1->next;

                  while(tmp)

                  {

                        if(b1->Adres>tmp->Adres)

                        tmp->Adres+=b1->Size;

                        tmp=tmp->next;

                  }

                  z+=b1->Size; 

                  for(int i=0; i<=(sizeof(I)+f*sizeof(Block)-sizeof(I)-(m+1)*sizeof(Block)); i++)

                  {

                        Ar[sizeof(I)+m*sizeof(Block)+i]=NULL;

                        Ar[sizeof(I)+m*sizeof(Block)+i]=Ar[sizeof(I)+(m+1)*sizeof(Block)+i];

                  }

                  for(int i=0; i<sizeof(Block);i++)

                        Ar[sizeof(I)+sizeof(Block)*(f-1)+i]=NULL; 

                  struct Block *Bl,*Bl1;

                  Bl=(struct Block*)&Ar[sizeof(I)];

                  for(int i=1;i<f-1;i++)

                  {

                        Bl1=(struct Block*)&Ar[sizeof(I)+i*sizeof(Block)];

                        Bl->next=Bl1;

                        Bl=Bl->next;

                  }

                  Bl->next=NULL;

                  m++;

                  f--;

                  }

            else b1=b1->next;

      }

      *(int*)&Ar[0]=z+m*sizeof(Block);

} 
 


Информация о работе Отчет по дисциплине Операционные системы