Write the simulation program to implement demand paging and show the page scheduling and total number of page faults according to the LRU page replacement algorithm. Assume the memory of n frames. 

Reference String : 3, 4, 5, 4, 3, 4, 7, 2, 4, 5, 6, 7, 2, 4, 6

 #include <stdio.h>

#include <stdlib.h>


#define MAX_FRAMES 100

#define REFERENCE_STRING_LENGTH 15


void printFrames(int frames[], int frame_count) {

    for (int i = 0; i < frame_count; i++) {

        if (frames[i] != -1)

            printf("%d ", frames[i]);

        else

            printf("X ");

    }

    printf("\n");

}


int isInFrames(int frames[], int frame_count, int page) {

    for (int i = 0; i < frame_count; i++) {

        if (frames[i] == page) {

            return 1;

        }

    }

    return 0;

}


int findLRUIndex(int timestamps[], int frame_count) {

    int min = timestamps[0];

    int min_index = 0;


    for (int i = 1; i < frame_count; i++) {

        if (timestamps[i] < min) {

            min = timestamps[i];

            min_index = i;

        }

    }

    return min_index;

}


void lruPageReplacement(int reference_string[], int ref_len, int frame_count) {

    int frames[MAX_FRAMES];

    int timestamps[MAX_FRAMES];

    int page_faults = 0;

    int time = 0;


    // Initialize frames and timestamps

    for (int i = 0; i < frame_count; i++) {

        frames[i] = -1;

        timestamps[i] = 0;

    }


    for (int i = 0; i < ref_len; i++) {

        int page = reference_string[i];


        // Check if page is already in frames

        if (isInFrames(frames, frame_count, page)) {

            // Update timestamp

            for (int j = 0; j < frame_count; j++) {

                if (frames[j] == page) {

                    timestamps[j] = time++;

                    break;

                }

            }

            printf("Page %d is already in frames. No page fault.\n", page);

        } else {

            // Page fault occurred

            page_faults++;

            int replace_index = findLRUIndex(timestamps, frame_count);

            frames[replace_index] = page;

            timestamps[replace_index] = time++;


            printf("Page %d caused a page fault. Replacing page in frame %d.\n", page, replace_index);

        }


        // Print current state of frames

        printFrames(frames, frame_count);

    }


    printf("Total number of page faults: %d\n", page_faults);

}


int main() {

    int reference_string[REFERENCE_STRING_LENGTH] = {3, 4, 5, 4, 3, 4, 7, 2, 4, 5, 6, 7, 2, 4, 6};

    int frame_count;


    printf("Enter the number of frames: ");

    scanf("%d", &frame_count);


    if (frame_count > MAX_FRAMES || frame_count <= 0) {

        printf("Invalid number of frames. Must be between 1 and %d.\n", MAX_FRAMES);

        return 1;

    }


    lruPageReplacement(reference_string, REFERENCE_STRING_LENGTH, frame_count);


    return 0;

}