-
Notifications
You must be signed in to change notification settings - Fork 0
/
8PAGE_REPLACEMENT_LRU.cxx
175 lines (139 loc) · 3.66 KB
/
8PAGE_REPLACEMENT_LRU.cxx
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#include<iostream>
#include<queue>
using namespace std;
int n; //Number of Frames in main memory
queue<char>ongoing;
queue<char>lru;
//TO CHECK WHEATHER A CHARACTER IS PRESENT IN A GIVEN QUEUE
bool present_in(char ch,queue<char>myqueue)
{
queue<char>local;
local=myqueue;
while(local.size()!=0)
{
if(local.front()==ch)
{
return true;
}
local.pop();
}
return false;
}
//TO FILL THE LEAST RECENTLY USED QUEUE
/*
step1)If the size of lru is not equal to n(means less then n,n is the number of frames)
CASE1)If character is present in LRU,Then remove the charater from its occuring position without disturbing the order of other elements and add it to the last in lru queue so that it becomes most recently used
CASE2)If character is not present in the LRU then simply add character to the LRU list
step2)If the size of lru is equal to n(n is the number of frames)
CASE1)If character is present in LRU,Then remove the character from its occuring position without disturbing the order of other elements and add it to the last in lru queue so that it becomes most recently used.
CASE2)If character is not present in the LRU then simply pop out a character from LRU add character to the LRU list
*/
void update_lru(char ch)
{
queue<char>local;
while(lru.size()!=0)
{
if(lru.front()==ch)
{
lru.pop();
}
else
{
local.push(lru.front());
lru.pop();
}
}
local.push(ch);
lru=local;
}
void fill_lru(char ch)
{
bool present;
present=present_in(ch,lru);
if(lru.size()!=n)
{
if(present)
update_lru(ch);
else
lru.push(ch);
}
else
{
if(present)
update_lru(ch);
else
{
lru.pop();
lru.push(ch);
}
}
}
void least(char string[])
{
char ch;
int i=0;
float fault=0;
float hit=0;
bool present;
ch=string[0];
while(ch!='\0')
{
present=present_in(ch,ongoing);
if(ongoing.size()!=n)
{
if(present)
hit=hit+1;
else
{
ongoing.push(ch);
fault=fault+1;
}
}
else
{
if(present)
hit=hit+1;
else
{
char replace;
replace=lru.front();
queue<char>local;
fault=fault+1;
while(!ongoing.empty())
{
if(ongoing.front()==replace)
{
ongoing.pop();
local.push(ch);
}
else
{
local.push(ongoing.front());
ongoing.pop();
}
}
ongoing=local;
}
}
fill_lru(ch);
i++;
ch=string[i];
}
float hit_ratio,miss_ratio;
hit_ratio=hit/i;
miss_ratio=fault/i;
cout<<"\nNUMBER OF PAGES IN STRING IS "<<i;
cout<<"\nNUMBER OF FAULTS IS "<<fault;
cout<<"\nNUMBER OF HITS IS "<<hit;
cout<<"\nHIT RATIO "<<hit_ratio;
cout<<"\nMISS RATIO "<<miss_ratio;
}
int main()
{
char string[40];
cout<<"\n Enter the string ";
cin>>string;
cout<<"\nEnter number of frames ";
cin>>n;
least(string);
}