动态分区分配(C++实现)

#include <iostream>
using namespace std;
const int MaxNumber = 100;
int FreePartition[MaxNumber];//空闲可用分区
int Partition[MaxNumber];//进程所需分区
int  PartitionNum, ProcessNum;
int n; //空闲分区个数
int m;//需要分配的进程个数
//首次适应算法
void FF() {
	//寻找大小能满足进程要求的分区
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			if (Partition[i] <= FreePartition[j]) {
				FreePartition[j]=0;
				cout << "第 " << i+1 << "个进程被分配给了分区 " << j << endl; break;
			}
			if (j == n - 1) {
				cout << "系统没有足够大的内存分配给进程 " << i << " ,内存分配失败!" << endl;
			}
		}
	}
}
//循环首次适应算法
void NF() {
	int lastUsed = 0;
	int count = 0;
	bool check[100];
	while (count < m) {
		if (lastUsed == n) {
			lastUsed -= n;
		}
		for (int i = lastUsed; i < (n + lastUsed); i++) {
			if (i < n) {
				if (FreePartition[i] >= Partition[count]) {
					FreePartition[i] =0;
					cout << "空闲分区" << i << "分配了" << Partition[count] << "给进程" << count << endl;
					lastUsed = i+1;
					break;
				}
			}
			else {
				if (FreePartition[i - n] >= Partition[count]) {
					FreePartition[i - n]=0;
					cout << "空闲分区" << i - n << "分配了" << Partition[count] << "给进程" << count << endl;
					lastUsed = i+1; break;
				}
			}
			//没有足够大的进程
			if (i == n + lastUsed - 1) {
				cout << "系统没有足够大的内存分配给进程" << count << ",内存分配失败!" << endl;
			}
		}
		count++;
	}
}
//最佳适应算法
void BF() {	
	int count = 0;
	int *Number = new int[n];//记录每个分区内存和进程的内存差
	//让内存最小的进程先判断
	int *Temp = new int[m];
	for (int i = 0; i < m; i++)
	{
		Temp[i] = Partition[i];
	}
	int *number = new int[m];
	for (int i = 0; i < m; i++)
	{
		number[i] = i;
	}
	for (int i = 0; i < m; i++)
	{
		for (int j = i + 1; j < m; j++)
		{
			if (Temp[i] > Temp[j]) {
				int num = 0;
				num = Temp[i];
				Temp[i] = Temp[j];
				Temp[j] = num;

				num = number[i];
				number[i] = number[j];
				number[j] = num;
			}
		}
	}

	while (count < m) {
		//为进程分配内存
		for (int i = 0; i < n; i++) {
			Number[i] = (FreePartition[i] - Partition[number[count]]) >= 0 ? (FreePartition[i] - Partition[number[count]]) : 10000;//如果分区内存大于进程所需,设为10000表示无效分区
		}
		int a = 0;//记录最合适分区的位置
		for (int i = 1; i < n; i++)
		{
			//只需要求数组第一个,即相差最小的
			if (Number[i] < Number[0]) {
				int num = 0;
				a = i;
				num = Number[i];
				Number[i] = Number[0];
				Number[0] = num;
			}

		}
		if (FreePartition[a] >= Partition[number[count]]) {
			FreePartition[a] = 0;
			cout << "分区" << a << "分配给了进程" << number[count] << endl;
		}
		else {
			cout << "系统没有足够大的内存分配给进程 " << number[count] << " ,内存分配失败!" << endl;
		}
		count++;
	}
}
//最坏适应算法
void WF() {
	int count = 0;
	int *Number = new int[n];//记录每个分区内存和进程的内存差
	//让内存最大的进程先判断
	int *Temp = new int[m];
	for (int i = 0; i < m; i++)
	{
		Temp[i] = Partition[i];
	}
	int *number = new int[m];
	for (int i = 0; i < m; i++)
	{
		number[i] = i;
	}
	for (int i = 0; i < m; i++)
	{
		for (int j = i+1; j < m; j++)
		{
			if (Temp[i] < Temp[j]) {
				int num = 0;
				num = Temp[i];
				Temp[i] = Temp[j];
				Temp[j] = num;

				num = number[i];
				number[i] = number[j];
				number[j] = num;
			}
		}
	}

	while (count < m) {
		//为进程分配内存
		for (int i = 0; i < n; i++) {
			Number[i] = (FreePartition[i] - Partition[number[count]]) >= 0 ? (FreePartition[i] - Partition[number[count]]) : -1;//如果分区内存小于进程所需,设为-1表示无效分区
		}
		int a = 0;//记录最合适分区的位置
		for (int i = 1; i < n; i++)
		{
			//只需要求数组第一个,即相差最大的
			if (Number[i]>Number[0]) {
				int num = 0;
				a = i;
				num = Number[i];
				Number[i] = Number[0];
				Number[0] = num;
			}

		}

		if (FreePartition[a] >= Partition[number[count]]) {
			FreePartition[a] = 0;
			cout << "分区" << a << "分配给了进程" << number[count] << endl;
		}
		else {
			cout << "系统没有足够大的内存分配给进程 " << number[count] << " ,内存分配失败!" << endl;
		}
		count++;
	}
}

void input() {
	cout << "请输入空闲分区个数:" << endl;
	cin >> n;
	cout << "请输入空闲分区大小:" << endl;
	for (int i = 0; i < n; i++) {
		cin >> FreePartition[i];
	}
	cout << "请输入进程个数:" << endl;
	cin >> m;
	cout << "请输入进程所需分区大小:" << endl;
	for (int i = 0; i < m; i++) {
		cin >> Partition[i];
	}
}

int main() {
	input();
	int choice = 0;
input:	
	cout << "请选择算法:(1.首次适应,2.循环首次适应,3.最佳适应,4.最坏适应)" << endl;
	cin >> choice;
	switch (choice)
	{
	case 1: FF(); break;
	case 2: NF(); break;
	case 3: BF(); break;
	case 4: WF(); break;
	default: cout << "请输入正确的数字"<<endl; 
		     goto  input; 
			 break;
	} 
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值