进程在计算当中都需要一定的内存大小来存储。
进程包括: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;
}