Operating System Algorithms (C Programs)

LRU Page Replacement

#include <stdio.h>

int findmin(int time[], int f)
{
    int i, min, pos;

    for (i = 0; i < f; i++) {
        if (time[i] == -1)
            return i;
    }

    min = time[0];
    pos = 0;

    for (i = 1; i < f; i++) {
        if (time[i] < min) {
            min = time[i];
            pos = i;
        }
    }

    return pos;
}

void main()
{
    int pages[50], frames[10], time[10];
    int i, j, n, f;
    int count = 0;
    int found;
    int faults = 0;
    int k;

    printf("Enter number of pages: ");
    scanf("%d", &n);

    printf("Enter page reference string:\n");
    for (i = 0; i < n; i++)
        scanf("%d", &pages[i]);

    printf("Enter number of frames: ");
    scanf("%d", &f);

    for (i = 0; i < f; i++) {
        frames[i] = -1;
        time[i] = -1;
    }

    printf("\nPage\t");
    for (i = 0; i < f; i++)
        printf("Frame%d\t", i + 1);
    printf("Status\n");

    for (i = 0; i < n; i++) {
        found = 0;
        count++;

        for (j = 0; j < f; j++) {
            if (frames[j] == pages[i]) {
                found = 1;
                time[j] = count;
                break;
            }
        }

        if (!found) {
            k = findmin(time, f);
            frames[k] = pages[i];
            time[k] = count;
            faults++;
        }

        printf("%d\t", pages[i]);
        for (j = 0; j < f; j++) {
            if (frames[j] == -1)
                printf("-\t");
            else
                printf("%d\t", frames[j]);
        }

        if (found)
            printf("Hit\n");
        else
            printf("Fault\n");
    }

    printf("\nTotal Page Faults = %d\n", faults);
}

FIFO Page Replacement

#include <stdio.h>

void main() {
    int pages[50], frames[10];
    int i, j,n,f;
    int next = 0;
    int found;
    int faults = 0;

    printf("Enter number of pages: ");
    scanf("%d", &n);

    printf("Enter page reference string:\n");
    for (i = 0; i < n; i++)
        scanf("%d", &pages[i]);

    printf("Enter number of frames: ");
    scanf("%d", &f);

    for (i = 0; i < f; i++)
        frames[i] = -1;

    printf("\nPage\t");
    for (i = 0; i < f; i++)
        printf("Frame%d\t", i + 1);
    printf("Status\n");

    for (i = 0; i < n; i++) {
        found = 0;

        for (j = 0; j < f; j++) {
            if (frames[j] == pages[i]) {
                found = 1;
                break;
            }
        }

        if (!found) {
            frames[next] = pages[i];
            next = (next + 1) % f;
            faults++;
        }

        printf("%d\t", pages[i]);
        for (j = 0; j < f; j++) {
            if (frames[j] == -1)
                printf("-\t");
            else
                printf("%d\t", frames[j]);
        }

        if (found)
            printf("Hit\n");
        else
            printf("Fault\n");
    }

    printf("\nTotal Page Faults = %d\n", faults);
}

FCFS Disk Scheduling

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n, head, total = 0;

    printf("Enter number of requests: ");
    scanf("%d", &n);

    int req[n];

    printf("Enter the requests:\n");
    for(int i = 0; i < n; i++)
        scanf("%d", &req[i]);

    printf("Enter initial head position: ");
    scanf("%d", &head);

    printf("\nStep\tFrom\tTo\tMovement\n");
    printf("--------------------------------\n");

    for(int i = 0; i < n; i++) {
        int movement = abs(head - req[i]);

        printf("%d\t%d\t%d\t%d\n", i+1, head, req[i], movement);

        total += movement;
        head = req[i];
    }

    printf("--------------------------------\n");
    printf("Total head movement = %d\n", total);

    return 0;
}

SSTF Disk Scheduling

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n, head, total = 0;

    printf("Enter number of requests: ");
    scanf("%d", &n);

    int req[n], visited[n];

    printf("Enter the requests:\n");
    for(int i = 0; i < n; i++) {
        scanf("%d", &req[i]);
        visited[i] = 0;
    }

    printf("Enter initial head position: ");
    scanf("%d", &head);

    printf("\nStep\tFrom\tTo\tMovement\n");
    printf("--------------------------------\n");

    for(int step = 0; step < n; step) {
        int min = 100000, index = -1;

        for(int i = 0; i < n; i++) {
            if(!visited[i]) {
                int dist = abs(head - req[i]);
                if(dist < min) {
                    min = dist;
                    index = i;
                }
            }
        }

        printf("%d\t%d\t%d\t%d\n", step+1, head, req[index], min);

        total += min;
        head = req[index];
        visited[index] = 1;
    }

    printf("--------------------------------\n");
    printf("Total head movement = %d\n", total);

    return 0;
}