The Least Recently Used (LRU) Page
Replacement Algorithm
A
good approximation to the optimal algorithm is based on the observation that
pages that have been heavily used in the last few instructions will probably be
heavily used again in the next few. Conversely, pages that have not been used
for ages will probably remain unused for a long time. This idea suggests a
realizable algorithm: when a page fault occurs, throw out the page that has
been unused for the longest time. This strategy is called LRU(Least
Recently Used) paging.
Although
LRU is theoretically realizable, it is not cheap. To fully implement LRU, it is
necessary to maintain a linked list of all pages in memory, with the most
recently used page at the front and the least recently used page at the rear.
The difficulty is that the list must be updated on every memory reference.
Finding a page in the list, deleting it, and then moving it to the front is a
very time consuming operation, even in hardware (assuming that such hardware
could be built).
However,
there are other ways to implement LRU with special hardware. Let us consider
the simplest way first. This method requires equipping the hardware with a
64-bit counter, C, that is automatically incremented after each
instruction. Furthermore, each page table entry must also have a field large
enough to contain the counter. After each memory reference, the current value
of C is stored in the page table entry for the page just
referenced. When a page fault occurs, the operating system examines all the
counters in the page table to find the lowest one. That page is the least
recently used.
Note : In this also write your won example. :P
#include<stdio.h>#include<conio.h>
void main()
{
int g=0,a[5],b[20],p=0,q=0,m=0,h,k,i,q1=1,j,u,n;
char f='F';
clrscr();
printf("Enter the number of pages:");
scanf("%d",&n);
printf("Enter %d Page Numbers:",n);
for(i=0;i<n;i++)
scanf("%d",&b[i]);
for(i=0;i<n;i++)
{if(p==0)
{
if(q>=3)
q=0;
a[q]=b[i];
q++;
if(q1<3)
{
q1=q;
//g=1;
}
}
printf("\n%d",b[i]);
printf("\t");
for(h=0;h<q1;h++)
printf("%d",a[h]);
if((p==0)&&(q<=3))
{
printf("-->%c",f);
m++;
}
p=0;
g=0;
if(q1==3)
{
for(k=0;k<q1;k++)
{
if(b[i+1]==a[k])
p=1;
}
for(j=0;j<q1;j++)
{
u=0;
k=i;
while(k>=(i-1)&&(k>=0))
{
if(b[k]==a[j])
u++;
k--;
}
if(u==0)
q=j;
}
}
else
{
for(k=0;k<q;k++)
{
if(b[i+1]==a[k])
p=1;
}
}
}
printf("\nNo of faults:%d",m);
getch();
}
OUTPUT
No comments:
Post a Comment