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

📄 cunchu.cpp

📁 主存空间的分配与回收的模拟实现的方法代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	         k=getsub(SUB);   /*重新生成一个新的分区结点*/
	         strcpy(k->name,pr->name);
	         k->addr=pr->addr;
	         k->size=pr->size;
	         k->state='n';
	         r=sub;
	         while(r!=NULL)
	         {
	          if((r->size)>(k->size))   /*按分区大小排列,回收区域插在合适的位置*/
	            {
	              if(r==sub)       /*第一个空闲分区大于回收区域的情况*/
	                  { k->link=r; sub->link=k; }
	              else
	                 {
	                  s=sub;
	                  while(s->link!=r)  s=s->link;    
	                  k->link=r;
	                  s->link=k;		                  
	                 }
	              break;
	            }     
	          else r=r->link;
	         }
	        if(r==NULL)     /*所有空闲分区都大于回收区域的情况*/ 
	           {
	             s=sub;
	             while(s->link!=NULL)  s=s->link;
	             s->link=k;
	             k->link=NULL;
	           }
	       }    
    }
 printf("\n区域%s己回收.",pr->name);
}	     
   
//--------------------------------------------------------------------------
void reclfirst(JCB *pr)       /*首次适应与循环首次适应区域回收*/
{
 SUB *k;
 r=sub;
 while(r!=NULL)
 {
  if(r->addr==((pr->addr)+(pr->size)))     /*回收区域有下邻*/
    {
	  pr->size+=r->size;
	  s=sub;
	  isdown=1;     /*下邻标志位置1*/
	  while(s!=NULL)
	  {
	   if(((s->addr)+(s->size))==(pr->addr))   /*有下邻又有上邻*/
	    {
	     s->size+=pr->size;
	     k=sub;
	     while(k->link!=r)  k=k->link;
	     k->link=k->link->link;
	     isup=1;      /*上邻标志位置1*/
	     break;
	    }
	   else
	    {s=s->link; isup=0;}    /*上邻标志位置0*/  
	  }
 	  if(isup==0)               /*有下邻无上邻*/
	   { 
	     r->addr=pr->addr;
	     r->size=pr->size;
	   }
	 break;	   
    }
 else 
   {r=r->link; isdown=0;}     /*下邻标志位置0*/
 }  
 if(isdown==0)              /*区域无下邻*/
    { 
      s=sub;
      while(s!=NULL) 
	  {
	   if(((s->addr)+(s->size))==(pr->addr))   /*无下邻但有上邻*/
	     {
	      s->size+=pr->size; 
	      isup=1;        /*上邻标志位置1*/
	      break;
	     }
	   else 
	     { s=s->link; isup=0;}     /*上邻标志位置0*/
	  }
	  if(isup==0)           /*无下邻且无上邻*/
	       { 
	         k=getsub(SUB);   /*重新生成一个新的分区结点*/
	         strcpy(k->name,pr->name);
	         k->addr=pr->addr;
	         k->size=pr->size;
	         k->state='n';
	         r=sub;
	         while(r!=NULL)
	         {
	          if((r->addr)>(k->addr))   /*按分区首地址排列,回收区域插在合适的位置*/
	            {
	              if(r==sub)       /*第一个空闲分区首址大于回收区域的情况*/
	                  { k->link=r; sub->link=k; }
	              else
	                 {
	                  s=sub;
	                  while(s->link!=r)  s=s->link;    
	                  k->link=r;
	                  s->link=k;
	                 }
	              break;
	            }
	          else r=r->link;
	         }
	        if(r==NULL)     /*所有空闲分区的首址都大于回收区域首址的情况*/
	           {
	             s=sub;
	             while(s->link!=NULL)  s=s->link;
	             s->link=k;
	             k->link=NULL;
	           }
	       }    
    }
 printf("\n区域%s己回收.",pr->name);
}

//--------------------------------------------------------------------------
void print()
{printf("\n\n\n\n");
 printf("\t\t**************************************\n");
 printf("\t\t\t主存空间的分配与回收演示\n");
 printf("\t\t**************************************\n\n\n");
 printf("\t\t\t\t蓝小花\n");
 printf("\t\t\t\t计算机学院\n");
 printf("\t\t\t\t软件4班\n");
 printf("\t\t\t\t3204007102\n");
 printf("\t\t\t\t2006年12月\n");
 printf("\n\n\n");
 printf("\t\t\t按任意键进入演示");
 getch();
 system("cls");
}

void init()
{
 printf("\n\n\n\n\t\t\t 1. 显示空闲分区                  \n");
 printf("\t\t\t 2. 分配作业                    \n");
 printf("\t\t\t 3. 回收作业                 \n");
 printf("\t\t\t 0. 返回菜单                     \n");
 printf("\t\t\t请选择你要的操作:");
 }


