三、实验任务 用高级语言模拟实现基本分页存储管理, 实现以下功能: 1. 内存空间的初始化——可以由用户输入初始内存空间各个物理块情况。(用二维矩阵的方式按物理块号,逐行给出每个物理块的状态,1——表示已分配,0——表示未分配,并能够将行标、列标转换为对应的物理块号,以查看或修改每一个块的状态,要求:初始时部分物理块已分配); 2. 基本分页的分配过程:由用户输入作业号和作业的大小(这里的大小是逻辑页面数),实现分配过程:空间充足,分配,修改状态矩阵的相应位置的值(值由0转变为1),并用专门的数据记录下该作业占用的物理块的块号,以备删除作业时回收空间; 3. 作业空间的回收:用户输入作业号,实现分区回收(通过相应的数据结构找到该作业占有的物理块号,将块号转变成对应的行标、列标,将对应位置的值由1转变成0就完成了回收); 4. 分区的显示:任何时刻,可以查看当前内存的情况(显示记录内存情况的矩阵的值)。 四、实验要求 1. 测试数据可以随机输入或从文件中读入。 2. 编程语言可以使用C,C++,JAVA或其他语言。 3. 模拟程序要考虑以下情况: (1)内存空间不足的情况,要有相应的显示; (2)作业不能同名,但是删除后可以再用这个名字; (3)作业空间回收是输入作业名,回收相应的空间,如果这个作业名不存在,也要有相应的提示。
时间: 2023-12-05 10:06:36 浏览: 44
很好,这是一个实现基本分页存储管理的程序,需要实现内存空间初始化、分配过程、回收空间和分区的显示等功能。
下面是一个简单的C++实现,主要使用了二维数组来表示内存空间的状态矩阵,并通过记录每个作业占用的物理块的块号来实现作业的分配和回收。
```cpp
#include <iostream>
#include <vector>
using namespace std;
const int MAX_BLOCK = 100; // 内存总共有100个块
int memory[MAX_BLOCK][2]; // 内存状态矩阵,第一列记录块的状态(0表示未分配,1表示已分配),第二列记录占用该块的作业编号(-1表示未占用)
void init_memory() {
// 初始化内存状态矩阵
for (int i = 0; i < MAX_BLOCK; i++) {
if (i < 20 || i >= 80) {
memory[i][0] = 1; // 前20块和后20块已分配
} else {
memory[i][0] = 0; // 其他块未分配
}
memory[i][1] = -1; // 初始时所有块都未被占用
}
}
void display_memory() {
// 显示内存状态矩阵
cout << "Memory Status:" << endl;
for (int i = 0; i < MAX_BLOCK; i++) {
cout << i << ": " << memory[i][0] << " ";
if (memory[i][1] != -1) {
cout << memory[i][1];
}
cout << endl;
}
}
void allocate_memory(int job_id, int job_size) {
// 分配作业空间
int allocated = 0;
vector<int> allocated_blocks; // 记录分配的物理块号
for (int i = 0; i < MAX_BLOCK && allocated < job_size; i++) {
if (memory[i][0] == 0 && memory[i][1] == -1) {
// 找到未分配的块,分配给该作业
memory[i][0] = 1;
memory[i][1] = job_id;
allocated_blocks.push_back(i);
allocated++;
}
}
if (allocated == job_size) {
// 分配成功,输出分配的物理块号
cout << "Job " << job_id << " allocated " << allocated << " blocks:";
for (int i = 0; i < allocated_blocks.size(); i++) {
cout << " " << allocated_blocks[i];
}
cout << endl;
} else {
// 分配失败,回收已分配的块
for (int i = 0; i < allocated_blocks.size(); i++) {
memory[allocated_blocks[i]][0] = 0;
memory[allocated_blocks[i]][1] = -1;
}
cout << "Not enough memory for job " << job_id << endl;
}
}
void free_memory(int job_id) {
// 回收作业空间
bool found = false;
for (int i = 0; i < MAX_BLOCK; i++) {
if (memory[i][1] == job_id) {
// 找到该作业占用的块,回收它们
memory[i][0] = 0;
memory[i][1] = -1;
found = true;
}
}
if (found) {
cout << "Job " << job_id << " freed" << endl;
} else {
cout << "Job " << job_id << " not found" << endl;
}
}
int main() {
init_memory();
display_memory();
// 分配作业
allocate_memory(1, 5);
allocate_memory(2, 10);
display_memory();
// 回收作业
free_memory(1);
display_memory();
// 再次分配作业
allocate_memory(3, 6);
display_memory();
return 0;
}
```
这个程序中,我们使用了`init_memory()`函数来初始化内存状态矩阵,使用`display_memory()`函数来显示内存状态矩阵,使用`allocate_memory(int job_id, int job_size)`函数来分配作业空间,使用`free_memory(int job_id)`函数来回收作业空间。
同时,我们还定义了一个全局变量`memory`来表示内存状态矩阵,其中`memory[i][0]`表示第`i`块的状态,`memory[i][1]`表示占用该块的作业编号。当一个作业占用多个块时,我们记录这些块的物理块号并在回收空间时使用。
你可以根据自己的需要修改这个程序,并在输入测试数据后运行它,观察内存状态矩阵的变化,以验证程序的正确性。