请根据这段代码实现最近未使用算法(NRU) #include<iostream> #include<stdlib.h> #include<iomanip> #include<queue> #include<string> #include<time.h> using namespace std; #define max 0x3f3f3f3f int size; double ratio; struct Order { int id; //*** int numpage; //属于页面号 }; Order order[320]; struct Page { int num; bool in; //是否在内存中 int time; //时间 }; Page page[32]; void init0() { int first; srand((unsigned)time(NULL)); //随机种子 for(int i=0;i<320;i+=6) { first=(int)(319.0*rand()/RAND_MAX)+1; order[i].id=first; //任选一指令节点 order[i+1].id=order[i].id+1; //顺序访问下一条指令 order[i+2].id=(int)(1.0*order[i].id*rand()/RAND_MAX); //前地址指令 order[i+3].id=order[i+2].id+1; //顺序访问下一条指令 order[i+4].id=(int)(1.0*rand()*(318-order[i+2].id)/RAND_MAX)+order[i+2].id+2; //后地址指令 order[i+5].id=order[i+4].id+1; //顺序访问下一条指令 } } void init() { for(int i=0;i<320;i++) { order[i].numpage=order[i].id/10; // cout<<i<<" "<<order[i].id<<" page-> "<<order[i].numpage<<endl; } for(int i=0;i<32;i++) { page[i].in=0; page[i].num=i; page[i].time=max-1; } }
时间: 2023-07-16 07:16:03 浏览: 113
最近未使用算法(NRU)是一种页面置换算法,其思想是在物理内存中找到最近未被使用的页面进行置换。实现该算法需要记录每个页面最近一次被使用的时间,当需要置换页面时,选择最近未被使用的页面进行替换。
下面是根据这段代码实现最近未使用算法的过程:
1. 初始化函数init0()中生成了320个指令,其中每个指令有一个id属性,表示该指令的编号。为了方便管理,需要将每个指令所属的页面号(numpage)计算出来,可以在初始化函数init()中进行:
```
void init() {
for(int i=0;i<320;i++) {
order[i].numpage=order[i].id/10;
}
//其他部分不变
}
```
2. 在模拟访问指令的过程中,需要判断当前指令所属的页面是否在内存中。如果在内存中,更新该页面的最近一次使用时间;如果不在内存中,则需要选择一个最近未被使用的页面进行置换。
在访问指令时,可以使用一个队列来记录当前内存中的页面,队列头部表示最近被使用的页面,队列尾部表示最近未被使用的页面。假设内存中只能存放32个页面,则可以先初始化一个32个元素的队列:
```
queue<Page> q; //定义一个存放页面的队列
for(int i=0;i<32;i++) {
page[i].in=0;
page[i].num=i;
page[i].time=max-1;
q.push(page[i]);
}
```
每当访问一个指令时,可以遍历队列,找到最近未被使用的页面进行置换。最近未被使用的页面可以定义为时间最久远、且没有被访问过的页面。
```
void access(int id) {
int numpage=id/10; //获取当前指令所属的页面号
bool inmemory=false; //标记当前页面是否在内存中
for(int i=0;i<32;i++) {
if(page[i].in && page[i].num==numpage) {
//页面在内存中,更新最近使用时间
inmemory=true;
page[i].time=0;
break;
}
}
if(!inmemory) {
//页面不在内存中,选择最近未使用的页面进行置换
bool found=false;
while(!found) {
Page p=q.front(); //取出队列头部元素
q.pop(); //弹出队列头部元素
if(page[p.num].time==max-1) {
//找到时间最久远、且未被访问过的页面
page[p.num].in=false;
page[p.num].time=0;
page[numpage].in=true;
page[numpage].time=0;
q.push(page[numpage]); //将新页面放入队列尾部
found=true;
} else {
//当前页面已被访问过,放回队列尾部
page[p.num].time++;
q.push(page[p.num]);
}
}
}
}
```
3. 在主函数中,需要先调用init0()和init()初始化数据,然后按顺序访问320个指令:
```
int main() {
init0();
init();
for(int i=0;i<320;i++) {
access(order[i].id);
}
return 0;
}
```
以上是根据这段代码实现最近未使用算法的过程。当然,为了更好地模拟实际情况,可以对算法进行优化,例如采用Clock算法、FIFO算法或LRU算法等。
阅读全文