-
Notifications
You must be signed in to change notification settings - Fork 0
/
program09.c
145 lines (140 loc) · 4.49 KB
/
program09.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include <stdio.h>
#include <stdlib.h>
#define MAX_FRAMES 10
#define MAX_PAGES 50
int pages[MAX_PAGES];
int pageFrames[MAX_FRAMES];
int total_pages, frames;
// Prototypes
void FIFO();
void LRU();
void OPTIMAL();
int findPage(int page, int pageFrames[], int frames)
{
for (int i = 0; i < frames; i++)
{
if (pageFrames[i] == page)
{
return i;
}
}
return -1;
}
void initialize()
{
for (int i = 0; i < frames; i++)
{
pageFrames[i] = -1; // initialize page frames to -1 indicating they're empty }
}
void printPageFrames()
{
for (int i = 0; i < frames; i++)
{
if (pageFrames[i] != -1)
{
printf("%d ", pageFrames[i]);
}
else
{
printf("-- ");
}
}
printf("\n");
}
void FIFO()
{
int next_replace = 0;
int page_faults = 0;
initialize();
for (int i = 0; i < total_pages; i++)
{
if (findPage(pages[i], pageFrames, frames) == -1)
{
pageFrames[next_replace] = pages[i];
next_replace = (next_replace + 1) % frames;
page_faults++;
printPageFrames();
}
}
printf("FIFO - Total Page Faults: %d\n", page_faults);
}
void LRU()
{
int page_faults = 0;
int used[MAX_FRAMES] = {0}; // Used to keep track of usage
initialize();
for (int i = 0; i < total_pages; i++)
{
int found = findPage(pages[i], pageFrames, frames);
if (found == -1)
{ // Page fault
int lru = 0;
for (int j = 1; j < frames; j++)
{
if (used[j] < used[lru])
{
lru = j;
}
}
pageFrames[lru] = pages[i];
page_faults++;
printPageFrames();
}
for (int k = 0; k < frames; k++)
{
used[k]++; // Increment the use time of all frames }
used[found] = 0; // Reset the frame that was just referenced }
printf("LRU - Total Page Faults: %d\n", page_faults);
}
void OPTIMAL()
{
int page_faults = 0;
initialize();
for (int i = 0; i < total_pages; i++)
{
if (findPage(pages[i], pageFrames, frames) == -1)
{ // Page fault int opt_index = -1, farthest = i;
for (int j = 0; j < frames; j++)
{
int k;
for (k = i + 1; k < total_pages; k++)
{
if (pageFrames[j] == pages[k])
{
if (k > farthest)
{
farthest = k;
opt_index = j;
}
break;
}
}
if (k == total_pages)
{ // Not found in the future opt_index = j;
break;
}
}
if (opt_index == -1)
opt_index = 0; // If all are equally likely pageFrames[opt_index] = pages[i];
page_faults++;
printPageFrames();
}
}
printf("Optimal - Total Page Faults: %d\n", page_faults);
}
int main()
{
printf("Enter number of frames: ");
scanf("%d", &frames);
printf("Enter number of pages: ");
scanf("%d", &total_pages);
printf("Enter page reference string:\n");
for (int i = 0; i < total_pages; i++)
{
scanf("%d", &pages[i]);
}
FIFO();
LRU();
OPTIMAL();
return 0;
}