📄 opration.c
字号:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define NEW 1
#define RUN 2
#define READY 3
#define BLOCKED 4
#define EXIT 5
int num;
typedef struct pcb
{
int id;
int rneed;
int state;
int runtime;
struct pcb *next;
}pcb,*Pcb;
Pcb ready=NULL,blocked=NULL,running=NULL;
void newprocess()
{
Pcb newp,p;
int r;
printf("input resourse the process needed:");
scanf("%d",&r);
newp=(pcb *)malloc(sizeof(pcb));
p=(pcb *)malloc(sizeof(pcb));
newp->id=num++;
newp->rneed=r;
newp->runtime=0;
newp->state=READY;
newp->next=NULL;
if(ready!=NULL)
{
for(p=ready;p->next!=NULL;p=p->next);
p->next=newp;
}
else
{
ready=newp;
}
printf("process %d creat success!\n",newp->id);
}
void dispatch()
{
running=ready;
ready=ready->next;
running->next=NULL;
running->state=RUN;
}
void release()
{
Pcb p;
printf("\nNO.%d process is finished and exit!",running->id);
p=running;
running=NULL;
p->state=EXIT;
num--;
free(p);
}
void timeout()
{
Pcb p;
p=(pcb *)malloc(sizeof(pcb));
if(ready!=NULL)
{
for(p=ready;p->next!=NULL;p=p->next);
p->next=running;
}
else ready=running;
running->state=READY;
running=NULL;
}
void eventwait()
{
Pcb p;
p=(pcb *)malloc(sizeof(pcb));
if(blocked!=NULL)
{
for(p=blocked;p->next!=NULL;p=p->next);
p->next=running;
}
else
blocked=running;
running->state=BLOCKED;
running=NULL;
}
void eventoccure()
{
Pcb p,qr;
p=(pcb *)malloc(sizeof(pcb));
qr=(pcb *)malloc(sizeof(pcb));
p=blocked;
blocked=blocked->next;
if(ready!=NULL)
{
for(qr=ready;qr->next!=NULL;qr=qr->next);
qr->next=p;
}
else ready=p;
p->state=READY;
p->next=NULL;
}
void main()
{
int n,i,event=0;
Pcb q;
printf("intput number of new process!\n");
scanf("%d",&n);
if(n>20||n<=0)
printf("system can't support more than 20 processes!\n");
else
{
for(i=0;i<n;i++)
newprocess();
}
printf("\n\n\n");
while(ready!=NULL||blocked!=NULL||running!=NULL)
{
event++;
printf("id\tstate\n");
if(ready!=NULL)
for(q=ready;q!=NULL;q=q->next)
printf("%d\t%d\n",q->id,q->state);
if(running==NULL&&ready!=NULL)
dispatch();
if(running!=NULL)
{
q=running;
printf("\n%d\t%d\n",q->id,q->state);
if(running->rneed==0)
release();
else
{
running->rneed--;
running->runtime++;
}
}
if(running!=NULL&&running->runtime==3)
timeout();
if(running!=NULL&&event==2)
{ eventwait(); event=0;}
if(blocked!=NULL)
for(q=blocked;q!=NULL;q=q->next)
printf("\n%d\t%d\n",q->id,q->state);
if((blocked!=NULL)&&(event%2))
eventoccure();
getch();
printf("\n\n");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -