《操作系统》实验报告-内存连续分配方式实验

1、实验目的用高级语言编写和调试一个内存连续分配模拟程序,以加深对内存连续分配算法的理解.

2、实验内容:内存连续分配动态分区分配流程图如下:

设计程序模拟内存动态分区分配流程,要求如下 

1、实验目的用高级语言编写和调试一个内存连续分配模拟程序,以加深对内存连续分配算法的理解.

2、实验内容:内存连续分配动态分区分配流程图如下:

设计程序模拟内存动态分区分配流程,要求如下 

1、 实现三项功能:分配内存、回收内存、显示内存使用情况 

2、 内存分配表建议使用顺序表或者单链表实现,逻辑结构如下图(a)

3、 分区分配算法建议使用最佳分配算法 

4、假设内存大小为1024K,起始地址为0,都可以被用户程序使用,size数值设为2K

1、 实现三项功能:分配内存、回收内存、显示内存使用情况 

2、 内存分配表建议使用顺序表或者单链表实现,逻辑结构如下图(a)

3、 分区分配算法建议使用最佳分配算法 

4、假设内存大小为1024K,起始地址为0,都可以被用户程序使用,size数值设为2K

 

3.源程序:

#include<bits/stdc++.h>
using namespace std;
struct PCB
{
	string name;
	int begin;
	int num;
	bool status;
};
vector<PCB> RAM;
void menu()
{
	printf("1. 分配内存\n");
	printf("2. 回收内存\n");
	printf("3. 显示内存使用情况\n");
	printf("4. 退出\n");
	printf("\n请输入选择: ");
}
void init()
{
	RAM.push_back({"空闲",0,1024,false});
}

void output()
{
	printf("\n\t分区号\t作业名\t起始地址\t分区大小\t状态\n");
	for(int i=0; i<RAM.size(); i++)
	{
		cout<<"\t"<<i<<"\t"<<RAM[i].name<<"\t"<<RAM[i].begin<<"\t\t"<<RAM[i].num<<"\t\t"<<RAM[i].status<<endl;
	}
	printf("\n\n");
}
void Distribution()
{
	string name;
	int num;
	printf("作业名(字符串): ");
	cin>>name;
	printf("作业占内存大小:");
	scanf("%d",&num);
	//开始分区,从开始找,状态为0并且分区大小
	int f = 0;
	for(int i = 0; i < RAM.size() ; i++)
	{
		if(RAM[i].status == false && RAM[i].num>=num)
		{
			PCB p = {name,RAM[i].begin,num,true};
			RAM[i].begin = p.num + p.begin;
			RAM[i].num = RAM[i].num - num;
			RAM.insert(RAM.begin()+i,p);
			f = 1;
			break;
		}
	}
	output();
	if(f == 0) //没找到
		printf("\t请求失败!空间不够!\n\n");
	else
		printf("\t请求成功!\n\n");
}

void Recover()
{
	string name;
	printf("输入要回收分区的作业名(字符串): ");
	cin>> name;
	for(int i=0; i<RAM.size(); i++)
	{
		if(RAM[i].name == name) //找到要回收的作业
		{
			if(i == 0) // 如果第一个单独
			{
				if(RAM[i+1].status == true)
				{
					RAM[i].name = "空闲";
					RAM[i].status = false;
					break;
				}
				else
				{
					RAM[i].status = false;
					RAM[i].name = "空闲";
					RAM[i].num += RAM[i+1].num;
					RAM.erase(RAM.begin()+1);
					break;
				}
			}
			if(RAM[i-1].status == true && RAM[i+1].status == true) //左右都为 1 ,直接回收
			{
				RAM[i].name = "空闲";
				RAM[i].status = false;
				break;
			}
			else if(RAM[i-1].status == false && RAM[i+1].status == true)
			{
				RAM[i-1].num += RAM[i].num;
				RAM.erase(RAM.begin()+i);
				break;
			}
			else if(RAM[i-1].status == true && RAM[i+1].status == false)
			{
				RAM[i].name = "空闲";
				RAM[i].status = false;
				RAM[i].num += RAM[i+1].num;
				RAM.erase(RAM.begin()+i+1);
				break;

			}
			else if(RAM[i-1].status == false && RAM[i+1].status == false)
			{
				//
				RAM[i-1].status = false;
				RAM[i-1].num += (RAM[i].num+RAM[i+1].num);
				RAM.erase(RAM.begin()+i);
				RAM.erase(RAM.begin()+i);
			}
		}
	}
	output();
//	for(int i=0; i<RAM.size(); i++)
//	{
//		cout<<"\t"<<RAM[i].name<<"\t"<<RAM[i].begin<<"\t"<<RAM[i].num<<"\t"<<RAM[i].status<<endl;
//	}
}
int main()
{
	int n;
	init();
	while(1)
	{
		menu();

		scanf("%d",&n);
		switch (n)
		{
			case 1:
				Distribution();
				break;
			case 2:
				Recover();
				break;
			case 3:
				output();
				break;
			case 4:
				exit(0);
				break;

		}
	}
}

 

4.测试数据

        分区号  作业名  起始地址        分区大小        状态

        0       q1      0               20              1

        1       q2      20              20              1

        2       q3      40              20              1

        3       q4      60              24              1

        4       空闲    84              940             0

 

运行结果:

分配内存

 

 

回收内存 

 

 

出现问题及解决方法

运行代码时VC不能运行,而DEV C++可以运行

考虑到可能是机房电脑VC版本太老,自行下载DEV来进行测试代码,分配内存回收内存都成功运行测试。

实验心得

成功运行测试内存连续分配方式实验,加上书本内容,切实了解了几种分配算法的各个特点及缺点,从而对实验的理解更加充实

 

  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值