In: Computer Science
Write Algoritm , code and output.
In Operating Systems ,
26. Implement a program to allocate memory by applying the following strategies.a
.FIRST FIT
b.BEST FIT
c.WORST FIT
(a) First Fit
Algorithm:
1- Input memory blocks with size and processes with size. 2- Initialize all memory blocks as free. 3- Start by picking each process and check if it can be assigned to current block. 4- If size-of-process <= size-of-block if yes then assign and check for next process. 5- If not then keep checking the further blocks.
code:
// C++ implementation of First - Fit algorithm
#include<bits/stdc++.h>
using namespace std;
// Function to allocate memory to
// blocks as per First fit algorithm
void firstFit(int blockSize[], int m,
int
processSize[], int n)
{
// Stores block id of the
// block allocated to a process
int allocation[n];
// Initially no block is assigned to any
process
memset(allocation, -1, sizeof(allocation));
// pick each process and find suitable blocks
// according to its size ad assign to it
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m;
j++)
{
if (blockSize[j]
>= processSize[i])
{
// allocate block j to p[i] process
allocation[i] = j;
// Reduce available memory in this block.
blockSize[j] -= processSize[i];
break;
}
}
}
cout << "\nProcess No.\tProcess Size\tBlock
no.\n";
for (int i = 0; i < n; i++)
{
cout << " " << i+1
<< "\t\t"
<<
processSize[i] << "\t\t";
if (allocation[i] != -1)
cout <<
allocation[i] + 1;
else
cout <<
"Not Allocated";
cout << endl;
}
}
// Driver code
int main()
{
int blockSize[] = {100, 500, 200, 300, 600};
int processSize[] = {212, 417, 112, 426};
int m = sizeof(blockSize) /
sizeof(blockSize[0]);
int n = sizeof(processSize) /
sizeof(processSize[0]);
firstFit(blockSize, m, processSize, n);
return 0 ;
}
Input : blockSize[] = {100, 500, 200, 300, 600}; processSize[] = {212, 417, 112, 426};
Output :
Process No. Process Size Block no. 1 212 2 2 417 5 3 112 2 4 426 Not Allocated
(b) Best Fit:
Algorithm:
1- Input memory blocks and processes with sizes. 2- Initialize all memory blocks as free. 3- Start by picking each process and find the minimum block size that can be assigned to current process i.e., find min(bockSize[1], blockSize[2],.....blockSize[n]) > processSize[current], if found then assign it to the current process. 5- If not then leave that process and keep checking the further processes.
Code:
// C++ implementation of Best - Fit algorithm
#include<bits/stdc++.h>
using namespace std;
// Function to allocate memory to blocks as per Best fit
// algorithm
void bestFit(int blockSize[], int m, int processSize[], int
n)
{
// Stores block id of the block allocated to a
// process
int allocation[n];
// Initially no block is assigned to any
process
memset(allocation, -1, sizeof(allocation));
// pick each process and find suitable blocks
// according to its size ad assign to it
for (int i=0; i<n; i++)
{
// Find the best fit block for
current process
int bestIdx = -1;
for (int j=0; j<m; j++)
{
if (blockSize[j]
>= processSize[i])
{
if (bestIdx == -1)
bestIdx = j;
else if (blockSize[bestIdx] >
blockSize[j])
bestIdx = j;
}
}
// If we could find a block for
current process
if (bestIdx != -1)
{
// allocate
block j to p[i] process
allocation[i] =
bestIdx;
// Reduce
available memory in this block.
blockSize[bestIdx] -= processSize[i];
}
}
cout << "\nProcess No.\tProcess Size\tBlock
no.\n";
for (int i = 0; i < n; i++)
{
cout << " " << i+1
<< "\t\t" << processSize[i] << "\t\t";
if (allocation[i] != -1)
cout <<
allocation[i] + 1;
else
cout <<
"Not Allocated";
cout << endl;
}
}
// Driver code
int main()
{
int blockSize[] = {100, 500, 200, 300, 600};
int processSize[] = {212, 417, 112, 426};
int m = sizeof(blockSize)/sizeof(blockSize[0]);
int n =
sizeof(processSize)/sizeof(processSize[0]);
bestFit(blockSize, m, processSize, n);
return 0 ;
}
Input : blockSize[] = {100, 500, 200, 300, 600}; processSize[] = {212, 417, 112, 426};
Output:
Process No. Process Size Block no. 1 212 4 2 417 2 3 112 3 4 426 5
(c) Worst Fit:
Algorithm:
1- Input memory blocks and processes with sizes. 2- Initialize all memory blocks as free. 3- Start by picking each process and find the maximum block size that can be assigned to current process i.e., find max(bockSize[1], blockSize[2],.....blockSize[n]) > processSize[current], if found then assign it to the current process. 5- If not then leave that process and keep checking the further processes.
Code:
// C++ implementation of worst - Fit algorithm
#include<bits/stdc++.h>
using namespace std;
// Function to allocate memory to blocks as per worst fit
// algorithm
void worstFit(int blockSize[], int m, int processSize[],
int
n)
{
// Stores block id of the block allocated to a
// process
int allocation[n];
// Initially no block is assigned to any
process
memset(allocation, -1, sizeof(allocation));
// pick each process and find suitable blocks
// according to its size ad assign to it
for (int i=0; i<n; i++)
{
// Find the best fit block for
current process
int wstIdx = -1;
for (int j=0; j<m; j++)
{
if (blockSize[j]
>= processSize[i])
{
if (wstIdx == -1)
wstIdx = j;
else if (blockSize[wstIdx] <
blockSize[j])
wstIdx = j;
}
}
// If we could find a block for
current process
if (wstIdx != -1)
{
// allocate
block j to p[i] process
allocation[i] =
wstIdx;
// Reduce
available memory in this block.
blockSize[wstIdx] -= processSize[i];
}
}
cout << "\nProcess No.\tProcess Size\tBlock
no.\n";
for (int i = 0; i < n; i++)
{
cout << " " << i+1
<< "\t\t" << processSize[i] << "\t\t";
if (allocation[i] != -1)
cout <<
allocation[i] + 1;
else
cout <<
"Not Allocated";
cout << endl;
}
}
// Driver code
int main()
{
int blockSize[] = {100, 500, 200, 300, 600};
int processSize[] = {212, 417, 112, 426};
int m = sizeof(blockSize)/sizeof(blockSize[0]);
int n =
sizeof(processSize)/sizeof(processSize[0]);
worstFit(blockSize, m, processSize, n);
return 0 ;
}
Input : blockSize[] = {100, 500, 200, 300, 600}; processSize[] = {212, 417, 112, 426}; Output: Process No. Process Size Block no. 1 212 5 2 417 2 3 112 5 4 426 Not Allocated