25 Program for Optimal Page Replacement Algorithm

Program:

   
#include<stdio.h>
#include<limits.h>

// This function is just use to check if the frame is containg our current page already.
int checkHit(int incomingPage, int queue[], int occupied)
{
	for(int i = 0; i < occupied; i++)
	{
		if(incomingPage == queue[i])
		{
			return 1;
		}
	}
	return 0;
}

// This function is used to print thr frames.
void printFrames(int queue[], int occupied)
{
	for(int i = 0; i < occupied; i++)
	{
		printf("%d\t\t", queue[i]);
	}
}

int main()
{
	int incomingStream[] = {7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};

	int n = sizeof(incomingStream) / sizeof(incomingStream[0]);
	int frames = 4;
	int queue[n];
	int distance[n];
	int occupied = 0;
	int pageFaults = 0;
	int hit = 0;

	printf("Page:\tPage 1\t\tPage 2\t\tPage 3\t\tPage 4\n");

	for(int i = 0; i < n; i++)
	{
		printf("%d:\t", incomingStream[i]);

		// Condition 1: When the page is already present in the frame, so dont do anything, just print the frame as it is.
		if(checkHit(incomingStream[i], queue, occupied))
		{
			hit++;
			printFrames(queue, occupied);
		}
		// Condition 2: When the frame is not completely filled, so fill it directly and increment the pageFaults.
		else if(occupied < frames)
		{
			queue[occupied] = incomingStream[i];
			occupied++;
			pageFaults++;

			printFrames(queue, occupied);
		}
		// Condition 3: When the frame is full, and our page is not present in the frame
		// So, find the max distance of each page present in the frame in future, then the 
		// page having max distance, we will replace it with our current page.
		else
		{
			int max = INT_MIN;
			int index;

			// This is to count distance value for every page in frame.
			for(int j = 0; j < frames; j++)
			{
				distance[j] = 0;

				for(int k = i+1; j < n; k++)
				{
					++distance[j];
					if(queue[j] == incomingStream[k])
						break;
				}				

				// If current page in frame distance is greater than previous, 
                // then update it.
				if(distance[j] > max)
				{
					max = distance[j];
					index = j;
				}
			}

			// Finally, replace our page with the page in frame having most greater distance, whose index is store
			// in the index variable and also increment the page faults.
			queue[index] = incomingStream[i];
			printFrames(queue, occupied);
			pageFaults++;
		}

		printf("\n");
	}	

	printf("\n\n Page Faults: %d", pageFaults);
	printf("\n\n Number of Hits: %d", hit);
	
	return 0;
}

Output:

Optimal Page Replacement


Previous
Next Post »