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

📄 jincheng1.cpp

📁 次实验是进程调度,为了不让大家花太多的确时间去写程序,现在把它贡献出来
💻 CPP
字号:
#include <stdio.h>
int m1;
int m2;
struct{
    int id;
	int waiter1;
	int priority;
	char status;
}pcb[4];
struct{
    int value;
	int waiter2;
}sem[3];
char stack[11][4];
int i,ep;
char addr;
void init();
int find();
int w2();
int process1();
int process2();
int process3();
int p(int,int ,char);
int v(int,int ,char);

main(){
	 init();
    printf("系统程序开始执行\n");
	 for(;;)
{	if( find()!=0 )  w2();
		else  break;        	
}
	 printf("系统程序结束\n");
}

void init(){
    int j,k;
	pcb[0].status='w';     	pcb[0].priority=4;
	for(j=1;j<=3;j++)
{  pcb[j].id=j;
		pcb[j].status='r';
		pcb[j].waiter1=0;
		pcb[j].priority=j;
	}
	for(j=1;j<=2;j++)
{  sem[j].value=1;
		sem[j].waiter2=0;
	}
    i=0;	 ep=0;	  addr='0';	     m1=0;  	m2=0;
	for(j=1;j<=10;j++)
{
	    for(k=1;k<=3;k++)
		stack[j][k]='0';
	}
}

int find(){
    int j;
	for(j=1;j<=3;j++)
	    if(pcb[j].status=='r') return(j);
	return(0);
}

int w2(){
    int pd;
	pd=find();
	if(pd==0) return(0);
	else if(ep==0){
	    pcb[pd].status='e';
		ep=pd;
		printf("进程%d正在执行\n",ep);
	}
	else if(pcb[pd].priority<pcb[ep].priority){
		pcb[ep].status='r';
		printf("读取进程%d\n",pcb[pd].id);
		pcb[pd].status='e';
		ep=pd;
	}

	printf("运行进程%d\n",ep);
	i=stack[1][ep];
	addr=stack[2][ep];
	switch(ep){
	   case 1:process1();
		   break;
	   case 2:process2();
		   break;
	   case 3:process3();
		   break;
	   default:printf("当前进程出现错误%d\n",ep);
		   break;
	}
}

int process1(){
    if(addr=='m') goto m;
	i=1;
a:
	printf("进程1在信号量sem[1]上调用P操作\n");
	if(p(1,1,'m')==0) return(0);
	else goto m;

m:
	printf("打印进程1...m1=%d\n",m1);
	printf("打印进程1...i=%d\n",i);
	i+=5;
	goto a;
}

int process2(){
   if(addr=='m') goto m;
   if(addr=='n') goto n;
   i=1;

a:
   printf("进程2在信号量sem[2]上调用P操作\n");
   if(p(2,2,'m')==0) return(0);

m:
   m1=2*m2;
   printf("进程2在信号量sem[1]上调用V操作m1=%d\n",m1);
   if(v(1,2,'n')==0) return(0);
   else{
   
n:
	   printf("打印进程2...i=%d\n",i);
	   i+=10;
	   goto a;
   }
}

int process3(){
   if(addr=='m') goto m;
   if(addr=='n') goto n;
   i=1;
a:
   if(i>4){
   printf("进程3在信号量sem[2]上调用P操作\n");
   if(p(2,3,'n')==0) return(0);
   }
n:
   m2=i;
   printf("进程3在sem[2]信号量上调用V操作m=%d\n",m2);
   if(v(2,3,'m')==0) return(0);
   else{
m:
	   i+=1;
	   goto a;   } }

int p(int se,int p,char ad){
   int w;
   sem[se].value--;
   if(sem[se].value==0) return(1);
   printf("阻塞当前进程%d\n",p);
   pcb[p].status='w';
   ep=0;
   pcb[p].waiter1=0;
   w=sem[se].waiter2;
   if(w==0) sem[se].waiter2=p;
   else{
	   while(pcb[w].waiter1!=0) w=pcb[w].waiter1;
	   pcb[w].waiter1=p;
   }
   stack[1][p]=i;
   stack[2][p]=ad;
   return(0);
}

int v(int se,int p,char ad){
   int w;
   sem[se].value++;
   if(sem[se].value>0) return(1);
   w=sem[se].waiter2;
   sem[se].waiter2=pcb[w].waiter1;
   pcb[w].status='r';
   printf("唤醒进程%d\n",w);
   stack[1][p]=i;
   stack[2][p]=ad;
   return(0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -