⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1.cpp

📁 操作系统实验(粗存储器管理)采用可变分区存储器管理方案的模拟系统
💻 CPP
字号:
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
#include<conio.h>
#define TOTAL 5000
#define SETADDRESS 2000
#define MIN 100
#define MAX 10
typedef struct freearea
{int address;
int size;
struct freearea *next;
struct freearea *back;
}*freeptr;
typedef struct mat
{char name;
int address;
int length;
struct mat *next;
struct mat *back;
}*jobptr;
char string[10];
long totalfree;
char jobnumber;
freeptr freep;
jobptr jobp;
init()
{freep=(freeptr)malloc(sizeof(struct freearea));
freep->size=TOTAL;
freep->address=SETADDRESS;
freep->next=NULL;
freep->back=NULL;
totalfree=TOTAL;
jobp=NULL;
return(0);
}
fengpei(int jl,char jn)
{freeptr fp;
jobptr jp,jp1,jp2;
jp2=(jobptr)malloc(sizeof(struct mat));
if(totalfree<jl) return(1);
fp=freep;
while(fp!=NULL)
{if(fp->size<jl) fp=fp->next;
else
{jobnumber=jobnumber+1;
totalfree=totalfree-jl;
jp2->name=jn;
jp2->length=jl;
jp2->address=freep->address;
if(jobp==NULL)
{jp2->next=NULL;
jp2->back=NULL;
jobp=jp2;
}
else
{jp=jobp;
while(jp!=NULL && (jp2->address<jp->address))
{jp1=jp;
jp=jp->next;
}
jp2->next=jp;
if(jp==NULL)
{jp2->back=jp1;
jp1->next=jp2;
}
else
{jp2->back=jp->back;
if(jp->back!=NULL) jp1->next=jp2;
else jobp=jp2;
jp->back=jp2;
}
}
if((fp->size-jl)<MIN)
{if(fp->next!=NULL) fp->next->back=fp->back;
if(fp->back!=NULL) fp->back->next=fp->next;
else freep=fp->next;
/*return()*/
}
else
{fp->size=fp->size-jl;
fp->address=fp->address+jl;
}
return(2);
}
if(totalfree>=jl) return(0);
}
}
/*显示模块*/
void xianshi()
{jobptr jp;
/*清屏*/
if(jobnumber<=0) printf("NO JOB!");
else
 {
  printf("name\t\tlength\t\taddress\n");
  jp=jobp;
  while(jp!=NULL)
  { 
    printf("%c\t\t%d\t\t%d\n",jp->name,jp->length,jp->address);
    jp=jp->next;
   }
 }
printf("\nthe total left is %d bytes:",totalfree);
}

/******回收模块******/
void huishou(char jn)
{
 freeptr fp,fp1,fp2;
 jobptr jp;
 int f=0;

 jp=jobp;
 while((jp!=NULL)&&(jp->name!=jn)) jp=jp->next;
 if(jp!=NULL)
{
 jobnumber=jobnumber-1;
 totalfree=totalfree+jp->length;
 if(free==NULL)
 {
  freep=(freeptr)malloc(sizeof(struct freearea));
  freep->address=jp->address;
  freep->size=jp->address;
  freep->next=NULL;
  freep->back=NULL;
 }
else
{
 fp=freep;
 while((fp!=NULL)&&(fp->address<jp->address))
{
  fp1=fp;
  fp=fp->next;
}
if(fp!=NULL)
{if((fp->next!=NULL)&&(fp->next->address=jp->address+jp->length))
     f=f+1;
 if((fp->back!=NULL)&&(jp->address=fp1->address+fp1->size))
     f=f+2;
}
 else if((jp->address)=(fp1->address+fp1->size)) f=f+2;
switch(f)
{
case 0:
    {
      fp2=(freeptr)malloc(sizeof(struct freearea));
      fp2->address=jp->address;
      fp2->size=jp->length;
      fp2->next=fp;
      if(fp!=NULL)
      {
       fp2->back=fp->back;
       if(fp->back!=NULL) fp1->next=fp2;
       else freep=fp2;
       fp->back=fp2;
      }
      else
      {
       fp2->back=fp1;
       fp1->next=fp2;
      }
     }
case 1:
     {
       fp->size=fp->size+jp->length;
       fp->address=jp->address;
     }
case 2:
   fp1->size=fp1->size+jp->length;
case 3:
{
   fp1->size=fp1->size+jp->length+fp->size;
   fp1->next=fp->next;
   if(fp->next!=NULL)  fp->next->back=fp2;
   free(fp);
    }
  }
}
if(jp==jobp)  jobp=jp->next;
if(jp->next!=NULL)  jp->next->back=jp->back;
if(jp->back!=NULL)  jp->back->next=jp->next;
free(jp);
 }
}
/***********搬家**************/
void banjia()
{
freeptr fp,fp1;
jobptr jp;
long bottom;


if(jobnumber>0)
{
  jp=jobp;
  bottom=TOTAL+SETADDRESS;
  while(jp!=NULL)
  {jp->address=bottom-jp->length;
   bottom=bottom-jp->length;
  jp=jp->next;
}

fp=freep;
while(fp!=NULL)
{
  fp1=fp;
fp=fp->next;
   free(fp1);
  }
  freep=(freeptr)malloc(sizeof(freeptr));
  freep->size=totalfree;
  freep->address=SETADDRESS;
  freep->next=NULL;
  freep->back=NULL;
 }
}
void mingling()
{
char name,anykey,jobname;
int length,select;
int address;
{
a1:
void clrscr();
  printf("you can select one of the following\n");
  printf("(1)require to be allocate\n");
  printf("(2)require to collexte the size\n");
  printf("(3)check the memory\n");
  printf("(4)quit the system\n");
  printf("you select is:");
  scanf("%d",&select);
  switch(select)
  { case 1:
           if(jobnumber>=MAX)printf("the job is too many");
           else
           {
             printf("enter you job name\n");
             scanf("%s",&name);
             printf("enter you job length\n");
             scanf("%10d",&length);
             address=fengpei(length,name);
             switch(address)
             { case 1: printf("the memory is full");break;
               case 0:
                 {banjia();
                  fengpei(length,name);
                  xianshi();
                  break;}
               case 2: xianshi();break;}
               break;}
    case 2:
    {             
          printf("enter the name of the job \n");
          printf("you select is :");
          jobname=getchar();
          jobname=getchar();
          huishou(jobname);
          xianshi();break;
          }
    case 3:  xianshi();break;
    case 4:  goto  a2;
    }
printf("\n press enter  to return menu \n");
anykey=getchar();
anykey=getchar();
goto a1;
a2:  printf("you hava exit the system!");
 }
}
void main()
{
init();
mingling();
} 
                                 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -