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

📄 主存空间的分配与回收.cpp

📁 操作系统实验和实验报告
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			}
			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->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\t=================================\n");
	 printf("\t\t\t实验三:主存空间的分配与回收演示\n");
	 printf("\t\t\t=================================\n\n\n");
	printf("\t\t\t班级:06级软件工程2班\n");
	printf("\t\t\t姓名:李海云\n");
	printf("\t\t\t学号:3106006958\n");
	 printf("\n\n\n");
	 printf("\t\t\t按任意键进入演示...");
	 getch();
	 system("cls");
}

void init()
{
	 printf("\t\t===================================\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===================================\n\n\n");
	 printf("\t\t\t请选择你要的操作:");
 }


void 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;
     }
 }

void 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;
	}
}

void 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\t==========================\n");
	 printf("\t\t\t主存空间的分配与回收演示\n");
	 printf("\t\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 + -