#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;
}
动态分区分配(C++实现)
最新推荐文章于 2023-01-09 11:27:26 发布