最佳置换OPI算法
#include<stdio.h>
struct OPT
{
int Data[100];
int make;
}bel[10];
int y[100];
int minlong;
int take=0; //从后往前查找的序列数
int k=0;
int main()
{
int i,j,z;
int p=1;
int n1,n2;
printf("分配物理块数量:");
scanf("%d",&n1);
printf("页面号引用串数量:");
scanf("%d",&n2);
for(i=1;i<=n2;i++) scanf("%d",&y[i]);
for(j=1;j<=n1;j++) bel[j].make=0;
for(j=1;j<=n1;j++) { bel[p].Data[j]=y[j]; printf("%2d",bel[p].Data[j]); } //先把前三个页面号插入物理块中
printf("\n");
for(j=n1+1;j<=n2;j++)
{
for(i=1;i<=3;i++) if(y[j]!=bel[p].Data[i]) k++;
if(k==3)
{
for(i=n2;i>j;i--) for(z=1;z<=n1;z++) if(bel[p].Data[z]==y[i]) { take++; bel[z].make=take; }
minlong=bel[1].make;
for(i=2;i<=n1;i++) if(bel[i].make<minlong) minlong=bel[i].make;
for(i=1;i<=n1;i++) if(bel[i].make==minlong) { bel[p].Data[i]=y[j]; break; }
for(i=1;i<=n1;i++) printf("%2d",bel[p].Data[i]); printf("\n");
for(i=1;i<=n1;i++) bel[i].make=0;
take=0;
}
k=0;
}
return 0;
}
银行家算法
#include<stdio.h>
struct Dijkstra
{
int Max[10];
int Allocation[10];
int Available[10];
int Work[10];
}Dij[10];
int a[10];
int f[10];
int main()
{
int k=1,w=1;
int count=0;
int i,j,g,q,p,z;
int n1,n2;
printf("输入系统中的进程数目:");
scanf("%d",&n1);
printf("输入资源数目:");
scanf("%d",&n2);
//
for(i=1;i<=n1;i++)
{
printf("第%d个进程需要这%d类资源的最大数目",i,n2);
for(j=1;j<=n2;j++)
{
scanf("%d",&Dij[i].Max[j]);
}
}
for(i=1;i<=n1;i++)
{
printf("第%d个进程已分得这%d类资源的数目",i,n2);
for(j=1;j<=n2;j++)
{
scanf("%d",&Dij[i].Allocation[j]);
}
}
printf("分得这%d种资源数量分别为:",n2);
for(i=1;i<=n2;i++) scanf("%d",&Dij[0].Available[i]);
for(i=1;i<=n2;i++)
{
for(j=1;j<=n1;j++)
Dij[0].Available[i]=Dij[0].Available[i]-Dij[j].Allocation[i];
}
for(i=1;i<=n2;i++)
for(j=1;j<=n1;j++)
{
Dij[i].Work[j]=Dij[0].Available[j];
}
for(p=1;p<=n1;p++)
{
if(k==(n1+1))
{ for(q=1;q<=n1-1;q++) { printf("%d->",a[q]); } printf("%d",a[n1]); break; }
else
{
for(i=1;i<=n1;i++)
{
for(j=1;j<=n2;j++) if(Dij[i].Allocation[j]+Dij[w].Work[j]>=Dij[i].Max[j]) count++;
if(count==n2&&f[i]==0)
{ a[k]=i;
k++;
f[i]=1;
for(z=1;z<=n2;z++)
Dij[i].Work[z]=Dij[w].Work[z]+Dij[i].Allocation[z];
w=i;
}
}
}
}
return 0;
}
先进先出FIFO算法
#include<stdio.h>
struct FIFO
{
int Data[100];
}bel[10];
int y[100];
int take=0;
int k=0;
int main()
{
int i,j;
int p=1,count;
int n1,n2;
printf("分配物理块数量:");
scanf("%d",&n1);
printf("页面号引用串数量:");
scanf("%d",&n2);
for(i=1;i<=n2;i++) scanf("%d",&y[i]);
for(j=1;j<=n1;j++) { bel[p].Data[j]=y[j]; printf("%2d",bel[p].Data[j]); } printf("\n");
for(j=n1+1;j<=n2;j++)
{
for(i=1;i<=3;i++) if(y[j]!=bel[p].Data[i]) k++;
if(k==3)
{
take++;
count=take%3;
if(count!=0)
{ bel[p].Data[count]=y[j]; for(i=1;i<=n1;i++) printf("%2d",bel[p].Data[i]); printf("\n"); }
else
{ bel[p].Data[3]=y[j]; for(i=1;i<=n1;i++) printf("%2d",bel[p].Data[i]); printf("\n"); }
}
k=0;
}
return 0;
}
先到先服务算法
#include<stdio.h>
struct FCFS
{
int arrive;
int serve;
int start;
int finish;
int turn;
}a[10],b[10];
int n;
int main()
{
int i,k,j;
int tmp;
int c[11]={0,1,2,3,4,5,6,7,8,9,10};
printf("请输入进程数:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{ printf("\n");
printf("第%d个进程\n",i);
printf("到达时间:");
scanf("%d",&a[i].arrive);
printf("服务时间:");
scanf("%d",&a[i].serve);
}
for(i=1;i<=n;i++)
{
k=i;
for(j=i+1 ;j<=n; j++) {
if(a[k].arrive>=a[j].arrive) k = j;
}
b[i].arrive=a[k].arrive;
b[i].serve=a[k].serve;
tmp = a[i].arrive; a[i].arrive = a[k].arrive; a[k].arrive = tmp;
}
printf("程序 到达时间 运行时间 开始时间 完成时间 周转时间\n");
b[1].start=b[1].arrive;
b[1].finish=b[1].serve+b[1].arrive;
b[1].turn=b[1].finish-b[1].arrive;
printf("%2.d%10.d%10d%10.d%10.d%10.d\n",c[1],b[1].arrive,b[1].serve,b[1].start,b[1].finish,b[1].turn);
for(i=2;i<=n;i++)
{
b[i].start=b[i-1].finish;
if(b[i].start<b[i].arrive)
{
b[i].finish=b[i].arrive+b[i].serve;
b[i].turn=b[i].finish-b[i].arrive;
printf("%2.d%10.d%10d%10.d%10.d%10.d\n",c[i],b[i].arrive,b[i].serve,b[i].arrive,b[i].finish,b[i].turn);
}
else
{
b[i].finish=b[i].start+b[i].serve;
b[i].turn=b[i].finish-b[i].arrive;
printf("%2.d%10.d%10d%10.d%10.d%10.d\n",c[i],b[i].arrive,b[i].serve,b[i].start,b[i].finish,b[i].turn);
}
}
return 0;
}
短作业优先算法
#include<stdio.h>
struct SJF
{
int arrive;
int serve;
int start;
int finish;
int turn;
}a[10],b[10];
int n;
int main()
{
int i,k,j,f;
int tmp,tep;
int c[11]={0,1,2,3,4,5,6,7,8,9,10};
printf("请输入进程数:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{ printf("\n");
printf("第%d个进程\n",i);
printf("到达时间:");
scanf("%d",&a[i].arrive);
printf("服务时间:");
scanf("%d",&a[i].serve);
}
for(i=1;i<=n;i++)
{
k=i;
for(j=i+1 ;j<=n; j++) {
if(a[k].serve>=a[j].serve) k = j;
}
b[i].arrive=a[k].arrive;
b[i].serve=a[k].serve;
tmp = a[i].serve; a[i].serve= a[k].serve; a[k].serve = tmp;
}
for(f=1;f<=n;f++)
{
k=f;
for(j=f+1 ;j<=n; j++) {
if(b[k].arrive>b[j].serve+b[j].arrive) k = j;
}
tep = b[f].arrive; b[f].arrive= a[k].arrive; a[k].arrive = tep;
tmp = b[f].serve; b[f].serve= b[k].serve; b[k].serve = tmp;
}
printf("程序 到达时间 运行时间 开始时间 完成时间 周转时间\n");
b[1].start=b[1].arrive;
b[1].finish=b[1].serve+b[1].arrive;
b[1].turn=b[1].finish-b[1].arrive;
printf("%2.d%10.d%10d%10.d%10.d%10.d\n",c[1],b[1].arrive,b[1].serve,b[1].start,b[1].finish,b[1].turn);
for(i=2;i<=n;i++)
{
b[i].start=b[i-1].finish;
if(b[i].start<b[i].arrive)
{
b[i].finish=b[i].arrive+b[i].serve;
b[i].turn=b[i].finish-b[i].arrive;
printf("%2.d%10.d%10d%10.d%10.d%10.d\n",c[i],b[i].arrive,b[i].serve,b[i].arrive,b[i].finish,b[i].turn);
}
else
{
b[i].finish=b[i].start+b[i].serve;
b[i].turn=b[i].finish-b[i].arrive;
printf("%2.d%10.d%10d%10.d%10.d%10.d\n",c[i],b[i].arrive,b[i].serve,b[i].start,b[i].finish,b[i].turn);
}
}
return 0;
}