#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define N 10
struct process
{
int f_p;
int j;
int size;
int timer;
int timers;
int get_page;
int pid;
int status;
}num[10]={0};
int p=1,q=0;
int vmem_size[100]={0};
int pmem_size[50]={0},track[10][20]={0},wait_queue[10]={0},temp[10][10]={0};
int creatprocess()
{
int i,j,k=0;
for(i=0;i<10;i++)
{
if(num[i].pid==0)
{
num[i].pid=p;
p++;
break;
}
}
if(i==10)
{
return 0;
}
num[i].f_p=0;
num[i].size=rand()%10+1;
num[i].timers=num[i].timer=rand()%10+1;
num[i].get_page=1+(int) ((num[i].size)*rand()/(RAND_MAX+1.0));
for(j=0;j<50;j++)
{
if(pmem_size[j]==0)
{
k++;
}
if(k==num[i].get_page)
break;
}
if(k<num[i].get_page)
{
num[i].pid=0;
return 0;
}
k=0;
for(j=0;j<50;j++)
{
if(pmem_size[j]==0)
{
pmem_size[j]=num[i].pid;
k++;
}
if(k==num[i].get_page)
break;
}
for(j=0;j<num[i].timer;j++)
{
track[i][j]=rand()%num[i].size+1;
}
num[i].status=0;
for(j=0;j<10;j++)
if(wait_queue[j]==0)
{
wait_queue[j]=num[i].pid;
break;
}
return num[i].pid;
}
void FIFO()
{
int pid,i,j,k,l,flag=1,o=0;
while(1)
{
/*sleep(0.1);*/
o++;
if(o==100)
break;
if(rand()%3==0&&flag==1)
pid=creatprocess();
if(pid==0)
{
flag=0;
}
if(wait_queue[0]<=0)
continue;
for(i=0;i<10;i++)
if(num[i].pid==wait_queue[0]&&num[i].pid!=0)
break;
for(j=1;j<10;j++)
wait_queue[j-1]=wait_queue[j];
if(j==10)
wait_queue[j-1]=0;
num[i].timer--;
num[i].status=1;
/************************************************************************/
/* FIFO算法实现区 */
/************************************************************************/
for(k=0;k<num[i].get_page;k++)
if(track[i][num[i].j]==temp[i][k])
break;
if(k==num[i].get_page)
{
num[i].f_p++;
if(k>1)
{
for(l=k-1;l>0;l--)
{
temp[i][l]=temp[i][l-1];
}
}
temp[i][0]=track[i][num[i].j];
}
num[i].j++;
/************************************************************************/
/* FIFO算法实现区 */
/************************************************************************/
if(num[i].timer==0)
{
printf("Process %d's physical memery size is %d ",num[i].pid,num[i].get_page);
printf("\nProcess %d's execution track is ",num[i].pid);
for(k=0;k<num[i].timers;k++)
{
printf("%2d",track[i][k]);
}
printf("\nProcess %d's missing page probability is %.4f\n",num[i].pid,(float)num[i].f_p/(float)num[i].timers);/*缺页*/
printf("Process %d's physics frame number is ",num[i].pid);
for(k=0;k<50;k++)
if(pmem_size[k]==num[i].pid)
{
printf("%3d",k+1);
pmem_size[k]=0;
}
printf("\n\n");
for(k=0;k<num[i].get_page;k++)
temp[i][k]=0;
num[i].pid=0;
num[i].status=0;
num[i].j=0;
num[i].f_p=0;
flag=1;
}
else
{
num[i].status=0;
for(j=0;j<10;j++)
{
if(wait_queue[j]==0)
{
wait_queue[j]=num[i].pid;
break;
}
}
}
}
for(k=0;k<10;k++)
wait_queue[k]=0;
}
void LRU()
{
int pid,i,j,k,l,flag=1,o=0,t;
for(k=0;k<50;k++)
pmem_size[k]=0;
for(i=0;i<10;i++)
for(k=0;k<10;k++)
temp[i][k]=0;
for(i=0;i<10;i++)
{
num[i].pid=0;
num[i].status=0;
num[i].j=0;
num[i].f_p=0;
}
p=1;
while(1)
{
o++;
if(o==100)
break;
if(rand()%3==0&&flag==1)
pid=creatprocess();
if(pid==0)
{
flag=0;
}
if(wait_queue[0]<=0)
continue;
for(i=0;i<10;i++)
if(num[i].pid==wait_queue[0]&&num[i].pid!=0)
break;
for(j=1;j<10;j++)
wait_queue[j-1]=wait_queue[j];
if(j==10)
wait_queue[j-1]=0;
num[i].timer--;
num[i].status=1;
/************************************************************************/
/* LRU算法实现区 */
/************************************************************************/
for(k=0;k<num[i].get_page;k++)
if(track[i][num[i].j]==temp[i][k])
break;
if(k==num[i].get_page)
{
num[i].f_p++;
if(k>1)
{
for(l=k-1;l>0;l--)
{
temp[i][l]=temp[i][l-1];
}
}
temp[i][0]=track[i][num[i].j];
}
else
{
t=temp[i][0];
temp[i][0]=temp[i][k];
for(j=k;j>0;j--)
{
if(j==1)
{
temp[i][j]=t;
}
else
{
temp[i][j]=temp[i][j-1];
}
}
}
num[i].j++;
/************************************************************************/
/* LRU算法实现区 */
/************************************************************************/
if(num[i].timer==0)
{
printf("Process %d's physical memery size is %d ",num[i].pid,num[i].get_page);
printf("\nProcess %d's execution track is ",num[i].pid);
for(k=0;k<num[i].timers;k++)
{
printf("%2d",track[i][k]);
}
printf("\nProcess %d's missing page probability is %.4f\n",num[i].pid,(float)num[i].f_p/(float)num[i].timers);/*缺页*/
printf("Process %d's physics frame number is ",num[i].pid);
for(k=0;k<50;k++)
if(pmem_size[k]==num[i].pid)
{
printf("%3d",k+1);
pmem_size[k]=0;
}
printf("\n\n");
for(k=0;k<num[i].get_page;k++)
temp[i][k]=0;
num[i].pid=0;
num[i].status=0;
num[i].j=0;
num[i].f_p=0;
flag=1