#include<stdio.h>
#include<alloc.h>
#include<stdlib.h>
#include<dos.h>
#define MAX 10
struct process
{
int num;
unsigned int intime;
struct information
{
int priority;
unsigned int exetucetime;
}information;
unsigned int outtime;
int state;
struct process* next;
}*Node[MAX],*out;
int CreatePCB()
{
int i=0,k;
char ch;
do
{
i++;
Node[i]=(struct process*)malloc(sizeof(struct process));
printf("please enter inform of process%d:\n",i);
Node[i]->num=i;
Node[i]->intime=clock();
printf("please enter priority:");
scanf("%d",&(Node[i]->information).priority);
printf("please enter exetucetime:");
scanf("%u",&(Node[i]->information).exetucetime);
Node[i]->state=1;
printf("Continue create PCB?(Y/N):");
getchar();
ch=getchar();
}while(ch=='Y'||ch=='y');
return i;
}
struct process* FCFS(int n)
{
int i;
struct process *head1,*p;
head1=(struct process*)malloc(sizeof(struct process));
head1->next=NULL;
p=head1;
for(i=n;i>=1;i--)
{
p=Node[i];
p->next=head1->next;
head1->next=p;
}
return head1;
}
struct process* FPF(int n)
{
int min,x,i,j,a[MAX],k,b[MAX];
struct process *head2,*p;
head2=(struct process*)malloc(sizeof(struct process));
head2->next=NULL;
p=head2;
for(i=1;i<=MAX;i++)
{
a[i]=0;
b[i]=1;
}
x=1;
for(i=1;i<=n;i++)
{
k=i;
if(b[i]!=-1) min=Node[i]->information.priority;
else continue;
for(j=1;j<=n;j++)
{
if(b[j]!=-1&&min>Node[j]->information.priority)
{
k=j;
min=Node[j]->information.priority;
}
}
b[k]=-1;
a[x]=Node[k]->num;
x++;
}
for(i=1;i<=n;i++)
{
p=Node[a[i]];
p->next=head2->next;
head2->next=p;
}
return head2;
}
void dele(int i,int n)
{
if(n==0) printf("You donot Create Process!\n");
else if(i>n) printf("Not the Process!\n");
else
{
Node[i]->num=0;
}
}
void SweapOut(int outnum,int n)
{
int i;
out=(struct process*)malloc(sizeof(struct process));
for(i=1;i<n;i++)
{
if((Node[i]->num)==outnum)
{
out=Node[i];
out->state=0;
break;
}
}
}
void SweapIn()
{
int runtime=0;
out->state=1;
printf("--------**********************************************---------\n");
printf("num\tpriority\tneedtime\truntime\t\tintime\t\touttime\n");
while((out->information).exetucetime>0)
{
runtime++;
printf("%2d",out->num);
printf("%10d",(out->information).priority);
printf("%17u",(out->information).exetucetime);
printf("%17d",runtime);
out->outtime=(out->intime)+(out->information).exetucetime;;
printf("%17u%16u\n",out->intime,out->outtime);
(out->information).exetucetime--;
sleep(1);
}
printf("--------**********************************************---------\n");
}
void menu()
{
printf("\t\t***********************************************\n");
printf("\t\t| 1.Cteate Process! |\n");
printf("\t\t| 2.Delete Process! |\n");
printf("\t\t| 3.Weap out Process! |\n");
printf("\t\t| 4.Weap in Process! |\n");
printf("\t\t| 5.FCFS! |\n");
printf("\t\t| 6.FPF! |\n");
printf("\t\t| 7.OVER! |\n");
printf("\t\t***********************************************\n");
printf("Please you select:");
}
void FCFS_FPF(struct process *head,int n)
{
int i=0,j,runtime;
struct process *p;
p=head->next;
i=0;
printf("Jin Chen Zhi Xing Gou Cheng Ru Xia(FCFS):\n");
for(i=1;i<=n;i++)
{
runtime=0;
if(p->num==0||p->state==0) {p=p->next;continue;}
printf("%d prosess exetuce information:\n",i);
printf("--------**************************************************************---------\n");
printf("num\tpriority\tneedtime\truntime\t\tintime\t\touttime\n");
j=(p->information).exetucetime;
while(j>0)
{
runtime++;
printf("%2d",p->num);
printf("%10d",(p->information).priority);
printf("%17u",j);
printf("%15d",runtime);
p->outtime=(p->intime)+(p->information).exetucetime;
printf("%17u%16u\n",p->intime,p->outtime);
j--;
sleep(1);
}
printf("--------**************************************************************---------\n\n\n");
p=p->next;
}
}
void main()
{
int i=0,n=0,m,num,sign,k,j;
int k1=0,k2=0,k3=0,k4=0;
struct process *head,*p;
while(1)
{
menu();
scanf("%d",&sign);
if(sign==1)
{
n=CreatePCB();k1=1;
}
else if(sign==2)
{
if(k1==1)
{
if((k3==0)&&(k4==0))
{
printf("Cteate process of :");
for(j=1;j<=n;j++)
printf("%d ",Node[j]->num);
printf("\n");
printf("Please input num of delete process:");
scanf("%d",&k);
dele(k,n);
}
else printf("Process exetuce over!\n");
}
else printf("You don't cteate process!\n");
}
else if(sign==3)
{
printf("please intput num of sweapout process:");
scanf("%d",&num);
SweapOut(num,n);
k2=1;
}
else if(sign==4)
{
if(k2==1)
SweapIn();
else printf("You don't sweapout process!\n");
}
else if(sign==5)
{
if(n==0)
printf("You donot Create Process!\n");
else
{
if(k4==0)
{
head=FCFS(n);
FCFS_FPF(head,n);
k3=1;
}
else printf("Process exetuce over!\n");
}
}
else if(sign==6)
{
if(n==0)
printf("You donot Create Process!\n");
else
{
if(k3==0)
{
head=FPF(n);
FCFS_FPF(head,n);
k4=1;
}
else printf("Process exetuce over!\n");
}
}
else if(sign==7) break;
i++;
}
printf("OVER!\n");
scanf("%d",&m);
}