模拟进程在计算机存储

进程在计算当中都需要一定的内存大小来存储。
进程包括:PID进程的id,Saddr起始存储空间的地址,Size存储大小。
不多比比直接代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define   NUM 20
int mem_size,use_size;
char *Memory;
int Rec_size;
int Free_Size;

typedef struct 
{
	int PID;
	int SAddr;
	int Size;
}RECTABLE;
RECTABLE *re;

typedef struct
{
	int Saddr;
	int Size;
}Free_Table;
Free_Table *fr;

typedef struct
{
	int PID;
	int Size;
}PCB;

void Init()
{
	printf("输入内存空间大小:");
	scanf("%d",&mem_size);
	Memory=(char*)malloc(mem_size*sizeof(char));
	use_size=mem_size;
	
	re=(RECTABLE*)malloc(NUM*sizeof(RECTABLE));
	Rec_size=0;
	
	fr=(Free_Table*)malloc(NUM*sizeof(Free_Table));
	Free_Size=1;
	fr[0].Saddr=0;
	fr[0].Size=mem_size;   
	
	printf("\n\n");
}
void suanfa()
{
	int choose;
	printf("1.FF 2.BF 3.WF\n");
	scanf("%d",&choose);
	int i,j;
	Free_Table t;
	switch(choose)
	{
		case 1:
		 	for(i=0;i<Free_Size;i++)
		 	{
		 		for(j=0;j<Free_Size-1;j++)
		 		{
		 			if(fr[j].Saddr>fr[j+1].Saddr)
		 			{
		 				t=fr[j];
		 				fr[j]=fr[j+1];
		 				fr[j+1]=t;
					 }
				 }
			 }
			 
			 break;
		case 2: 
		for(i=0;i<Free_Size;i++)
		 	{
		 		for(j=0;j<Free_Size-1;j++)
		 		{
		 			if(fr[j].Size>fr[j+1].Size)
		 			{
		 				t=fr[j];
		 				fr[j]=fr[j+1];
		 				fr[j+1]=t;
					 }
				 }
			 }
			 	break;
		case 3:	
		for(i=0;i<Free_Size;i++)
		 	{
		 		for(j=0;j<Free_Size-1;j++)
		 		{
		 			if(fr[j].Size<fr[j+1].Size)
		 			{
		 				t=fr[j];
		 				fr[j]=fr[j+1];
		 				fr[j+1]=t;
					 }
				 }
			 }
			 	break;
		default:printf("Erorr!\n\n");
	}

}
void loccation()
{
	PCB p;
	printf("\t\t输入进程信息:\n");
	printf("PID: ");scanf("%d",&p.PID);
	printf("Size: ");scanf("%d",&p.Size);
	

	{
		int i,j;
		int f;
		for(i=0;i<Free_Size;i++)
		{
			if(p.Size<fr[i].Size)
			{
				re[Rec_size].PID=p.PID;
				re[Rec_size].SAddr=fr[i].Saddr;
				re[Rec_size].Size=p.Size;
				Rec_size++;
				
				fr[i].Saddr=fr[i].Saddr+p.Size;
				fr[i].Size=fr[i].Size-p.Size;
				f=2;
				break;
			}
			if(p.Size==fr[i].Size)
			{
				re[Rec_size].PID=p.PID;
				re[Rec_size].SAddr=fr[i].Saddr;
				re[Rec_size].Size=p.Size;
				Rec_size++;
				
				Free_Size--;
				f=1;
				break;
			}
			if(p.Size>fr[i].Size)
			{
				f=0;
			}
		}
		if(f==2)
		use_size-=p.Size;
		
		if(f==1)
		{	
			use_size-=p.Size;
			if(Free_Size!=0)
			{
				for(j=i;j<Free_Size;j++)
				{
					fr[j]=fr[j+1];
				}
			}	
		}
		
		if(f==0)
		{
			printf("现有存在的碎片空间,不够存下重新整理碎片中!\n");
			int sum=0;
			for(i=0;i<Free_Size;i++)
			{
				sum+=fr[i].Size;
			}
			if(sum<p.Size)
			printf("内存不足!\n\n");
			else
			{
				use_size=mem_size;
				Free_Size=0;
				int _sum=0,rectable_size[Rec_size],rectable_PID[Rec_size];
				for(i=0;i<Rec_size;i++)
				{
					_sum+=re[i].Size;
					rectable_PID[i]=re[i].PID;
					rectable_size[i]=re[i].Size;	
				}
				//初始化 
				_sum+=p.Size;
				use_size-=_sum;
				fr[0].Saddr=_sum;
				fr[0].Size=use_size;
				
				if(use_size==0)
				Free_Size=0;
				else
				Free_Size++;
				
				
				for(i=0;i<Rec_size;i++)
				{
					re[i].PID=rectable_PID[i];
					
					if(i==0)
					re[i].SAddr=0;
					
					else
					re[i].SAddr=re[i-1].SAddr+re[i-1].Size;
					re[i].Size=rectable_size[i];
				}
				
				re[Rec_size].PID=p.PID;
				re[Rec_size].SAddr=re[Rec_size-1].SAddr+re[Rec_size-1].Size;
				re[Rec_size].Size=p.Size;
				Rec_size++;
			}
		}	
	}
}
void jieshujiengcheng()
{
	int id;
	printf("输入结束进程的PID:");scanf("%d",&id);
	int i,j;
	int saddr,size;
	for(i=0;i<Rec_size;i++)
	{
		if(id==re[i].PID)
		{
			saddr=re[i].SAddr;
			size=re[i].Size;
			break;
		}
	}
	for(j=i;j<Rec_size-1;j++)
	re[j]=re[j+1];
	
	Rec_size--;
	
	fr[Free_Size].Saddr=saddr;
	fr[Free_Size].Size=size;
	Free_Size++;
}
void display()
{
	int i;
	printf("Memory Total_Size:%d	Use_size:%d\n\n",mem_size,use_size);
	
	if(Rec_size==0)
	printf("无分配记录!\n\n");
	else
	{
		printf("\t\tRecTable:\nPID:\tSAddr:\tSize:\n");
		for(i=0;i<Rec_size;i++)
		{
			printf("%d\t%d\t%d\n",re[i].PID,re[i].SAddr,re[i].Size);
		}
	}
	
	
	if(Free_Size==0)
	printf("无空闲记录!\n\n");
	else
	{
		printf("\t\tFree_Table\nSAddr:\tSize:\t\n");
		for(i=0;i<Free_Size;i++)
		{
			printf("%d\t%d\n",fr[i].Saddr,fr[i].Size);
		}
	}
	printf("\n\n");
}
void meun()
{
	printf("\t\t**--------------------------------**\n");
	printf("\t\t**---       1.add process      ---**\n");
	printf("\t\t**---       2.End the process  ---**\n");
	printf("\t\t**---       3.Display process  ---**\n");
	printf("\t\t**---       4.algorithm        ---**\n");
	printf("\t\tPlease choose:");
}
int main()
{
	system("title 大帅比");
	system("color E5");
	Init();
	int choose;
	meun();
	scanf("%d",&choose);
	while(choose!=0)
	{
		switch(choose)
		{
			case 1:loccation();
				break;
			case 2: jieshujiengcheng();
				break;
			case 3:display();
				break;
			case 4:suanfa();
				break;
			default: printf("\t\t\tErorr!\n"); break;
		}
		meun();
		scanf("%d",&choose);
	}
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值