操作系统——分区式存储管理

 

头文件:(类可以用结构体代替)

busylink.h

class busylink//进程
{
public:
	char name;//进程名称
	int len;//进程长度
	busylink* next;
};

freelink.h

class freelink//内存分区情况
{
public:
	char name;
	int len;//分区长度
	int address;//分区起始位置
	freelink* next;
};

源文件:

// 分区管理.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
using namespace std;
#include"busylink.h"//引用进程类
#include"freelink.h"//引用分区类


//初始化系统状态
//系统分区地址从0开始
busylink* busy_head = new busylink();
busylink* busy_tail = new busylink();
freelink* free_head = new freelink();

//向分区中放入进程,每次放入的都是队列顶端进程
//最坏适应,每次都找最大的块进行分割

//进程队列中取出
void delBusy()
{
	busy_head->next = busy_head->next->next;
}
void addFree()
{
	freelink* free = free_head;
	freelink* free_temp = new freelink();//记录最大空闲分区
	int temp = 0;
	while (true)
	{
		if (free->next==free_head)
		{
			break;
		}
		if (free->next->name == NULL&&free->next->len>temp)
		{
			free_temp = free;
			temp = free->next->len;
		}
		free = free->next;
	}
	//判段最大区间是否可以放的下进程
	if (free_temp->next->len > busy_head->next->len)
	{
		//分割区间
		//现在free_temp是最大空闲分区的前一个分区
		freelink* target = new freelink();
		target->len = busy_head->next->len;//分区长度
		target->address = free_temp->address + free_temp->len;//分区起始位置为前一个节点长度加起始位置
		target->name = busy_head->next->name;//分区进程名
		free_temp->next->len = free_temp->next->len - target->len;
		free_temp->next->address = target->address + target->len;
		target->next = free_temp->next;
		free_temp->next = target;
		delBusy();
	}
	else if (free->next -> len == busy_head->next->len)
	{
		//空闲区间长度正好相等直接修改空闲区间名称
		free->next->name = busy_head->next->name;
		delBusy();
	}
	else
	{
		cout << "该进程放不下去啊" << endl;
	}
	
}
//删除分区中的进程
void delFreeBusy(char name)//进程名暂时不考虑空闲分区合并
{
	freelink* free = free_head;
	while (true)
	{
		if (free->next == free_head)
		{
			break;
		}
		if (free->name == name)
		{
			free->name = NULL;
		}
		free = free->next;
	}
}
//向进程队列中插入进程
void addBusy(char name,int len)
{
	busylink* busy = busy_head;
	while (true)
	{
		if (busy->next == busy_tail)
		{
			break;
		}
		busy = busy->next;
	}
	busylink* Busy = new busylink();
	Busy->len = len;
	Busy->name = name;
	Busy->next = busy->next;
	busy->next = Busy;
}

//输出分区中的所有空闲分区
void out(string time)
{
	cout << time << "时间后" << endl;
	freelink* free = free_head;
	while (true)
	{
		if (free->next == free_head)
		{
			break;
		}
		if (free->next->name == NULL)
		{
			cout << "起始位置" << free->next->address << "长度" << free->next->len << endl;
		}
		free = free->next;
	}
}
void start()
{
	//分区单向循环列表
	//分区链表头中放系统占用内存
	freelink* free = new freelink();
	free->address = 64;
	free->len = 640 - 64;
	free->name = NULL;
	free->next = free_head;
	free_head->name = 'S';
	free_head->len = 64;
	free_head->address = 0;
	free_head->next = free;
	busy_head->next = busy_tail;
	//向队列中插入进程信息
	addBusy('A', 8);
	addBusy('B', 16);
	addBusy('C', 64);
	addBusy('D', 124);
	addBusy('E', 50);
}
void outbusy()
{
	busylink* busy = busy_head;
	while (true)
	{
		if (busy->next == busy_tail)
		{
			break;
		}
		cout << busy->next->name <<1<< endl;
		busy = busy->next;
	}
}
int main()
{
	start();
	//t1时间放入分区中的有A、B、C、D
	addFree();
	addFree();
	addFree();
	addFree();
	out("t1");
	//t2时间C完成
	delFreeBusy('C');
	out("t2");
	//t3时间E进入
	addFree();
	out("t3");
	//t4时间D出
	delFreeBusy('D');
	out("t4");
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值