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

📄 program.h

📁 操作系统实验 内存分配与回收 实验二(包含程序源代码和完整报告)
💻 H
字号:
#include "define.h"

void Init()					//初始化所有变量
{
	int i;
	L=1;
	W=(work *)calloc(LEN,sizeof(work));
	F=(Free *)calloc(LEN,sizeof(Free));
	for(i=0;i<MEMORY;i++)
	{
		M.m[i]=FREE;		//内存空间置空
	}
	for(i=0;i<LEN;i++)
	{
		F[i].begin=0;
		F[i].length=0;
		F[i].flag=NO;		//空闲表标志为空表目
	}
}

void Creatwork()			//创建作业表
{
	int i,j,n;
	i=0;
	j=0;
	printf("请输入当前作业数目:\n");
	scanf("%d",&n);
	N=n;
	for(i=0;i<N;i++)
	{
		printf("请输入作业名:\n");
		scanf("%s",W[i].name);
		printf("请输入作业长度:\n");
		scanf("%d",&W[i].length);
		W[i].state=DEF;
	}
	i=0;
	while(j<N)
	{
		if(M.m[i]==USE)
		{
			i++;
			continue;
		}
		else
		{
			if(W[j].length>MEMORY-i)				//作业长度超出范围 
			{
				printf("作业%s对内存需求过大,无法满足!\n",W[j].name);
				W[j].state=DEF;						//作业标记为分配失败 
				j++;
				continue;
			}
			else
			{
				W[j].begin=i;
				W[j].state=YES;
				M.m[i]=USE;
				M.leng[i]=W[j].length;
				printf("作业 %s 开始工作。\n",W[j].name); 
				i=i+W[j].length;
				M.m[i-1]=USE;
				M.leng[i-1]=W[j].length;
				j++;
				continue;
			}
		}
	}
	M.m[i]=FREE;
	M.leng[i]=MEMORY-i;
	UpdataFree(i,M.leng[i]);
}

void UpdataFree(int begin,int len)				//更新空闲表
{
	int i;
	for(i=0;i<L;i++)
	{
		if(F[i].flag==NO)
		{
			F[i].begin=begin;
			F[i].length=len;
			F[i].flag=YES;
			break;
		}
		if((F[i].begin+F[i].length==begin&&begin+len==F[i+1].begin)||//上下临界 
		(F[i+1].begin+F[i+1].length==begin&&begin+len==F[i].begin))
		{
            if(F[i+1].begin>F[i].begin)
            {
			     F[i].length=F[i].length+len+F[i+1].length;
			     F[i+1].flag=NO;
			    
            }
            else
            {
                 F[i+1].flag=YES;
                 F[i+1].length=F[i].length+len+F[i+1].length;
			     F[i].flag=NO;
			     F[i].begin=0;
			     F[i].length=0;
             }
			break;
		}
		else
		{   
			if(begin+len==F[i].begin)           //上临 
			{
				F[i].begin=begin;
				F[i].length=len+F[i].length;
				F[i].flag=YES;
				break;
			}
			else
			{
				if(F[i].begin+F[i].length==begin)//下临 
				{
					F[i].length=len+F[i].length;
					F[i].flag=YES;
					break;
				}
				else
					continue;
			}
		}
	}
	if(i==L)
	{
		L++;
		F[i].begin=begin;
		F[i].length=len;
		F[i].flag=YES;
	}
}

void PrintMemory()				//内存情况
{
	int i,k;
	int f;	
	printf("内存中作业状态:\n"); 
	printf("起址\t长度\t状态\n"); 
	for(i=0;i<MEMORY;i++)
	{
		k=i;
		f=0;				//标志内存中某段空间首地址 
		while(M.m[i]==FREE&&i<MEMORY)
		{
			f++;			//是否为空闲区	
			i++;			
		}
		if(i==MEMORY)
			f--;
		if(k!=i+f)
		{
			printf("%d\t%d\t空闲\n",k,f+1);
		}
		else
		if(i<MEMORY)
		{
			printf("%d\t%d\t已分配\n",i,M.leng[i]);
			i=i+M.leng[i]-1; 
		}
	}
	
}

void Working()  		//作业工作
{
	int i,j,n;
	while(1)
	{
		srand(time(NULL));
		n=rand()%N;
		if(W[n].state==YES)
		{
			printf("作业 %s 正在工作!\n",W[n].name);
			M.m[W[n].begin]=FREE;
			W[n].state=NO;
			if(M.m[W[n].begin+W[n].length]==FREE)
			{
				M.leng[W[n].begin]=M.leng[W[n].begin]+M.leng[W[n].begin+W[n].length];
			}
			else
			{
				M.leng[W[n].begin]=W[n].length; 
			}
			printf("作业 %s 已工作完成!\n",W[n].name);
			break;
		}
		else
		{
			continue;
		}
	}
	UpdataFree(W[n].begin,W[n].length);
}
	
void append()				//添加新作业
{
	int i,j;
	i=N;
	N++;
	printf("请输入新作业名:\n");
	scanf("%s",W[i].name);
	printf("请输入新作业的长度:\n");
	scanf("%d",&W[i].length);
	for(j=0;j<LEN;j++)
	{
		if(W[i].length>F[j].length||F[j].flag==NO)
		{
			continue;
		}
		else
		{
			printf("作业%s开始工作!\n",W[i].name);
			W[i].state=YES;
			W[i].begin=F[j].begin;
			M.m[F[j].begin]=USE;
			F[j].flag=NO;
			if(F[j].length-W[i].length>=MAX)
			{
				M.leng[F[j].begin]=W[i].length;
				M.m[F[j].begin+W[i].length]=FREE;
				M.leng[F[j].begin+W[i].length]=F[j].length-W[i].length;
				UpdataFree(F[j].begin+W[i].length,M.leng[F[j].begin+W[i].length]);
				break;
			}
			else
			{
				M.m[F[j].begin]=M.leng[j];
				break;
			}
		}
	}
	if(j>=LEN)
	{
		printf("内存不足,无法进行新作业%s\n",W[i].name);
		W[i].state=DEF;
	}
}

void PrintWork()			//输出所有作业状态
{
	int i;
	printf("作业名\t作业状态\n");
	for(i=0;i<N;i++)
	{
		if(W[i].state==YES)
		{
			printf("%s\t正在工作\n",W[i].name);
			continue;
		}
		if(W[i].state==NO)
		{
			printf("%s\t已结束\n",W[i].name);
			continue;
		}
		if(W[i].state==DEF)
		{
			printf("%s\t未分配\n",W[i].name);
			continue;
		}
	}
}

void PrintFree()			//输出空闲表
{
	int i;
	printf("起始地址\t长度\t状态\n");
	for(i=0;i<LEN;i++)
	{
		if(F[i].flag==YES)
		{
			printf("%d\t\t%d\t未分配\n",F[i].begin,F[i].length);
		}
		if(F[i].flag==NO)
		{
			printf("         \t    \t空表目\n");
		}
	}
}

⌨️ 快捷键说明

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