固定分区存储管理(C语言)

固定分区存储管理(C语言)(含代码)

课程

操作系统
代码下载:
https://download.csdn.net/download/qq_48499842/87579330

实验名称

固定分区存储管理

实验要求

1、 实现固定分区存储管理方式下存储空间的分配和回收。
2、 已知当前内存分配表如下

分区号 起始地址 长度 状态
1 10KB 30KB Job5
2 40KB 7KB 0
3 47KB 50KB Job2

3、 有若干个作业申请或释放内存空间,请求如下:
(1) 作业Job6请求资源,申请20KB大小的内存空间;
(2) 作业Job7请求资源,申请5KB大小的内存空间;
(3) 作业Job2执行完毕,释放空间。
4、编写程序实现相应存储空间的分配和回收,若请求成功,修改主分配表,并输出该表,若请求不能满足,输出“分配失败”。

实验目的

通过编写固定分区存储管理的模拟程序,加深对操作系统存储管理功能中固定分区管理方式、主存分配表等相应知识的理解。

源代码

#include "stdio.h"
int begin[]={
    
    10,40,47};	//起始地址 
int len[]={
    
    30,7,50};	//长度 
int t[]={
    
    5,0,2};	//状态 
int n,m,k; // 进程号、完成进程号、申请的资源空间大小 
char s,c; //用于接受判断是否继续时输入的字符变量 

//申请资源 
void p()
{
    
    
	int flag=0;		//标记1 
	int flag2=0;	//标记2 
	while(flag==0) 
	{
    
     
		int sum=0;	//累加器 
		for(int i=0;i<3;i++)
		{
    
    
			if(t[i]!=0)		
				sum=sum+1;
		} 
		if(sum==3)	//空间满了,跳出循环,进入释放 
		{
    
    
			printf("已经满了!不能再添加进程了!\n");
			break;
		} 
		printf("请输入需要申请资源的进程号:"); 
		scanf("%d",&n);
		while(flag2==0) 
		{
    
    
			int sum=0;	//累加器 
			for(int i=0;i<3;i++)
			{
    
    
				sum=sum+1;
				if(n==t[i])		//判断进程是否存在 
				{
    
    
					printf("该进程%d已存在!\n",n);
					printf("请重新输入需要申请资源的进程号:"); 
					scanf("%d",&n);
					sum=0; //归零,重新计算 
				}
			}
			if(sum==3)	break;//没有重复的进程存在 
		} 
		printf("请输入需要申请资源的内存空间:"); 
		scanf("%d",&k);
		for(int i=0;i<3;i++)
		{
    
    
			if(t[i]==0)	//状态为0 
			{
    
    
				if(k<=len[i])	//申请的资源小于等于分配的空间大小 
		 		{
    
    
				 	t[i]=n; 
		 			printf("申请成功!\n");
   					//申请成功打印新的分配表 
   					printf("分区号  起始地址   	长度  	状态\n");
   					for(int i=0;i<3;i++)
   					{
    
    
       					if(t[i]==0) //输出格式 
				   		{
    
    
					       	printf("%d 	   %d KB	%d KB	 %d \n",i+1,begin[i],len[i],t[i]);
		       			}else
					   	{
    
    
			       			printf("%d 	   %d KB	%d KB	job%d \n",i+1,begin[i],len[i],t[i]);
			       		}
   					}
		 		} 
		 		else	//申请的资源大于分配的空间大小
				{
    
    
					printf("分配失败!\n");  
				}
			} 
			 
		}
		printf("是否继续申请资源(y/n):"); 
		scanf("%s",&s);
		if(s=='n')
		{
    
    
			flag=1;
		}
	} 	 
}
 
//释放 
void v()
{
    
    
	int flag=0;		
	while(flag==0)
	{
    
    	
		printf("请输入需要执行完成的进程号:");
		scanf("%d",&m);		
		int sum=0;
		int flag2=0;
		while(flag2==0) 
		{
    
    
			for(int i=0;i<3;i++)
			{
    
    
				if(t[i]!=m)	
				{
    
    
					sum=sum+1;
				}							
			}
			if(sum==3)
			{
    
    
				sum=0;
				printf("进程不存在!\n"); 
				printf("请重新输入需要执行完成的进程号:");
				scanf("%d",&m);				
			}else
			{
    
    
				flag2=1;				
			}
		}
		for(int i=0;i<3;i++)
		{
    
    
			if(m==t[i])  //进程存在则释放 
			{
    
    
				t[i]=0;
				//释放成功打印新的分配表 
				printf("释放成功!\n");
				printf("分区号  起始地址   	长度  	状态\n");
				for(int i=0;i<3;i++)
				{
    
    
					if(t[i]==0) //输出格式 
			   		{
    
    
				       	printf("%d 	   %d KB	%d KB	 %d \n",i+1,begin[i],len[i],t[i]);
	       			}else
				   	{
    
    
		       			printf("%d 	   %d KB	%d KB	job%d \n",i+1,begin[i],len[i],t[i]);
		       		}
		   		}
	   			printf("是否继续需要执行完成的进程号(y/n):"); 
				scanf("%s",&s);
				if(s=='n')
				{
    
    
					flag=1;
				} 
			}
		}
	
	}
} 

主程序(test01):

int main()
{
    
    
	//分配表 
	printf("已知当前内存分配表如下\n");
	printf("分区号  起始地址   	长度  	状态\n");
	for(int i=0;i<3;i++)
   	{
    
    
       	if(t[i]==0) //输出格式 
   		{
    
    
	       	printf("%d 	   %d KB	%d KB	 %d \n",i+1,begin[i],len[i],t[i]);
		}else
	   	{
    
    
   			printf("%d 	   %d KB	%d KB	job%d \n",i+1,begin[i],len[i],t[i]);
   		}
   	}
	p();
	v();	 	
}

流程图

整体模型图
在这里插入图片描述

P()模块流程图:
在这里插入图片描述

V()模块流程图
在这里插入图片描述

实验结果

在这里插入图片描述

实验总结

通过此次实验,加深了对操作系统存储管理功能中的固定分区管理方式、主存分配表等相应知识的理解,对操作系统怎么实现存储管理有了初步的认识,固定分区的优势是实现简单,只需要极少的操作系统开销,它也有很多的缺点,例如:有部分碎片,对内存的使用不充分。活动进程的最大数目也是固定的。

教师评语

猜你喜欢

转载自blog.csdn.net/qq_48499842/article/details/124449198