Write the simulation program to implement demand paging and show the page scheduling and total number of page faults for the following given page reference string. Give input n as the number of memory frames. Reference String: 2,5,2,8,5,4,1,2,3,2,6,1,2,5,9,8 Implement Second Chance Page Replacement.
#include <stdio.h>
#include <stdlib.h>
// Structure to represent a page frame in memory
typedef struct PageFrame {
int pageNumber; // Page number
int referenceBit; // Reference bit (0 or 1)
} PageFrame;
// Function to simulate demand paging with Second Chance (Clock) page replacement
void demandPagingSecondChance(int referenceString[], int n, int numFrames) {
PageFrame frames[numFrames];
int pageFaults = 0;
int currentIndex = 0;
for (int i = 0; i < numFrames; i++) {
frames[i].pageNumber = -1; // Initialize frames to empty
frames[i].referenceBit = 0; // Initialize reference bit to 0
}
printf("Page Schedule:\n");
for (int i = 0; i < n; i++) {
int page = referenceString[i];
int found = 0;
int replacedIndex = -1;
// Search for the page in the frames
for (int j = 0; j < numFrames; j++) {
if (frames[j].pageNumber == page) {
frames[j].referenceBit = 1; // Set reference bit to 1
found = 1;
break;
}
}
if (!found) {
// Search for an empty frame
for (int j = 0; j < numFrames; j++) {
if (frames[currentIndex].pageNumber == -1) {
replacedIndex = currentIndex;
currentIndex = (currentIndex + 1) % numFrames; // Move to the next frame in a circular manner
break;
} else if (frames[currentIndex].referenceBit == 0) {
replacedIndex = currentIndex;
currentIndex = (currentIndex + 1) % numFrames; // Move to the next frame in a circular manner
break;
} else {
frames[currentIndex].referenceBit = 0; // Reset reference bit to 0
currentIndex = (currentIndex + 1) % numFrames; // Move to the next frame in a circular manner
}
}
// Replace the frame at the selected index
frames[replacedIndex].pageNumber = page;
frames[replacedIndex].referenceBit = 0;
pageFaults++;
printf("Page %d -> ", page);
for (int j = 0; j < numFrames; j++) {
if (frames[j].pageNumber == -1) {
printf("M ");
} else {
printf("%d ", frames[j].pageNumber);
}
}
printf(" (Page Fault)\n");
} else {
printf("Page %d -> ", page);
for (int j = 0; j < numFrames; j++) {
if (frames[j].pageNumber == -1) {
printf("M ");
} else {
printf("%d ", frames[j].pageNumber);
}
}
printf("\n");
}
}
printf("\nTotal Page Faults: %d\n", pageFaults);
}
int main() {
int numFrames;
int n;
printf("Enter the number of memory frames: ");
scanf("%d", &numFrames);
printf("Enter the number of pages in the reference string: ");
scanf("%d", &n);
int referenceString[n];
printf("Enter the reference string (separated by spaces): ");
for (int i = 0; i < n; i++) {
scanf("%d", &referenceString[i]);
}
demandPagingSecondChance(referenceString, n, numFrames);
return 0;
}

Comments
Post a Comment