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

📄 chenqi.cpp

📁 采用最佳适应算法模拟实现内存管理-在VC++环境下编译通过
💻 CPP
字号:
#include<stdio.h>
#include<string.h>
#include<iostream.h> 
#include<conio.h>
struct kongkuai
{
	int startaddr;
    int size;
    int flag;
}kongxq[];
kongkuai kongxq[6]={                 //初始化空闲区表
	{10,30,1},                  
	{80,40,1},
	{160,80,1},
	{300,100,1},
	{450,120,1},
	{650,150,1}
};

int allocate(int jobsize)            //空闲区分配函数
{
   int i;
   int t=0;
   for(i=0;i<6;i++)
    if(kongxq[i].flag==1&&kongxq[i].size>jobsize)
	{
		kongxq[i].startaddr+=jobsize;
		kongxq[i].size-=jobsize;
		t=1;
		return kongxq[i].startaddr-jobsize;
	}
	else
	if(kongxq[i].flag==1&&kongxq[i].size==jobsize)
	{
		kongxq[i].flag=0;
		t=1;
		return kongxq[i].startaddr;
	}
	if(t==0)
		return false;
	return 1;
}

circle()
{
	int i,j;
	struct kongkuai temp;
	for(i=0;i<6;i++)
		for(j=0;j<6;j++)
            if(kongxq[j].size>kongxq[j+1].size)
			{
				temp.startaddr=kongxq[j].startaddr;
				temp.size=kongxq[j].size;
				temp.flag=kongxq[j].flag;
				kongxq[j].startaddr=kongxq[j+1].startaddr;
				kongxq[j].size=kongxq[j+1].size;
				kongxq[j].flag=kongxq[j+1].flag;
				kongxq[j+1].startaddr=temp.startaddr;
				kongxq[j+1].size=temp.size;
				kongxq[j+1].flag=temp.flag;
			}
	for(i=0;i<6;i++)
	    for(j=0;j<6;j++)
            if(kongxq[j].flag==0&&kongxq[j+1].flag==1)
			{
				temp.startaddr=kongxq[j].startaddr;
				temp.size=kongxq[j].size;
				temp.flag=kongxq[j].flag;
				kongxq[j].startaddr=kongxq[j+1].startaddr;
				kongxq[j].size=kongxq[j+1].size;
				kongxq[j].flag=kongxq[j+1].flag;
				kongxq[j+1].startaddr=temp.startaddr;
				kongxq[j+1].size=temp.size;
				kongxq[j+1].flag=temp.flag;
			}
   return 1;
}

callback()                        //空闲区回收函数
{
	int s,len,t1=0,t2=0,t3=0,i,j;
	printf("\n请输入回收区的起始地址:\n");
	scanf("%d",&s);
	printf("请输入回收区的大小:\n");
	scanf("%d",&len);
	for(i=0;i<6;i++)
	{
		if((kongxq[i].startaddr==s+len)&&(kongxq[i].flag==1))
		{
			len+=kongxq[i].size;
			t1=1;
			for(j=0;j<6;j++)
			{
				if((kongxq[j].startaddr+kongxq[j].size==s)&&(kongxq[j].flag==1))
				{
					kongxq[i].flag=0;
					kongxq[j].size=kongxq[j].size+len;
					t2=1;
					break;
				}
			if(t2==0)
			{
				kongxq[i].startaddr=s;
				kongxq[i].size=len;
				break;
			}

		}
		}
	}
	if(t1==0)
	{
		for(i=0;i<6;i++)
		{
			if((kongxq[i].startaddr+kongxq[i].size==s)&&(kongxq[i].flag==1))
			{
				kongxq[i].size+=len;
				t3=1;
				break;
			}
			if(t3==0)
				for(j=0;j<6;j++)
					if(kongxq[j].flag==0)
					{
						kongxq[j].startaddr=s;
						kongxq[j].size=len;
						kongxq[j].flag=1;
						break;
					}
		}
		
	}

return 1;
}

void print()                        //空闲区状态打印函数
{
	int i;
	printf("\n         起始地址  |    大小    |    标记      \n\n");
	for(i=0;i<6;i++)
	{
		printf("           %3d     |    %3d     |    %3d         \n",
			kongxq[i].startaddr,kongxq[i].size,kongxq[i].flag);
	}
	printf("\n");
}

 int main()
{
    int jobsize,start;
	char end;
	int sa,sz,i;
	printf("初始化空闲区:\n");
	for(i=1;i<=6;i++)
	{
	cout<<"请输入第"<<i<<"个空闲区的首地址和空闲区大小:"<<endl;
	cin>>sa>>sz;
	kongxq[i-1].startaddr=sa;	
	kongxq[i-1].size=sz;
	}
	printf("初始空闲区状态:\n");
	circle();
	print();
    while(true)
	{
      printf("\n请输入你想进行的操作:\n\n");
	  printf("           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
	  printf("           $   1.请求空闲区      2.回收空闲区      3.退出   $\n");
	  printf("           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
	  end=getch();
		if(end=='1')
		{
        printf("\n请输入请求空闲区的作业大小:");
		scanf("%d",&jobsize);
        start=allocate(jobsize);
		circle();
		printf("分配后空闲区状态:\n");
		print();
		if(!start)
			printf("没有适合的空闲区大小!\n");
		else
			printf("作业起始地址:%d\n",start);
            printf("作业大小:%d\n",jobsize);
		
		}
    else if(end=='2')
	{
	 callback();
     circle();
	 printf("回收后空闲区状态:\n");
	 print();
	}
	else if(end=='3') 
	{
    printf("\n");
	break;
	}
  
}
return 0;
}

⌨️ 快捷键说明

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