zoukankan      html  css  js  c++  java
  • 实验四

     一,实验目的

     用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方式及其算法的理解。

    二,实验内容和要求

    采用连续分配方式之动态分区分配存储管理,使用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法4种算法完成设计(任选两种算法)。

    (1)**设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。采用分区说明表进行。

    (2)或在程序运行过程,由用户指定申请与释放。

    (3)设计一个空闲区说明表,以保存某时刻主存空间占用情况。把空闲区说明表的变化情况以及各作业的申请、释放情况显示。

    根据指定的实验课题,完成设计、编码和调试工作,完成实验报告。

    三、主要程序及其解释

    #include<stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #define nil -1
    #define NULL 0
    #define maxisize 600 //用户的空闲区空间最大值
    #define minisize 4 
    #define getspace(type) (type*)malloc(sizeof(type)) //分配空间
    struct table{
    	char job; //作业标号
    	float address; //分区起始地址
    	float length; //分区长度,单位为字节
    	int flag; //分区表的状态位
    	struct table *FRlink; //前向指针
    	struct table *RElink; //后向指针
    }*free_table=NULL,*place; //已分配分区表,空闲分区表
    typedef struct table FRtable;
    
    FRtable *init(FRtable *tb)
    {
    	tb->FRlink=NULL;
    	tb->job=nil;
    	tb->address=0;
    	tb->length=2048;
    	tb->flag=0;
    	tb->RElink=NULL;
    	return tb;
    }
    void allocate(char job,float xk,int choice)
    {
    	FRtable *tb,*link;
    	int k=0;float temp=600;
    	if (free_table->FRlink==NULL&&free_table->RElink==NULL)
    	{
    		free_table->job=job;
    		free_table->length=xk;
    		free_table->flag=1;
    		if (xk<maxisize)
    		{
    			tb=getspace(FRtable);
    			free_table->RElink=tb;
    			tb->FRlink=free_table;
    			tb->job=nil;
    			tb->address=0+xk;
    			tb->length=maxisize-xk;
    			tb->flag=0;
    		}
    		if (choice==2)
    		{
    			free_table->FRlink=tb;
    			tb->RElink=free_table;
    			place=tb;
    		}
    		else
    		{
    			free_table->FRlink=NULL;
    			if (xk<maxisize) tb->RElink=NULL;
    		}
    		k=1;
    	}
    	else
    	{
    		if (2==choice) tb=place;//采用CFF时将ta定位到上次找到的合适空间分区的下个空间分区
    		else tb=free_table;
    		while(tb!=NULL)
    		{
    			if (tb->length>=xk&&tb->flag==0)
    				if (tb->length-xk<=minisize)
    				{//当搜索到的空间大小<=xk+minisize时,将空间全部分配给作业
    					tb->job=job;
    					tb->flag=1;
    					place=tb->RElink;
    					k=1;
    					break;
    				}
    				else
    				{//当搜索到的空间大小>xk+minisize时,将空间划分,再分配给作业
    					link=getspace(FRtable);
    					link->length=tb->length-xk;
    					tb->job=job;
    					tb->length=xk;
    					tb->flag=1;
    					link->RElink=tb->RElink;
    					if (NULL!=tb->RElink) tb->RElink->FRlink=link;
    					tb->RElink=link;
    					link->FRlink=tb;
    					link->job=nil;
    					link->address=tb->address+xk;
    					link->flag=0;
    					place=link;
    					k=1;
    					break;
    				}
    				tb=tb->RElink;
    		}
    	}
    	if (0==k)
    	{
    		printf(">>空间申请失败! 
    ");
    		return;
    	}
    }
    
    //主存回收函数,回收作业job所占用的分区空间
    void reclaim(char job,int choice)
    {
    	int bool1=0,bool2=0;
    	FRtable *tb,*link;
    	tb=free_table;
    	if (2==choice) link=tb;
    	else link=NULL;
    	do
    	{
    		if (job==tb->job&&1==tb->flag) break;
    		tb=tb->RElink;
    		if (tb==link)
    		{
    			printf("
    >>抱歉,不存在作业%c! 
    ",job);
    			return;
    		}
    	}while(tb!=link);
    	bool1=(NULL==tb->FRlink||tb->FRlink==tb->RElink)? 1:tb->FRlink->flag;
    	bool2=(NULL==tb->RElink||tb->FRlink==tb->RElink)? 1:tb->RElink->flag;
    	if (bool1&&bool2)
    	{
    		tb->job=nil;
    		tb->flag=0;
    	}
    	else if ((NULL==tb->FRlink||1==tb->FRlink->flag)&&0==tb->RElink->flag)
    	{
    		link=tb->RElink;
    		tb->job=nil;
    		tb->length+=link->length;
    		tb->flag=0;
    		tb->RElink=link->RElink;
    		if (NULL!=link->RElink) link->RElink->FRlink=tb;
    		free(link);
    	}
    	else if (0==tb->FRlink->flag&&1==tb->RElink->flag)
    	{
    		link=tb->FRlink;
    		link->length+=tb->length;
    		link->RElink=tb->RElink;
    		tb->RElink->FRlink=link;
    		if (free_table==tb) free_table=link;
    		free(tb);
    	}
    	else if (0==tb->FRlink->flag&&0==tb->RElink->flag)
    	{
    		link=tb->FRlink;
    		link->length=link->length+tb->length+tb->RElink->length;
    		link->RElink=tb->RElink->RElink;
    		if (NULL!=tb->RElink->RElink) tb->RElink->RElink->FRlink=link;
    		if (free_table==tb) free_table=link;
    		free(tb);
    		free(tb->RElink);
    	}
    }
    //显示空间分区链表
    void display(FRtable *tb,int choice)
    {
    	// clrscr();
    	FRtable *temp;
    	if (2==choice) temp=tb;
    	else temp=NULL;
    	printf("
    	标号	分区首地址	分区大小(KB)	
    ");
    	do
    	{
    		printf("
    	 %c	 %.2f	 %.2f		 %d",tb->job,tb->address,tb->length,tb->flag);
    		tb=tb->RElink;
    	}while(temp!=tb);
    }
    //主函数
    int main()
    {
    	int i,a,choice;
    	float xk;
    	char job;
    	FRtable *ta=getspace(FRtable);
    	free_table=init(ta);
    	do{
    		printf("
     分区分配算法:
    	0 - 退出(Exit)
    	1 - 首次适应算法(FF)
    	2 - 循环首次适应算法
    	
    ");
    		printf(">>请选择相应的算法(0-2):");
    		scanf("%d",&choice);
    		if (0==choice) exit(0);
    	}while(0>choice&&2<choice);
    	while(1)
    	{
    		printf("
     菜单:
    	0 - 退出(Exit)
    	1 - 申请空间(Allocation)
    	2 - 回收空间(Reclaim) 
    ");
    		printf(">>请选择你的操作(0-2):");
    		scanf("%d",&a);
    		switch(a)
    		{
    			//a=0,程序结束
    		case 0:exit(0);
    			//a=1,分配主存空间
    		case 1:printf(">>请输入作业标号和所需要申请的空间:");
    			scanf("%*c%c%f",&job,&xk);
    			allocate(job,xk,choice);
    			display(free_table,choice);
    			break;
    			//a=2,回收主存空间
    		case 2:printf(">>请输入你想回收的作业的相应标号:");
    			scanf("%*c%c",&job);
    			reclaim(job,choice);
    			display(free_table,choice);
    			break;
    		default:printf(">>ERROR:No thie choose! 
    ");
    		}
    	}
    }
    

     

    四,实验总结

    这个实验的原理是书本上的知识,老师也在课堂上讲过,觉得理解并不难,但是不知道怎么觉得实验并不简单

  • 相关阅读:
    Java实现 LeetCode 136 只出现一次的数字
    Java实现 LeetCode 136 只出现一次的数字
    Java实现 LeetCode 136 只出现一次的数字
    Java实现 LeetCode 135 分发糖果
    Java实现 LeetCode 135 分发糖果
    Java实现 LeetCode 135 分发糖果
    Java实现 LeetCode 134 加油站
    Java实现 LeetCode 134 加油站
    Java实现 LeetCode 134 加油站
    Java实现 LeetCode 133 克隆图
  • 原文地址:https://www.cnblogs.com/cckuang/p/4550958.html
Copyright © 2011-2022 走看看