#include<iostream>
#include <vector>
#define MAX 640
using namespace std;
struct work
{
int id;
int size;
};
struct memory
{
int front_number; //前一个的序列号
int number; //序号
int id; //占用程序的id 0为未占用
bool flag;//0为未被占用,可被回收
int size; //大小
};
work process1 = { 1,130 };
work process2 = { 2,60 };
work process3 = { 3,100 };
work process4 = { 4,200 };
work process5 = { 5,140 };
work process6 = { 6,60 };
work process7 = { 7,50 };
struct memory M[2] =
{
{0,0,0,1,0},
{0,MAX,0,0,MAX}
};//{0,0,0,1,0}是为了凑数,存储的时候从M[1]开始存储,输出也从M[1]开始输出。因为数组是从0算起的,这样的话可以让数组从1算起,与id对应上,方便思考。flag设为1表示本区域不可被回收
vector<memory> M_queue;
memory temp;
int chose;
void M_merge(int mer_id) //合并
{
if ((mer_id < M_queue.size() - 1) && (M_queue[mer_id + 1].flag == 0))//本区为回收区,下面为空闲区
{
M_queue[mer_id + 1].size += M_queue[mer_id].size;
M_queue[mer_id + 1].front_number = M_queue[mer_id].front_number;
M_queue.erase(M_queue.begin() + mer_id);//erase为根据位置删除元素
}
if (M_queue[mer_id - 1].flag == 0)//本区为回收区,上面为空闲区
{
M_queue[mer_id - 1].size += M_queue[mer_id].size;
M_queue[mer_id - 1].number = M_queue[mer_id].number;
M_queue.erase(M_queue.begin() + mer_id);
}
}
void M_print()
{
cout << "-----------------------------------" << endl;
cout << "前序号\t序号\t程序ID\t内存大小\t标志" << endl;
for (int i = 1; i < M_queue.size(); i++)
cout << M_queue[i].front_number << "\t" << M_queue[i].number << "\t" << M_queue[i].id << "\t" << M_queue[i].size << "\t\t" << M_queue[i].flag << endl;
cout << "-----------------------------------" << endl;
cout << endl << endl;
}
void alloc(work p1)
{
if (chose == 1) //首次适应算法
{
for (int i = 1; i < M_queue.size(); i++)
{
if ((M_queue[i].flag == 0) && p1.size < M_queue[i].size)
{
temp.flag = 1;
temp.id = p1.id;
temp.size = p1.size;
temp.front_number = M_queue[i].front_number;
temp.number = temp.front_number + temp.size;
M_queue[i].front_number = temp.number;
M_queue[i].size -= temp.size;
M_queue.insert(M_queue.begin() + i, temp);//insert为在指定位置插入元素
break;
}
}
}
else if (chose == 2) //最佳适应算法
{
int best_num = MAX;//记录目标空闲区大小
int best_i;//记录目标空闲区编号
for (int i = 1; i < M_queue.size(); i++)//找到只比p1.size大一点的空闲区,即目标空闲区
{
if ((M_queue[i].flag == 0) && (M_queue[i].size >= p1.size) && (M_queue[i].size <= best_num))
{
best_num = M_queue[i].size;
best_i = i;
}
}
temp.flag = 1;
temp.id = p1.id;
temp.size = p1.size;
temp.front_number = M_queue[best_i].front_number;
temp.number = temp.front_number + temp.size;
M_queue[best_i].front_number = temp.number;
M_queue[best_i].size -= p1.size;
M_queue.insert(M_queue.begin() + best_i, temp);
}
M_print();
}
void free(work p2)
{
int id;
for (int i = 0; i < M_queue.size(); i++)
{
if (p2.id == M_queue[i].id)
{
M_queue[i].flag = 0;
M_queue[i].id = 0;
id = i;
break;
}
}
M_merge(id);
M_print();
}
int main()
{
M_queue.push_back(M[0]);
M_queue.push_back(M[1]);
cout << "初始空闲区"<<endl;
M_print();
cout << "1、首次适应算法\n2、最佳适应算法\n请输入:";
cin >> chose;
if (chose != 1 && chose != 2)
{
cout << "error" << endl;
return 0;
}
cout << "alloc(process[1])" << endl;
alloc(process1);
cout << "alloc(process[2])" << endl;
alloc(process2);
cout << "alloc(process[3])" << endl;
alloc(process3);
cout << "free(process[2])" << endl;
free(process2);
cout << "alloc(process[4])" << endl;
alloc(process4);
cout << "free(process[3])" << endl;
free(process3);
cout << "free(process[1])" << endl;
free(process1);
cout << "alloc(process[5])" << endl;
alloc(process5);
cout << "alloc(process[6])" << endl;
alloc(process6);
cout << "alloc(process[7])" << endl;
alloc(process7);
cout << "free(process[6])" << endl;
free(process6);
return 0;
}
操作系统实验——动态分区分配方式的模拟
最新推荐文章于 2021-11-21 01:28:05 发布