【操作系统-存储器管理】简单的clock置换算法的实现

分析:clock置换算法是利用循环队列来实现的。操作系统课本上的讲解时这样的

代码实现:

#include<iostream>
using namespace std;
typedef struct numbernode
{
  int *data;
  bool *ask;//访问号
}Numnode;
typedef struct node
{
Numnode numnode;
int maxsize;
int rear;
int front;
}queue;
queue* create();
void push(queue *);
void pop(queue *);
int turnyemian(queue *myque,int Telem);
queue* create()
{
queue *myque=new queue;
myque->numnode.data=new int;
myque->numnode.ask=new bool;
myque->rear=0;
myque->front=0;
int i;
int m;
printf("队列共有多少个元素?\n");
scanf("%d",&m);
for(i=0;i<=m;i++)
myque->numnode.ask[i]=false;
myque->maxsize=m+1;
return myque;
}
void push(queue *myque)
{
if((myque->rear+1)%myque->maxsize!=myque->front)
{
       printf("请输入您访问的页面号?\n");
  scanf("%d",&myque->numnode.data[myque->rear]);
  myque->numnode.ask[myque->rear]=true;
  myque->rear=(myque->rear+1)%myque->maxsize;
}
else
{
int Telem;
printf("此时队列里面页面数满了,要进行页面置换\n");
printf("您要访问的页面号?\n");
   scanf("%d",&Telem);
turnyemian(myque,Telem);
    }
}
int turnyemian(queue *myque,int Telem)
{
int key=myque->front;
while(1)

if((myque->numnode.ask[key]==true)&&((key+1)%myque->maxsize!=myque->front))
          {
         myque->numnode.ask[key]=false;
 key=(key+1)%myque->maxsize;
           }
    if((key+1)%myque->maxsize==myque->front)
{
   key=(key+1)%myque->maxsize;
}
if(myque->numnode.ask[key]==false)
{
myque->numnode.data[key]=Telem;//用Telem的数值来置换这个页面
myque->numnode.ask[key]=true;
printf("用%d置换了这个页面\n",myque->numnode.data[key]);
return 0;
}
}
}
void pop(queue *myque)
{
if(myque->front!=myque->rear)
{
printf("您删除了循环队列的元素%d",myque->numnode.data[myque->front]);
myque->front=(myque->front+1)%myque->maxsize;
}
else
{
 printf("队列空了,不能再删除了");
}

}
void prints(queue *myque)
{
int p=myque->front;
while(p!=myque->rear)
{
if(p==myque->front)
{
printf("%d",myque->numnode.data[p]);
        p++;
}
else
{
printf("<- %d",myque->numnode.data[p]);
p++;
}
}

printf("\n");
}
int main(void)
{
queue *myque=new queue;
myque=create();
int key;
while(1)
{
      printf("*************请选择如下操作:*************\n");
      printf("1.添加元素\n");
      printf("2.删除元素\n");
      printf("3.显示循环队列\n");
  printf("4.退出系统\n");
      scanf("%d",&key);
         switch (key)
         {
 case 1:push(myque);break;
 case 2:pop(myque);break;
 case 3:prints(myque);break;
 case 4:return 0;
                     default:
              break;
         }
}
return 0;
}

结果展示:

技术分享

原始的3个页面

技术分享

第一次页面置换

技术分享

第二次置换

技术分享

第三次置换

技术分享

第四次置换

技术分享

至此,四次置换完成。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。