编写程序, 由必要的数据结构、 主函数、 页面置换算法函数和显示内存使用函数构成,
模拟实现请求分页管理中至少两种页面替换算法。要求程序运行时:
(1)显示主菜单,包含初始化内存、随机生成页面访问序列、模拟进程执行过程、显示内
存使用情况、显示进程页面状态。
(2)接收用户输入参数:可用内存容量、页面长度(即主存块大小)、进程个数、进程
长度(页面数)等。
(3) 可模拟一个进程的动态执行过程中各页面的换入换出;也可模拟多个进程并发过程
中各进程页面访问过程中的换入换出(采用固定分配、局部置换)。
(4)每个页面访问可用交互式进行,也可按照事先随机生成页面访问序列自动进行。
(5)每个页面访问的结果以命中、直接装入和替换来记录。
(6) 从 OPT、FIFO、LRU、LFU、SCR、Clock、改进的 Clock 等页面置换算法中选择两种
实现
程序实现的是单进程,FIFO和LRU置换算法
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <algorithm>
#include <pthread.h>
#include <malloc.h>
#include <semaphore.h>
#include <unistd.h>
using namespace std;
#define BUSY 1
#define IDLE 0
#define inf 0x3f3f3f3f
struct Block;
struct Page{
int pageID;
Block* to;
};
struct Block{
Page* page;
long time;
int id;
int state;
struct Block* next;
};
struct Process{
Page *page_list;
int pageLength;
int* num;
};
int total_Length,page_length;
int pocess_num;
struct Block* Block_list;
struct Process process;
void init()
{
printf("请输入内存容量: ");
scanf("%d",&total_Length);
printf("请输入页面长度: ");
scanf("%d",&page_length);
if(total_Length%page_length)
{
printf("初始化失败!\n");
return;
}
Block_list=new(Block);
Block* p=Block_list;
p->page=NULL;
p->time=0;
p->state=BUSY;
p->next=NULL;
int t=total_Length/page_length;
for(int i=1;i<=t;i++)
{
p->next=new(Block);
p=p->next;
p->page=NULL;
p->time=0;
p->state=IDLE;
p->id=i;
}
printf("初始化成功\n");
}
void show_Block()
{
Block* p=Block_list->next;
while(p!=NULL)
{
printf("%d:",p->id);
if(p->state)
{
printf("已分配给%d号帧\n",p->page->pageID);
}
else
{
printf("空闲帧\n");
}
p=p->next;
}
}
void show_Process()
{
for(int i=1;i<=process.pageLength;i++)
{
printf("%d号页 ",i);
if(process.page_list[i].pageID==-1)
printf("未载入内存\n");
else
printf("已载入第%d帧\n",process.page_list[i].pageID);
}
}
void creat_process()
{
printf("请输入进程容量: \n");
int length;
scanf("%d",&length);
process.pageLength=length/page_length;
if(length%page_length)
process.pageLength++;
process.num=new int[process.pageLength+1];
printf("共有%d个页面\n",process.pageLength);
printf("1.随机生成页面访问序列\n");
printf("2.手动输入页面访问序列\n");
printf("请选择: ");
int ti;
scanf("%d",&ti);
if(ti==1)
{
for(int i=1;i<=process.pageLength;i++)
process.num[i]=rand()%(process.pageLength)+1;
for(int i=1;i<=process.pageLength;i++)
printf("%d ",process.num[i]);
printf("\n");
}
else
{
for(int i=1;i<=process.pageLength;i++)
scanf("%d",&process.num[i]);
}
process.page_list=new Page[process.pageLength+1];
for(int i=1;i<=process.pageLength;i++)
process.page_list[i].pageID=-1;
}
bool hit(int now,int k=0)
{
Block* p=Block_list->next;
while(p!=NULL)
{
if(p->page==&process.page_list[now])
{
if(k!=0)
{
p->time=k;
}
return true;
}
p=p->next;
}
return false;
}
bool find_free(int now,int time)
{
Block* p=Block_list->next;
while(p!=NULL)
{
if(p->state==IDLE)
{
p->state=BUSY;
p->time=time;
p->page=&process.page_list[now];
process.page_list[now].to=p;
process.page_list[now].pageID=p->id;
return true;
}
p=p->next;
}
return false;
}
void find_min(int now,int time)
{
Block* p=Block_list->next;
int minn=p->time;
Block* minnp=p;
while(p!=NULL)
{
if(p->time<minn)
{
minn=p->time;
minnp=p;
}
p=p->next;
}
minnp->time=time;
printf("替换第%d页 装入第%d帧\n",minnp->page->pageID,minnp->id);
minnp->page=&process.page_list[now];
process.page_list[now].to=minnp;
process.page_list[now].pageID=minnp->id;
}
void FIFO()
{
for(int i=1;i<=process.pageLength;i++)
{
int now=process.num[i];
printf("%d号页: ",now);
if(hit(now))
{
printf("命中\n");
continue;
}
else if(find_free(now,i))
printf("直接装入第%d帧\n",process.page_list[now].to->id);
else
find_min(now,i);
}
}
void LRU()
{
for(int i=1;i<=process.pageLength;i++)
{
int now=process.num[i];
printf("%d号页: ",now);
if(hit(now,i))
{
printf("命中\n");
continue;
}
else if(find_free(now,i))
printf("直接装入第%d帧\n",process.page_list[now].to->id);
else
find_min(now,i);
}
}
void simulation()
{
printf("1.FIFO\n");
printf("2.LRU\n");
printf("请选择页面置换算法:");
int ti;
scanf("%d",&ti);
if(ti==1)
FIFO();
else if(ti==2)
LRU();
}
int main(int argc, char const *argv[]) {
printf("\033c");
printf("----------------------------------------\n");
printf("- 请求分页虚存页面替换模拟 -\n");
printf("- -\n");
printf("- -\n");
printf("- 1.初始化内存 -\n");
printf("- 2.创建进程并生成页面访问序列 -\n");
printf("- 3.模拟进程执行过程 -\n");
printf("- 4.显示内存使用情况 -\n");
printf("- 5.显示进程页面状态 -\n");
printf("- 0.退出 -\n");
printf("- -\n");
printf("----------------------------------------\n");
int ti;
while(1)
{
printf("--请选择功能选项: ");
scanf("%d",&ti);
if(ti==0)
break;
else if(ti==1)
init();
else if(ti==2)
creat_process();
else if(ti==3)
simulation();
else if(ti==4)
show_Block();
else if(ti==5)
show_Process();
}
return 0;
}