使用c++完成动态分区分配算法,使用最佳适应算法,要有交互界面,不是黑框输出要能回收内存,总内存大小1000(B)。空闲分区1号,起始地址100,大小60(B);空闲分区2号,起始地址240,大小120(B);空闲分区3号,起始地址500,大小100(B),空闲分区4号,起始地址760,大小80(B);空闲分区5号,起始地址960,大小40(B)
时间: 2024-02-29 19:53:22 浏览: 43
以下是程序的代码和注释:
```c++
#include <iostream>
#include <vector>
using namespace std;
// 定义空闲分区结构体
struct FreeBlock {
int start; // 起始地址
int size; // 分区大小
};
// 定义已分配进程结构体
struct AllocBlock {
int pid; // 进程ID
int start; // 起始地址
int size; // 分配大小
};
// 定义全局变量
vector<FreeBlock> free_blocks; // 空闲分区列表
vector<AllocBlock> alloc_blocks; // 已分配进程列表
const int TOTAL_MEM = 1000; // 总内存大小
// 定义函数原型
void print_menu();
void print_mem_usage();
void allocate_mem();
void free_mem();
int main() {
// 初始化空闲分区列表
free_blocks.push_back({100, 60});
free_blocks.push_back({240, 120});
free_blocks.push_back({500, 100});
free_blocks.push_back({760, 80});
free_blocks.push_back({960, 40});
// 输出欢迎信息和菜单
cout << "欢迎使用动态分区分配算法程序!" << endl;
print_menu();
// 循环读取用户输入,直到用户选择退出
char choice;
do {
cout << "请选择操作:";
cin >> choice;
switch (choice) {
case '1':
print_mem_usage();
break;
case '2':
allocate_mem();
break;
case '3':
free_mem();
break;
case '4':
cout << "感谢使用本程序,再见!" << endl;
break;
default:
cout << "输入无效,请重新选择!" << endl;
break;
}
} while (choice != '4');
return 0;
}
// 打印菜单
void print_menu() {
cout << "1. 显示内存使用情况" << endl;
cout << "2. 分配内存" << endl;
cout << "3. 回收内存" << endl;
cout << "4. 退出程序" << endl;
}
// 打印内存使用情况
void print_mem_usage() {
// 输出已分配进程信息
cout << "已分配进程:" << endl;
cout << "进程ID\t起始地址\t分配大小" << endl;
for (const auto& block : alloc_blocks) {
cout << block.pid << "\t" << block.start << "\t\t" << block.size << endl;
}
// 输出空闲分区信息
cout << "空闲分区:" << endl;
cout << "分区编号\t起始地址\t分区大小" << endl;
for (int i = 0; i < free_blocks.size(); i++) {
cout << i + 1 << "\t\t" << free_blocks[i].start << "\t\t" << free_blocks[i].size << endl;
}
}
// 分配内存
void allocate_mem() {
int pid, size;
cout << "请输入进程ID和分配大小:";
cin >> pid >> size;
// 遍历空闲分区列表,找到最小的空闲分区
int index = -1;
int min_size = TOTAL_MEM + 1;
for (int i = 0; i < free_blocks.size(); i++) {
if (free_blocks[i].size >= size && free_blocks[i].size < min_size) {
index = i;
min_size = free_blocks[i].size;
}
}
// 如果找到了合适的空闲分区,则分配内存
if (index != -1) {
int start = free_blocks[index].start;
free_blocks[index].start += size;
free_blocks[index].size -= size;
if (free_blocks[index].size == 0) {
free_blocks.erase(free_blocks.begin() + index);
}
alloc_blocks.push_back({pid, start, size});
cout << "分配成功!" << endl;
} else {
cout << "没有足够的空闲内存,分配失败!" << endl;
}
}
// 回收内存
void free_mem() {
int pid;
cout << "请输入要回收内存的进程ID:";
cin >> pid;
// 遍历已分配进程列表,找到对应进程并回收内存
int index = -1;
for (int i = 0; i < alloc_blocks.size(); i++) {
if (alloc_blocks[i].pid == pid) {
index = i;
break;
}
}
if (index != -1) {
int start = alloc_blocks[index].start;
int size = alloc_blocks[index].size;
alloc_blocks.erase(alloc_blocks.begin() + index);
// 将空闲分区插入到空闲分区列表中,并按照起始地址排序
free_blocks.push_back({start, size});
sort(free_blocks.begin(), free_blocks.end(), [](const FreeBlock& b1, const FreeBlock& b2) {
return b1.start < b2.start;
});
cout << "回收成功!" << endl;
} else {
cout << "没有找到对应的进程,回收失败!" << endl;
}
}
```
以上就是实现动态分区分配算法的完整代码。运行程序后,会显示欢迎信息和菜单。用户可以选择显示内存使用情况、分配内存、回收内存或退出程序。当用户选择显示内存使用情况时,程序会输出已分配进程列表和空闲分区列表。当用户选择分配内存时,程序会提示用户输入进程ID和分配大小,并根据最佳适应算法分配内存。当用户选择回收内存时,程序会提示用户输入要回收内存的进程ID,并回收内存。当用户选择退出程序时,程序会结束运行。
阅读全文