分页存储方式管理模拟 C++实现
1.任务要求
目的:了解分页存储管理方式的原理和实现的基本过程。 设计要求:设计一个简单分页存储管理系统,要求实现以下功能。 (1) 定义分页的地址结构和页表结构。 (2) 对进程的逻辑地址空间、页表起址、给定的逻辑地址进行初始化。 (3) 实现从逻辑地址到物理地址的变换。 (4) 实现“主存空间的共享和保护”功能。 (5) 实现“主存扩充”虚拟功能。
2.代码实现
C++源码如下(编译环境:Mingw-w64/gcc 8.1.0):
//物理块:4KB; 物理块数:256;共享状态:1共享,0不共享;访问状态:1访问过,0未访问过
#include
#include
#include
#include
#include
using namespace std;
int init(); //初始化
int show_Share_Page(); //展示共享页表
int t = 1;
int p = -1; //clock算法指针
int q = 0;
int c = 0;
int ram_block_state[256]; //物理块分配状态
struct Pages_item { //页表项
int pages_num;
int ram_block_num;
int share_state; //1共享,0不共享
int position_state;//1在内存,0不在内存
int visit;//1最近被访问;0最近未被访问
};
struct share_page_item //共享页表项
{
int pro_id;
int pages_num;
int share_state;
};
vector Share_Page; //共享页表
class PCB
{
int id;
int page_item_sum;
int ram_block[5];
vector Page;
public:
PCB();
int show(); //展示页表
int inquiry(); //输入逻辑地址,并转化为物理地址
int clock(); //置换算法;
};
PCB::PCB()
{
id = t++;
int r = 0;
srand(time(0));
//分配进程物理块
for (int i = 0; i
int a = 0;
ram_block[i] = rand() % 0xff + 1;
if (ram_block_state[ram_block[i]] == 0)
{
ram_block_state[ram_block[i]] = 1;
break;
}
else
a++;
if (a == 256)
{
cout
r = 1;
break;
}
}
if (r == 1)
{
r = 0;
i--;
}
}
//分配进程页数
page_item_sum = rand() % 10 + 3;
for (int i = 0; i
b.pro_id = id;
b.pages_num = a.pages_num;
b.share_state = a.share_state;
Share_Page.push_back(b);
}
}
}
int PCB::show()
{
cout
cout hex >> a) || a
b = 1;
if (Page[i].position_state == 0)
{
int a = clock(); //选择出要置换的页面
int t = Page[a].ram_block_num;
Page[a].ram_block_num = Page[i].ram_block_num;
Page[i].ram_block_num = t;
Page[i].position_state = 1;
Page[a].position_state = 0;
}
ram_block_ = ram_block[Page[i].ram_block_num];
Page[i].visit = 1;
break;
}
if (b == 0)
{
cout
for (int i = 0; i
init();
PCB one;
PCB two;
int b = 0;
int c = 0;
while (1)
{
if (b == 0)
{
one.show();
two.show();
}
if (c == 0)
{
cout
two.inquiry();
b = 0;
c = 0;
}
else if (a == 3)
{
show_Share_Page();
b = 1;
c = 0;
}
else if (a == 4)
break;
else
{
cout |