c/c++模拟实现基本分页存储管理方式下内存空间的分配和回收。实验内容如下: 内存空间的初始化——可以由用户输入初始内存空间各个物理块情况。(用二维矩阵的方式按物理块号,逐行给出每个物理块的状态,1——表示已分配,0——表示未分配,并能够将行标、列标转换为对应的物理块号,以查看或修改每一个块的状态,要求:初始时部分物理块已分配)。 基本分页的分配过程:由用户输入作业号和作业的大小(这里的大小是逻辑页面数),实现分配过程:空间充足,分配,修改状态矩阵的相应位置的值(值由0转变为1),并用专门的数据结构记录下该作业占用的物理块的块号,以备删除作业时回收空间。 作业空间的回收:用户输入作业号,实现分区回收(通过相应的数据结构找到该作业占有的物理块号,将块号转变成对应的行标、列标,将对应位置的值由1转变成0就完成了回收)。 分区的显示:任何时刻,可以查看当前内存的情况(显示记录内存情况的矩阵的值)。 实
时间: 2023-11-22 09:53:54 浏览: 238
基于分页管理存储(符合老师要求,你懂得!)
现在让我们逐步实现这个内存分页存储管理的程序。
首先,我们需要定义一个二维矩阵来表示内存中的物理块,每个物理块可以是已分配或未分配的。我们可以使用一个二维数组来表示这个矩阵,其中0表示未分配,1表示已分配。
```c++
const int N = 10; // 内存块数
int memory[N][N]; // 内存矩阵
```
接下来,我们需要实现内存空间的初始化。我们可以让用户输入初始内存空间各个物理块情况,然后按物理块号逐行给出每个物理块的状态。我们可以使用一个循环来读取每个物理块的状态,并将其存储到内存矩阵中。
```c++
// 初始化内存矩阵
void init() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> memory[i][j];
}
}
}
```
现在,我们需要实现基本分页的分配过程。这个过程需要用户输入作业号和作业的大小,然后检查内存中是否有足够的未分配物理块来分配作业。如果有足够的物理块,我们就将这些物理块标记为已分配,并将它们的块号存储到一个数据结构中,以备删除作业时回收空间。
```c++
// 分配内存空间
void allocate() {
int job_id, size;
cout << "请输入作业号和作业大小:";
cin >> job_id >> size;
// 检查内存是否有足够的空间
int count = 0;
vector<pair<int, int>> blocks; // 记录分配的物理块
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (memory[i][j] == 0) {
count++;
blocks.push_back(make_pair(i, j));
if (count == size) {
// 分配成功,将物理块标记为已分配
for (auto p : blocks) {
memory[p.first][p.second] = 1;
}
cout << "分配成功,作业号为" << job_id << endl;
return;
}
} else {
count = 0;
blocks.clear();
}
}
}
// 分配失败
cout << "内存空间不足,分配失败" << endl;
}
```
接下来,我们需要实现作业空间的回收。用户输入作业号后,我们需要从保存块号的数据结构中找到该作业占有的物理块号,然后将这些物理块标记为未分配。
```c++
// 回收内存空间
void deallocate() {
int job_id;
cout << "请输入作业号:";
cin >> job_id;
// 找到该作业占有的物理块
vector<pair<int, int>> blocks;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (memory[i][j] == 1 && get_block_id(i, j) == job_id) {
blocks.push_back(make_pair(i, j));
}
}
}
// 将物理块标记为未分配
for (auto p : blocks) {
memory[p.first][p.second] = 0;
}
cout << "回收成功,作业号为" << job_id << endl;
}
```
最后,我们需要实现分区的显示。我们可以按照物理块的编号逐行输出内存矩阵的状态,以显示当前内存的情况。
```c++
// 显示内存矩阵
void display() {
cout << "物理块\t状态" << endl;
for (int i = 0; i < N; i++) {
cout << i << "\t";
for (int j = 0; j < N; j++) {
cout << memory[i][j] << " ";
}
cout << endl;
}
}
```
完整代码如下:
阅读全文