firstfitf()             //首次适应算法
{
 init();
 switch(getchar())
 {
  case '1':
          system("cls");
           disp();
           getch();
	   system("cls");
	   firstfitf();
	   break;
  case '2':
            system("cls");
                   system("cls");
                   input();
                   printf("\n");

                  while(num!=0)
                  {
                    p=ready;
                    ready=p->link;
                    p->link=NULL;
                    firstfit(p);
                    num--;
                   }

                  getch();
                   printf("\n\t\t              完成分配后的空闲分区表             \n");
                   disp();
                  printf("\n\t\t                  已分配作业表                   \n");
                  disp2();
                  if(is==0)
                   printf("\n 全部作业已经被分配内存.");
                  else printf("\n 作业没有全部被分配内存.\n");
                  getch();
                  system("cls");
                  firstfitf();
                  break;
      case '3':
                  system("cls");
                   disp2();
                   printf("\n\n按任意键进行区域回收.");
                  printf("\n");
                    while(as!=NULL)
                  {getch();
                   input2();
                   printf("按任意键继续...");
                    getch();
                    printf("\n");
                    reclfirst(q);

                    getch();
                    printf("\n\t\t              回收后的空闲分区表             \n");
                    disp();
                    printf("\n\t\t                已分配作业表                 \n");
                    disp2();
                      printf("\n继续回收...(Enter)");
                   }
                    printf("\n所有已分配作业已完成!");
                    printf("\nPress any key to return...");
                    getch();
                  system("cls");
                  firstfitf();
                  break;
         case '0':
                 break;
         default:
                getch();
                  system("cls");
                  firstfitf();
                  break;
     }
 }

cyclefirstf()      //循环首次适应算法
{
  init();
 switch(getchar())
 {
  case '1':
          system("cls");
           disp();
           getch();
	   system("cls");
	   cyclefirstf();
	   break;
   case '2':
           system("cls");
            cur=sub;
            input();
            printf("\n");
            while(num!=0)
              {
                p=ready;
                ready=p->link;
                p->link=NULL;
                cyclefit(p);
                num--;
              }

            getch();
            printf("\n\t\t              完成分配后的空闲分区表             \n");
            disp();
            printf("\n\t\t                已分配作业表                 \n");
            disp2();
            if(is==0)
               printf("\n 全部作业已经被分配内存.");
            else printf("\n 作业没有全部被分配内存.\n"); 
            getch();
                  system("cls");
                  cyclefirstf();
                  break;
        case '3':
            system("cls");
                   disp2();
            printf("\n\n按任意键进行区域回收.");

            while(as!=NULL)
              {getch();
               printf("\n");
               input2();
               printf("按任意键继续...");
               getch();
               printf("\n");
               reclfirst(q);

               getch();
               printf("\n\t\t              回收后的空闲分区表             \n");
               disp();
               printf("\n\t\t                已分配作业表                 \n");
               disp2();
               printf("\n继续回收...(Enter)");
              }
            printf("\n所有已分配作业已完成!");
            getch();
                  system("cls");
                  cyclefirstf();
                  break;
       case '0':
               break;
         default:
                getch();
                  system("cls");
                 cyclefirstf();
                  break;
  }
 }

 perfitf()
 {
   init();
 switch(getchar())
 {
  case '1':
          system("cls");
          less_to_more();
           disp();
           getch();
	   system("cls");
	   perfitf();
	   break;
  case '2':
         system("cls");
            cur=sub;
            input();
            printf("\n");
            while(num!=0)
              {
                p=ready;
                ready=p->link;
                p->link=NULL;
                less_to_more();   /*重新排列分区,按从小到大排列*/
                perfit(p);
                num--;
              }

            getch();
            printf("\n\n\t\t     完成分配后分区表(分区按由小到达排列)    \n");
            disp();
            printf("\n\t\t                 已分配作业表                  \n");
            disp2();
            if(is==0)
               printf("\n 全部作业已经被分配内存.");
            else printf("\n 作业没有全部被分配内存.\n");
            getch();
	   system("cls");
	   perfitf();
	   break;
  case '3':
            system("cls");
                   disp2();
          printf("\n\n按任意键进行区域回收.");

            while(as!=NULL)
              {getch();
               printf("\n");
               input2();
               printf("按任意键继续...");
               getch();
               printf("\n");
               reclperfit(q);

               getch();
               printf("\n\t\t              回收后的空闲分区表             \n");
               disp();
               printf("\n\t\t                已分配作业表                 \n");
               disp2();
               printf("\n继续回收...(Enter)");
              }
            printf("\n所有已分配作业已完成!");

             getch();
	   system("cls");
	   perfitf();
	   break;
   case '0':
               break;
         default:
                getch();
                  system("cls");
                perfitf();
                  break;
  }
 }

//--------------------------------------------------------------------------
void menu()      /*菜单函数*/
{
 int i;
 printf("\n\n\n\t\t**************************************\n");
 printf("\t\t\t主存空间的分配与回收演示\n");
 printf("\t\t**************************************\n");;
 printf("\t\t\t\n\n");
 printf("\t\t\t 1. 首次适应算法                    \n");
 printf("\t\t\t 2. 循环首次适应算法                 \n");
 printf("\t\t\t 3. 最佳适应算法                     \n");
 printf("\t\t\t 0. 退出                            \n");
 printf("\t\t\t请选择你要的操作:");
 switch(getchar())
 {
  case '1':

            system("cls");
            firstfitf();
            getch();
            system("cls");
            menu();
            break;

  case '2':
            system("cls");
             cyclefirstf();
            getch();
            system("cls");
            menu();
            break;  
  
  case '3':
            system("cls");
                perfitf();
            getch();
            system("cls");
            menu();
            break;

  case '0':
            break;   
  default:
            getch();    
            system("cls"); 
            menu();     
            break;
            
 }
}
            
//--------------------------------------------------------------------------            
void main()     /*主函数*/
{
 init_sub();
 print();
 menu();
}
//--------------------------------------------------------------------------

⌨️ 快捷键说明

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