⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 opration.c

📁 这是一个简单的用C语言实现进程五个状态的变化,各进程的状态变化都用一个函数来实现
💻 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 + -