Download as pdf or txt
Download as pdf or txt
You are on page 1of 16

#include<stdlib.

h>
#include<stdio.h>
#include <stdbool.h>
#define MAX_FRAME 3
typedef struct t_process
{
int process_id;
int last_acc;
int time_in_frame;
int next_acc;
}process;

int main()
{
int menu1,menu2,default_para[12]={0, 2, 1, 6, 4, 0, 1, 0, 3, 1, 2,
1},no_para,new_para[20],i,j,result[MAX_FRAME+2][20],pagef;
for(i=0;i<MAX_FRAME+2;i++)
for(j=0;j<20;j++)
result[i][j] = -1;
bool is_default_para;
printf("--Page Replacement algorithm--\n");
printf("1. Chuoi tham chieu mac dinh\n");
printf("2. Nhap chuoi tham chieu bang tay\n");
scanf("%d",&menu1);
switch(menu1)
{
case 1:is_default_para = true;no_para = 12;

1
for(i=0;i<no_para;i++)
result[0][i]=default_para[i];
break;
case 2:is_default_para = false;
printf("-Nhap vao chuoi tham chieu (<=20):");
resume:
scanf("%d",&no_para);
if(no_para>20)
{
printf("-ERR: chuoi tham chieu nhap nhap vao khong duoc
lon hon 21\n");
goto resume;
}
printf("-Nhap vao chuoi tham chieu moi:\n");
for(i=0;i<no_para;i++)
{
scanf("%d",&(new_para[i]));
result[0][i]=new_para[i];
}

break;
default: printf("-ERR: Lua chon ban yeu cau khong co trong menu
lua chon\n");return;
}
if(is_default_para)
output_para(default_para,no_para);
else

2
output_para(new_para,no_para);
printf("------Page Replacement algorithm-----\n");
printf("1. Giai thuat FIFO\n");
printf("2. Giai thuat OPT (optimmal)\n");
printf("3. Giai thuat LRU\n");
scanf("%d",&menu2);
switch(menu2)
{
case 1:printf("---GIAI THUAT THAY THE TRANG FIFO---\n");
pagef = FIFO(&result,no_para);
break;
case 2:printf("---GIIAI THUAT THAY THE TRANG OPT---\n");
pagef = OTP(&result,no_para);
break;
case 3:printf("---GAII THUAT THAY THE TRANG LRU---\n");
pagef = LRU(&result,no_para);
break;
default: printf("-ERR: Lua chon ban nhap khong co trong menu
lua chon\n");return;
}
printf("-result: \n");
for(i=0;i<MAX_FRAME+2;i++)
{
for(j=0;j<no_para;j++)
{
if(i == (MAX_FRAME +1))
{

3
if(result[i][j]==1)
printf(" * ");
else
printf(" ");
}
else
{
if(result[i][j]!=-1)
printf(" %d ",result[i][j]);
else
printf(" ");
}
}
printf("\n");
}
printf("-So loi trang la: %d\n",pagef);
}

void output_para(int* a,int no_para)


{
int i;
for(i=0;i<no_para;i++)
printf(" %d",a[i]);
printf("\n");
}

int FIFO(int *result[MAX_FRAME+2][20],int no_para)

4
{
//declare
process processes[MAX_FRAME];
bool is_found = false;
int i,j,time_in_frame_max,pos,pos_emtpy,num_page_faults=1;
//initial value for processes
for(i=0;i<MAX_FRAME;i++)
processes[i].last_acc = processes[i].next_acc = processes[i].pro-
cess_id = processes[i].time_in_frame = -1;

result[1][0]=result[0][0];
processes[0].process_id=result[0][0];
processes[0].time_in_frame = 0;
//Identify whether process is in frame
for(i=0;i<no_para;i++)
{
is_found = false;
for(j=1;j<MAX_FRAME+1;j++)
{
if(result[0][i]==result[j][i])
{
is_found = true;
break;
}
}
result[1+MAX_FRAME][i]=0;
//Replace or insert process if process id not found in frames

5
if(!is_found)
{
result[1+MAX_FRAME][i]=1;
pos_emtpy = NULL;
pos = NULL;
for(j=1;j<MAX_FRAME+1;j++)
{
if(processes[j-1].process_id==-1)
{
pos_emtpy = j-1;
break;
}
if(j==1)
{
time_in_frame_max = processes[j-1].time_in_frame;
pos = j-1;
}
else
{
if(processes[j-1].time_in_frame> time_in_frame_max)
{
time_in_frame_max = processes[j-1].time_in_frame;
pos = j-1;
}
}
}
if(pos_emtpy!=NULL)

6
{
processes[pos_emtpy].process_id = result[0][i];
processes[pos_emtpy].time_in_frame=0;
result[pos_emtpy+1][i]= result[0][i];
}
else
{
processes[pos].process_id = result[0][i];
processes[pos].time_in_frame=0;
result[pos+1][i]= result[0][i];
}

}
if(i<no_para-1)
{
for(j=1;j<MAX_FRAME+1;j++)
{
result[j][i+1]=result[j][i];
processes[j-1].time_in_frame ++;
}
}
if(result[1+MAX_FRAME][i]==1)
num_page_faults++;
}
result[1+MAX_FRAME][0] = 1;
return num_page_faults;
}

7
int OTP(int *result[MAX_FRAME+2][20],int no_para)
{

//declare
process processes[MAX_FRAME];
bool is_found = false;
int i,j,z,pos_next_acc_max,pos,pos_emtpy,pos_next_acc = -
1,pos_founded,num_page_faults=1;
//initial value for processes
for(i=0;i<MAX_FRAME;i++)
processes[i].last_acc = processes[i].next_acc = processes[i].pro-
cess_id = processes[i].time_in_frame = -1;

result[1][0]=result[0][0];
processes[0].process_id=result[0][0];
//Identify whether process is in frame
for(i=0;i<no_para;i++)
{
is_found = false;
for(j=1;j<MAX_FRAME+1;j++)
{
if(result[0][i]==result[j][i])
{
is_found = true;
pos_founded =j-1;
break;
}

8
}
result[1+MAX_FRAME][i]=0;
//Replace or insert process if process id not found in frames
if(!is_found)
{
result[1+MAX_FRAME][i]=1;
pos_emtpy = NULL;
pos = NULL;
for(j=1;j<MAX_FRAME+1;j++)
{
if(processes[j-1].process_id==-1)
{
pos_emtpy = j-1;
break;
}
if(j==1)
{
pos_next_acc_max = processes[j-1].next_acc;
pos = j-1;
}
else
{
if(processes[j-1].next_acc> pos_next_acc_max)
{
pos_next_acc_max = processes[j-1].next_acc;
pos = j-1;
}

9
}
}
if(pos_emtpy!=NULL)
{
processes[pos_emtpy].process_id = result[0][i];
result[pos_emtpy+1][i]= result[0][i];
pos_next_acc=NULL;
for(z=i+1;z<no_para;z++)
if(result[0][z]==result[0][i])
{
pos_next_acc = z;
break;
}
if(pos_next_acc!=NULL)
processes[pos_emtpy].next_acc = pos_next_acc;
else
processes[pos_emtpy].next_acc = 1000;
}
else
{
processes[pos].process_id = result[0][i];
result[pos+1][i]= result[0][i];
pos_next_acc=NULL;
for(z=i+1;z<no_para;z++)
if(result[0][z]==result[0][i])
{
pos_next_acc = z;

10
break;
}
if(pos_next_acc!=NULL)
processes[pos].next_acc = pos_next_acc;
else
processes[pos].next_acc = 1000;
}
}
else
{
pos_next_acc=NULL;
for(z=i+1;z<no_para;z++)
if(result[0][z]==result[0][i])
{
pos_next_acc = z;
break;
}
if(pos_next_acc!=NULL)
processes[pos_founded].next_acc = pos_next_acc;
else
processes[pos_founded].next_acc = 1000;

}
if(i<no_para-1)
{
for(j=1;j<MAX_FRAME+1;j++)
{

11
result[j][i+1]=result[j][i];
//processes[j-1].time_in_frame ++;
}
}
if(result[1+MAX_FRAME][i]==1)
num_page_faults++;
}
result[1+MAX_FRAME][0] = 1;
return num_page_faults;
}
int LRU(int *result[MAX_FRAME+2][20],int no_para)
{
//declare
process processes[MAX_FRAME];
bool is_found = false;
int i,j,last_acc_min,pos,pos_emtpy,pos_founded,num_page_faults=1;
//initial value for processes
for(i=0;i<MAX_FRAME;i++)
{
processes[i].process_id = -1;
processes[i].last_acc = 1000;
}

result[1][0]=result[0][0];
processes[0].process_id=result[0][0];
//processes[0].time_in_frame = 0;

12
//Identify whether process is in frame
for(i=0;i<no_para;i++)
{
is_found = false;
for(j=1;j<MAX_FRAME+1;j++)
{
if(result[0][i]==result[j][i])
{
is_found = true;
pos_founded = j-1;
break;
}
}
result[1+MAX_FRAME][i]=0;
//Replace or insert process if process id not found in frames
if(!is_found)
{
result[1+MAX_FRAME][i]=1;
pos_emtpy = NULL;
pos = NULL;
for(j=1;j<MAX_FRAME+1;j++)
{
if(processes[j-1].process_id==-1)
{
pos_emtpy = j-1;
break;
}

13
if(j==1)
{
last_acc_min = processes[j-1].last_acc;
pos = j-1;
}
else
{
if(processes[j-1].last_acc < last_acc_min)
{
last_acc_min = processes[j-1].last_acc;
pos = j-1;
}
}
}
if(pos_emtpy!=NULL)
{
processes[pos_emtpy].process_id = result[0][i];
processes[pos_emtpy].last_acc=i;
result[pos_emtpy+1][i]= result[0][i];
//printf("-DEBUG1 i, proces id, pos, last acc %d %d %d
%d\n",i,processes[pos_emtpy].process_id,pos_emtpy,pro-
cesses[pos_emtpy].last_acc);
}
else
{
processes[pos].process_id = result[0][i];
processes[pos].last_acc=i;

14
result[pos+1][i]= result[0][i];
//printf("-DEBUG2 i, proces id, pos, last acc %d %d %d
%d\n",i,processes[pos].process_id,pos,processes[pos].last_acc);
}

}
else
{
processes[pos_founded].last_acc=i;
//printf("-DEBUG3 i, proces id, pos, last acc %d %d %d
%d\n",i,processes[pos_founded].process_id,pos_founded,pro-
cesses[pos_founded].last_acc);
//result[pos_founded+1][i]= result[0][i];
}
if(i<no_para-1)
{
for(j=1;j<MAX_FRAME+1;j++)
{
result[j][i+1]=result[j][i];
processes[j-1].time_in_frame ++;
}
}
if(result[1+MAX_FRAME][i]==1)
num_page_faults++;
//printf("-DEBUG\n");
}
result[1+MAX_FRAME][0] = 1;

15
return num_page_faults;
}

16

You might also like