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

📄 zuijiashiyingsuanfa.cpp

📁 操作系统中:用最佳适应算法进行进程调度
💻 CPP
字号:
#include <stdio.h>//在根目录查找stdio.h
#include <stdlib.h>//在根目录下查找stdlib.h
#include <conio.h>//在根目录下查找conio.h
#include <dos.h>//在根目录下查找dos.h
#include <iostream.h>//在根目录下查找iostream.h
#define n 200//定义分配的最大值
#define m 200//定义空闲区最大值
#define minsize 10//定义最小空间为10
//#define getpch(type)(type*)mallco(sizeof(type))
struct{//定义分配区表
	int address;//定义分配地址
	int length;//定义分配长度
    int flag;//分配状态
}used[n];

struct{//定义空闲区表
	int address;//定义空闲地址
	int length;//定义空闲长度
    int flag;//空闲状态
}kongxian[m];


    

void allocate(char p,int x)//分配函数
{
	int ad;//地址
	int l=0;//用来放当前空闲区
	int i=0;//容量
	if(kongxian[i].length>=x&&kongxian[i].flag==0)//容量大于x并且未被分配
    {if(kongxian[i].length<kongxian[l].length)//比全部都小
		l=i;
	{if(kongxian[l].length-x<minsize)//如果当前的空闲区(kongxian[l].length-x)小于minsize
	{x=kongxian[l].length;//把空闲区l的长度kongxian[l]赋给x
	ad=kongxian[l].address;}//把空闲区l的地址kongxian[l]赋给地址ad
	}
	}
	else
	{kongxian[l].length=kongxian[l].length-x;//空闲区l的长度kongxian[l]的长度指向空闲区l的长度kongxian[l]的长度减去x
	kongxian[l].address=kongxian[l].address+x;//空闲区l的地址kongxian[l]指向kongxian[l]的地址加x
	}
}


void Recycled(int j)//回收函数
{int s=0;//容量
 while ((used[s].flag!=j)||(used[s].flag==0)&&s<n)//当used[s].flag不等于j或used[s].flag等于0并且s小于分配区的最大值n
	{ s++;//s加1
}
 if(s>n)//如果s大于分配区的最大容量n
	 printf("未找到该作业");//打印未找到该作业
 int a;//地址
 int len;//长度
 a=used[s].address;//把分配区s的地址used[s]的地址赋给地址a
 len=used[s].length;//把分配区s的长度used[s]的长度赋给长度len
 int i=0;
 int k=-1;//上邻
 int h=-1;//下邻
 if(kongxian[i].address+kongxian[i].length==s)//如果空闲区i的地址kongxian[i].address加上空闲区i的长度kongxian[i].length等于容量s
	 k=i;//把i赋给上邻k
 if(kongxian[i].address==a+len)//如果空闲区i的地址kongxian[i].address等于地址a加上长度len
	 h=i;//把i赋给下邻h
 if(k!=-1)//如果上邻k!=-1
    if(h!=-1)//如果下邻h!=-1
	 kongxian[k].length=kongxian[k].length+len+kongxian[h].length;//空闲区k的长度kongxian[k].length加上长度len再加上空闲区h的长度kongxian[h].length赋给空闲区k的长度kongxian[k].length
 else
 {kongxian[k].length=kongxian[k].length+len;//空闲区k的长度kongxian[k].length加上长度len赋给空闲区k的长度kongxian[k].length
 kongxian[k].address=kongxian[k].address;//空闲区k地址kongxian[k].address不变
 }
 else
 {kongxian[h].address=a;//把地址a赋给分配区h的地址
 kongxian[h].length=len+kongxian[h].length;//长度len加上空闲区h的长度kongxian[h].length赋给空闲区h的长度kongxian[h].length
 }

 
}




void main()
{   //初始化空闲区表
    kongxian[0].address=100;//空闲区表的起始地址等于100
    kongxian[0].length=1024*2;//空闲区的起始地址等于1024*2
    kongxian[0].flag=1;//状态为1表示空闲区表未被分配,状态为0表示空闲区表未被使用
    int i,b;
	int xk=0;//长度
    int y=0;//作业名
   for(i=1;i<m;i++)
   {  kongxian[i].flag=0;//空闲区i状态为0表示未被使用
   }

  //初始化已分配区表
  for(i=0;i<n;i++)
  {   used[i].flag=0;//状态为1表示分配区表已分配,状态为0表示分配区表未被分配
  {   printf("选择功能项(0~退出,1~分配主存,2~回收主存,3~显示主存)\n");//打印选择功能项(0~退出,1~分配主存,2~回收主存,3~显示主存)
	  printf("选择功能项(0~3)");//打印选择功能项(0~3)
      scanf("%d",&b);//从键盘输入a值
	  switch(b)
	  {    case 0:exit(0);//退出

	       case 1:printf("输入作业名和所需长度xk:\n");//打印输入作业名和所需长度xk
			      scanf("%d%d",&y,&xk);//从键盘输入输入作业名y和所需长度xk
				  allocate(y,xk);//调用分配函数allocate(y,xk)
		          break;//退出
		   
		   case 2:printf("回收主存\n");//打印回收主存
			      printf("输入作业名");
			      scanf("%d",&y);
				  Recycled(y);//调用回收函数Recycled(y)
			       break;//退出

		   case 3:printf("输出空闲区表:起始地址,分配长度, 标志\n");//打印输出空闲区表:起始地址,分配长度, 标志
		          for(i=0;i<m;i++)
				  {printf("%d,%d,%d",kongxian[i].address,kongxian[i].length,kongxian[i].flag);//打印空闲区i的地址kongxian[i].address,空闲区i的长度kongxian[i].length,空闲区i的状态kongxian[i].flag
				  }
			       break;//退出
			
			//显示已分配区表
			  


		   default:printf("没有该选项\n");//打印没有该选项
			   break;//退出
	  }
  }
  }
   }
   

⌨️ 快捷键说明

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