FIFO Page Replacement Algorithm In C++
FIFO Page Replacement Algorithm in C++
The approach is implemented with the help of an algorithm which is also known as the scheduling algorithm. The algorithm is dedicated to giving every process the Central Operating System (CPU) time in the order in which it is demanded.
Very important
Program in C++ (Method 1)
This method uses sets and queues –//C++ program for FIFO algorithm
#include <bits/stdc++.h>
using namespace std;
// Method to determine pager faults using FIFO
int getPageFaults(int pages[], int n, int frames)
{
// To denote the current page set, we use an unordered_set.
// It will help to have a quick check
// The availability of the page in the set.
unordered_set <int> set;
// The code will store the pages in FIFO technique
queue <int> indexes;
// Stating from the first page
int countPageFaults = 0;
for (int i=0; i < n; i++)
{
// Checking the capacity to hold more pages
if (set.size() < frames)
{
// if the page is absent, insert it into the set
// the condition represents page fault
if (set.find(pages[i])==set.end())
{
set.insert(pages[i]);
// increment the conter for page fault
countPageFaults++;
// Push the current page into the queue
indexes.push(pages[i]);
}
}
// If the queue is full, we need to remove one page through FIFO
// The topmost page from the queue will be removed
// Now insert the current page to meet the demand
else
{
// Check if the page in demand is not already present in the queue
if (set.find(pages[i]) == set.end())
{
// Remove the first page from the queue
int val = indexes.front();
indexes.pop();
// Pop the index page
set.erase(val);
// Push the current page in the queue
set.insert(pages[i]);
indexes.push(pages[i]);
// Increment page faults
countPageFaults++;
}
}
}
return countPageFaults;
}
// Driver code
int main()
{
int pages[] = {4, 1, 2, 4, 5};
int n = sizeof(pages)/sizeof(pages[0]);
int frames = 4;
cout << "Page Faults: " << getPageFaults(pages, n, frames);
return 0;
}
Output:
Page Faults: 4
Method 2 (Using Vectors)
Example for output –
Incoming page Steam – 7, 0, 1, 2, 0 , 3, 0, 4, 2, 3, 0, 3, 2, 1
Page Size/ Frame Size = 3
Table will look like(Explanation after the table)
[table id=372 /]
Program in C++ (Method 2)
This method uses vectors –#include<bits/stdc++.h>
using namespace std;
int main(){
int i, j, k, hitCount = 0;
int frames = 3;
int p_count = 14;
vector <int> processes{7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1};
vector <int> hit(p_count);
vector<vector<int>> a(frames);
for(i = 0; i < frames; i++){
a[i] = vector <int>(p_count,-1);
}
map <int, int> mp;
for(i = 0; i < p_count ; i++){
vector<pair<int,int>> c;
for(auto x: mp)
{
c.push_back({x.second, x.first});
}
sort(c.begin(),c.end());
bool hasCompleted = false;
for(j = 0;j < frames; j++){
if(a[j][i] == processes[i])
{
hitCount++;
hit[i] = true;
mp[processes[i]]++;
hasCompleted = true;
break;
}
if(a[j][i] == -1)
{
for(k = i ; k < p_count; k++)
a[j][k] = processes[i];
mp[processes[i]]++;
hasCompleted = true;
break;
}
}
if(j == frames || hasCompleted == false){
for(j = 0;j < frames; j++){
if(a[j][i] == c[c.size() - 1].second){
mp.erase(a[j][i]);
for(k = i; k < p_count ; k++)
a[j][k]= processes[i];
mp[processes[i]]++;
break;
}
}
}
for(auto x:mp){
if(x.first != processes[i]){
mp[x.first]++;
}
}
}
cout << "Process ";
for(i = 0 ; i < p_count; i++){
cout << processes[i] << " ";
}
cout << endl;
for(i = 0; i < frames; i++){
cout << "Frame" << i << " ";
for(j = 0; j < p_count; j++){
if(a[i][j] == -1)
cout << "- ";
else
cout << a[i][j] << " ";
}
cout << endl;
}
cout << "Page Fault ";
for(i = 0; i < p_count; i++){
// page fault occurs if hi[i] == True
// hit occurs when hi[i] = false
if(hit[i])
cout << "N ";
else
cout << "Y ";
}
cout << "\n\n";
cout << "Page Fault " << p_count - hitCount << endl;
cout << "Hit " << hitCount << endl;
return 0;
}
Output
Process 7 0 1 2 0 3 0 4 2 3 0 3 2 1
Frame0 7 7 7 2 2 2 2 4 4 4 0 0 0 0
Frame1 - 0 0 0 0 3 3 3 2 2 2 2 2 1
Frame2 - - 1 1 1 1 0 0 0 3 3 3 3 3
Page Fault Y Y Y Y N Y Y Y Y Y Y N N Y
Page Fault 11
Hit 3
Method 3
Using basic arrays and non-stl methods
Program in C++ (Method 3)
This method uses arrays –
// C++ program for FIFO page replacement algorithm
#include <iostream>
using namespace std;
int main()
{
int incomingStream[] = {7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1};
int pageFaults = 0;
int frames = 3;
int m, n, s, pages;
pages = sizeof(incomingStream)/sizeof(incomingStream[0]);
printf("Incoming \t Frame 1 \t Frame 2 \t Frame 3");
int temp[frames];
for(m = 0; m < frames; m++)
{
temp[m] = -1;
}
for(m = 0; m < pages; m++)
{
s = 0;
for(n = 0; n < frames; n++)
{
if(incomingStream[m] == temp[n])
{
s++;
pageFaults--;
}
}
pageFaults++;
if((pageFaults <= frames) && (s == 0))
{
temp[m] = incomingStream[m];
}
else if(s == 0)
{
temp[(pageFaults - 1) % frames] = incomingStream[m];
}
cout << "\n";
cout << incomingStream[m] << "\t\t\t";
for(n = 0; n < frames; n++)
{
if(temp[n] != -1)
cout << temp[n] << "\t\t\t";
else
cout << "- \t\t\t";
}
}
cout << "\n\nTotal Page Faults:\t" << pageFaults;
cout << "\nTotal Hits :\t" << pages - pageFaults;
return 0;
}
Output
Incoming Frame 1 Frame 2 Frame 3 7 7 - - 0 7 0 - 1 7 0 1 2 2 0 1 0 2 0 1 3 2 3 1 0 2 3 0 4 4 3 0 2 4 2 0 3 4 2 3 0 0 2 3 3 0 2 3 2 0 2 3 1 0 1 3 Total Page Faults: 11 Total Hits : 3
Prime Course Trailer
Related Banners
Get PrepInsta Prime & get Access to all 200+ courses offered by PrepInsta in One Subscription
Get over 200+ course One Subscription
Courses like AI/ML, Cloud Computing, Ethical Hacking, C, C++, Java, Python, DSA (All Languages), Competitive Coding (All Languages), TCS, Infosys, Wipro, Amazon, DBMS, SQL and others

Login/Signup to comment