• 0615—主存空间的分配和回收


    实验四  主存空间的分配和回收

              专业:商业软件工程一班   姓名:张鑫相  学号:201406114109

    1.    目的和要求

    1.1.           实验目的

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

    1.2.           实验要求

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

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

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

    (3)设计一个空闲区说明表,以保存某时刻主存空间占用情况。

    把空闲区说明表的变化情况以及各作业的申请、释放情况显示。

    2.    实验内容

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

    3.    实验环境

    可以选用Visual C++作为开发环境。也可以选用Windows下的VB,CB或其他可视化环境,利用各种控件较为方便。自主选择实验环境。

    4.    参考数据结构:

    #include<stdio.h>

    #include<conio.h>

    #include<string.h>

    #define MAX 24

    struct partition{

         

          char pn[10];

          int begin;

          int size;

          int end;   ////////

          char status;  //////////

          };

    typedef struct partition PART;

    5、源代码

    #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 partition{
    		char pn; //作业标号
    		float begin; //分区起始地址
    		float size; //分区长度,单位为字节
    		int status; //分区表的状态位
    		struct partition *FRlink; //前向指针
    		struct partition *RElink; //后向指针
    }*free_partition=NULL,*place; //已分配分区表,空闲分区表
    typedef struct partition PART;
    
    PART *init(PART *td)  //空间分区链表初始化
    {
    	td->FRlink=NULL;
    	td->pn=nil;
    	td->begin=1064;
    	td->size=1664;
    	td->status=0;
    	td->RElink=NULL;
    	return td;
    }
    //主存分配函数,为作业pn分配大小为xk的分区空间
    void allocate(char pn,float xk,int choice)
    {
    	PART *td,*link;
    	int k=0;
    	float temp=600;
    	if (free_partition->FRlink==NULL&&free_partition->RElink==NULL)
    	{//给首个作业分配空间,改写分区链表
    		free_partition->pn=pn;
    		free_partition->size=xk;
    		free_partition->status=1;
    		if (xk<maxisize)
    		{
    			td=getspace(PART);
    			free_partition->RElink=td;
    			td->FRlink=free_partition;
    			td->pn=nil;
    			td->begin=1064+xk;
    			td->size=maxisize-xk;
    			td->status=0;
    		}
    		if (choice==2)
    		{//链接成循环链表
    			free_partition->FRlink=td;
    			td->RElink=free_partition;
    			place=td;
    		}
    		else
    		{
    			free_partition->FRlink=NULL;
    			if (xk<maxisize) 
    				td->RElink=NULL;
    		}
    		k=1;
    	}
    	else
    	{
    		if (2==choice) 
    			td=place;//采用CFF时将ta定位到上次找到的合适空间分区的下个空间分区
    		else 
    			td=free_partition;
    		while(td!=NULL)
    		{
    			if (3==choice)
    			{
    				while(td!=NULL)
    				{
    					if (td->size>=xk&&td->status==0)
    						if (td->size<temp)
    						{
    							place=td;temp=td->size;
    						} //选择最适合空间
    						td=td->RElink;
    			}
    			td=place;
    		}
    		if (td->size>=xk&&td->status==0)
    			if (td->size-xk<=minisize)
    			{//当搜索到的空间大小<=xk+minisize时,将空间全部分配给作业
    				td->pn=pn;
    				td->status=1;
    				place=td->RElink;
    				k=1;
    				break;
    		}
    		else
    		{//当搜索到的空间大小>xk+minisize时,将空间划分,再分配给作业
    			link=getspace(PART);
    			link->size=td->size-xk;
    			td->pn=pn;
    			td->size=xk;
    			td->status=1;
    			link->RElink=td->RElink;
    			if (NULL!=td->RElink) 
    				td->RElink->FRlink=link;
    			td->RElink=link;
    			link->FRlink=td;
    			link->pn=nil;
    			link->begin=td->begin+xk;
    			link->status=0;
    			place=link;
    			k=1;
    			break;
    		}
    		td=td->RElink;
    		}
    	}
    	if (0==k)
    	{//未寻找到合适的空间分区,返回
    		printf("空间申请失败! 
    ");
    		return;
    	}
    }
    
    
    void reclaim(char pn,int choice)  //主存回收函数,回收作业pn所占用的分区空间
    {
    	int bool1=0,bool2=0;
    	PART *td,*link;
    	td=free_partition;
    	if (2==choice) 
    		link=td;
    	else 
    		link=NULL;
    	do
    	{
    		if (pn==td->pn&&1==td->status) 
    			break;
    		td=td->RElink;
    		if (td==link)
    		{
    			printf("
    抱歉,作业不存在%c! 
    ",pn);
    			return;
    		}
    	}
    	while(td!=link);
    	bool1=(NULL==td->FRlink||td->FRlink==td->RElink)? 1:td->FRlink->status;
    	bool2=(NULL==td->RElink||td->FRlink==td->RElink)? 1:td->RElink->status;
    	if (bool1&&bool2)
    	{
    		td->pn=nil;
    		td->status=0;
    	}
    	else if ((NULL==td->FRlink||1==td->FRlink->status)&&0==td->RElink->status)
    	{
    		link=td->RElink;
    		td->pn=nil;
    		td->size+=link->size;
    		td->status=0;
    		td->RElink=link->RElink;
    		if (NULL!=link->RElink) 
    			link->RElink->FRlink=td;
    		free(link);
    	}
    	else if (0==td->FRlink->status&&1==td->RElink->status)
    	{
    		link=td->FRlink;
    		link->size+=td->size;
    		link->RElink=td->RElink;
    		td->RElink->FRlink=link;
    		if (free_partition==td) 
    			free_partition=link;
    		free(td);
    	}
    	else if (0==td->FRlink->status&&0==td->RElink->status)
    	{
    		link=td->FRlink;
    		link->size=link->size+td->size+td->RElink->size;
    		link->RElink=td->RElink->RElink;
    		if (NULL!=td->RElink->RElink) 
    			td->RElink->RElink->FRlink=link;
    		if (free_partition==td) 
    			free_partition=link;
    		free(td);
    		free(td->RElink);
    	}
    }
    //显示空间分区链表
    void display(PART *td,int choice)
    {
    	PART *temp;
    	if (2==choice) 
    		temp=td;
    	else 
    		temp=NULL;
    	printf("
    	作业	分区首地址	分区大小(KB)	 状态
    ");
    	printf("
    	 sys	 1024.00	 40.00		 1
    ");
    	do
    	{
    		printf("
    	 %c	 %.2f	 %.2f		 %d
    ",td->pn,td->begin,td->size,td->status);
    		td=td->RElink;
    	}while(temp!=td);
    }
    //主函数
    int main()
    {
    	int i,a,choice;
    	float xk;
    	char pn;
    	PART *ta=getspace(PART);
    	free_partition=init(ta);
    	do
    	{
    		printf("--------------------------------------------");
    		printf("
     分区分配算法:
    	1 - 首次适应算法(FF)
    	2 - 循环首次适应算法(CFF)
    	0 - 退出(Exit)
     
    ");
    		printf("--------------------------------------------
    ");
    		printf("请选择相应的算法(0-2):");
    		scanf("%d",&choice);
    		if (0==choice) 
    			exit(0);
    	}while(0>choice&&2<choice);
    	while(1)
    	{
    		printf("--------------------------------------------");
    		printf("
     菜单:
    	1 - 申请空间(Allocation)
    	2 - 回收空间(Reclaim)
    	0 - 退出(Exit) 
    ");
    		printf("--------------------------------------------
    ");
    		printf("请选择你的操作(0-2):");
    		scanf("%d",&a);
    		switch(a)
    		{
    			
    			case 0:
    				exit(0);  //a=0,程序结束
    			
    			case 1:  //a=1,分配主存空间
    				printf("请输入作业标号和所需要申请的空间:");
    				scanf("%*c%c%f",&pn,&xk);
    				allocate(pn,xk,choice);
    				display(free_partition,choice);
    				break;
    		
    			case 2:	//a=2,回收主存空间
    				printf("请输入你想回收的作业的相应标号:");
    				scanf("%*c%c",&pn);
    				reclaim(pn,choice);
    				display(free_partition,choice);
    				break;
    			default:printf("出错了,没有此项选择!  
    ");
    		}
    	}
    }
    

      六、实验截图

  • 相关阅读:
    UDP通讯demo
    Git 修改已提交的commit注释
    git merge和git merge --no-ff的区别
    git常用命令
    阿里云域名证书申请流程
    IntelliJ IDEA常用快捷键总结
    宿主CentOS7环境下docker中rabbitMQ的安装
    宿主CentOS7环境下docker中nginx的安装
    docker常用命令
    CentOS7环境下docker安装
  • 原文地址:https://www.cnblogs.com/xyz--123/p/5586155.html
Copyright © 2020-2023  润新知