121 lines
3.4 KiB
C
121 lines
3.4 KiB
C
#include <stdio.h>
|
|
#include <pthread.h>
|
|
#include <limits.h>
|
|
#define MAX_PROC 10
|
|
#define MAX_REF 100
|
|
#define MAX_FRAMES 10
|
|
|
|
typedef struct {
|
|
int id; // Process ID
|
|
int frames; // Number of frames for this process
|
|
int n; // Number of page references
|
|
int ref[MAX_REF]; // Array of page references
|
|
int faults; // Page faults counter
|
|
} Process;
|
|
|
|
Process procs[MAX_PROC];
|
|
int proc_count = 0;
|
|
|
|
void *simulateOptimal(void *arg) {
|
|
Process *p = (Process *)arg;
|
|
int frameArr[MAX_FRAMES];
|
|
int i, j;
|
|
|
|
// Initialize frames as empty (-1)
|
|
for (i = 0; i < p->frames; i++) {
|
|
frameArr[i] = -1;
|
|
}
|
|
p->faults = 0;
|
|
|
|
// Process each page reference
|
|
for (i = 0; i < p->n; i++) {
|
|
int page = p->ref[i];
|
|
int found = 0;
|
|
// Check if page is already in a frame
|
|
for (j = 0; j < p->frames; j++) {
|
|
if (frameArr[j] == page) {
|
|
found = 1;
|
|
break;
|
|
}
|
|
}
|
|
if (found)
|
|
continue;
|
|
// Page fault occurs
|
|
p->faults++;
|
|
|
|
// Look for an empty frame (-1)
|
|
int empty = -1;
|
|
for (j = 0; j < p->frames; j++) {
|
|
if (frameArr[j] == -1) {
|
|
empty = j;
|
|
break;
|
|
}
|
|
}
|
|
if (empty != -1) {
|
|
frameArr[empty] = page;
|
|
continue;
|
|
}
|
|
|
|
// No empty frame; choose a victim using Optimal algorithm:
|
|
int replace = 0, farthest = -1;
|
|
for (j = 0; j < p->frames; j++) {
|
|
int k, nextUse = INT_MAX;
|
|
for (k = i + 1; k < p->n; k++) {
|
|
if (frameArr[j] == p->ref[k]) {
|
|
nextUse = k;
|
|
break;
|
|
}
|
|
}
|
|
if (nextUse > farthest) {
|
|
farthest = nextUse;
|
|
replace = j;
|
|
}
|
|
}
|
|
frameArr[replace] = page;
|
|
}
|
|
|
|
printf("Process %d: Faults = %d\n", p->id, p->faults);
|
|
return NULL;
|
|
}
|
|
|
|
int main() {
|
|
int i, j;
|
|
pthread_t threads[MAX_PROC];
|
|
|
|
// Input the number of processes
|
|
printf("Enter number of processes (max %d): ", MAX_PROC);
|
|
scanf("%d", &proc_count);
|
|
if (proc_count > MAX_PROC) proc_count = MAX_PROC;
|
|
|
|
// Input process details
|
|
for (i = 0; i < proc_count; i++) {
|
|
procs[i].id = i + 1;
|
|
printf("\nProcess %d:\n", procs[i].id);
|
|
printf("Enter number of frames (max %d): ", MAX_FRAMES);
|
|
scanf("%d", &procs[i].frames);
|
|
if (procs[i].frames > MAX_FRAMES) procs[i].frames = MAX_FRAMES;
|
|
printf("Enter number of page references (max %d): ", MAX_REF);
|
|
scanf("%d", &procs[i].n);
|
|
if (procs[i].n > MAX_REF) procs[i].n = MAX_REF;
|
|
printf("Enter %d page references (space separated): ", procs[i].n);
|
|
for (j = 0; j < procs[i].n; j++) {
|
|
scanf("%d", &procs[i].ref[j]);
|
|
}
|
|
}
|
|
|
|
// Create a thread for each process simulation
|
|
for (i = 0; i < proc_count; i++) {
|
|
pthread_create(&threads[i], NULL, simulateOptimal, &procs[i]);
|
|
}
|
|
|
|
int totalFaults = 0;
|
|
// Wait for all threads to complete
|
|
for (i = 0; i < proc_count; i++) {
|
|
pthread_join(threads[i], NULL);
|
|
totalFaults += procs[i].faults;
|
|
}
|
|
|
|
// Calculate and display average faults
|
|
printf("\nAverage Page Faults: %.2f\n", (float)totalFaults / proc_count);
|
|
return 0;
|
|
}
|