加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

LRU置换算法利用栈结构实现

(2012-05-18 19:02:08)
标签:

os学习

杂谈

分类: 学习笔记

描述:利用栈来保全当前使用的个页面号,每当进程访问某页面时,便将该页面的页面号从栈中移出,将它压入栈顶。因此栈顶始终是最新被访问页面的编号,而栈底则是,最久为使用页面号。

#include<stdio.h>

#include<stdlib.h>
#define N 50
int accessList[N];
typedef struct regitStack{
int size;
int *no;
int *head;
int *tail;
}Regit;
struct regitStack *regit;
int count;
int currentSize=0;
int createAccessList();
int createStack();
int* isEixt(int no);
int lru();
void printStack();
int main(){
    createStack();
createAccessList();
lru();
}


int createAccessList(){
int i;
printf("输入访问内存次数:");
scanf("%d",&count);
printf("输入页面访问序列\n");
for( i=0;i<count;i++){
printf("第%d个页面号:",i+1);
scanf("%d",&accessList[i]);
}
return 0;

}
int createStack(){
regit=(Regit*)malloc(sizeof(Regit));
regit->size=5;
regit->no=(int*)malloc(sizeof(int)*regit->size);
regit->head=regit->tail=regit->no;
return 0;
}
int lru(){
int i;
int *temp,*move;

for(i=0;i<count;i++){
        if((temp=isEixt(accessList[i]))==NULL)//访问的页号不在栈内
{
if(currentSize<regit->size)//堆栈未满直接压到顶部
{
*(regit->head)=accessList[i];
regit->head++;
currentSize++;
}else{                    //下移压顶
move=regit->tail;
printf("第%d次访问时置换出%d页\n",i+1,*regit->tail);
while(1){
*move=*(move+1);
move++;
if(move==regit->head-1)
{
*move=accessList[i];
break;
}
}


}
}else{
            
if(accessList[i]!=*(regit->head-1)){  //不在顶时
move=temp;
while(1){
*move=*(move+1);
move++;
if(move==regit->head-1){
*move=accessList[i];
break;
}
}
}
}

printStack();

}
return 0;
}
int* isEixt(int no){
    int *p=regit->tail;
while(p!=regit->head){
if(*p==no){
return p;
}
p++;
}
    return NULL;
}
void printStack(){
int i;
printf("堆栈中的页面号:");
for(i=0;i<currentSize;i++){
printf("%d",regit->no[i]);
}
printf("\n");
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有