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

📄 wros2new.cpp

📁 操作系统相关的东东 操作系统相关的
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	
	if(addr=='I') goto i1;//判断是首次进入还是中断唤醒后进入
f1:	//k[2]--;//首次进入
	printf("消费者进程E正在运行...\n");
	if(wait(1)==0)//wait succeed
	{
		printf("processE wait succeed:%d\n",sem[1].value);
		goto i2;
		
	
	//	return signal(&sem[0]);//-1还有阻塞的进程
							  //0没有阻塞的进程
	}
	else//wait failed
	{
		printf("processE wait failed\n");
	//	pcb[2].status='B';//进程C阻塞,要保存断点
		return 1;
	}
i1:
	printf("消费者进程E被唤醒...\n");//中断唤醒后的入口地址
i2:
	printf("消费者进程E将打印计算结果: ");
//	printf("m=%d\n",m);
	printf("buffer[%d]=%d\n",out,buffer[out]);
	out=(out+1)%Length;
	signal(0);   //-1还有阻塞的进程
							  //0没有阻塞的进程
	if(--k[4]==0)
		return 0;
	else
//		goto f1;
	{
		pcb[4].status='R';
		return 2;
	}

}
//-------------------------------------------------------
int processF()
{
	
	if(addr=='I') goto i1;//判断是首次进入还是中断唤醒后进入
f1:	//k[2]--;//首次进入
	printf("消费者进程F正在运行...\n");
	if(wait(1)==0)//wait succeed
	{
		printf("processF wait succeed:%d\n",sem[1].value);
		goto i2;
		
	
	//	return signal(&sem[0]);//-1还有阻塞的进程
							  //0没有阻塞的进程
	}
	else//wait failed
	{
		printf("processF wait failed\n");
	//	pcb[2].status='B';//进程C阻塞,要保存断点
		return 1;
	}
i1:
	printf("消费者进程F被唤醒...\n");//中断唤醒后的入口地址
i2:
	printf("消费者进程F将打印计算结果: ");
//	printf("m=%d\n",m);
	printf("buffer[%d]=%d\n",out,buffer[out]);
	out=(out+1)%Length;
	signal(0);   //-1还有阻塞的进程
							  //0没有阻塞的进程
	if(--k[5]==0)
		return 0;
	else
//		goto f1;
	{
		pcb[5].status='R';
		return 2;
	}

}
/**************^^^六个进程函数A,B,C,D,E,F**************************/



/************block() & wakeup() functions************************/
void block(int *L)//插入阻塞队列
{
	printf("blocking...\n");
	//p->status='B';//进程阻塞,要保存断点
	pcb[run].status='B';
	pcb[run].save='I';
	//p->save='I';			/////I表示是中断之后

	tagpcb *temp;
//	if(sem[i].L==NIL)//队列为空,插在队头
	if(*L==NIL)
	//if(i==NIL)
	{
		printf("队列为空,插在队头\n");
		//s->L=p->id;
		//sem[i].L=pcb[run].id;
		*L=pcb[run].id;
	//	i=pcb[run].id;
	}
	else         //队列非空,插在队尾
	{   printf("队列非空,插在队尾\n");
		//temp=&pcb[sem[i].L];
		temp=&pcb[*L];
		//temp=&pcb[i];
		printf("s->L==>");
		printf("pcb[%d]==>",temp->id);
		while(temp->nptr!=NIL)
		{
		//	printf("pcb
		//	printf("temp->id=%d\n",temp->id);
		//	printf("temp->nptr=%d\n",temp->nptr);
			temp=&pcb[temp->nptr];
			printf("pcb[%d]==>",temp->id);
		}
		//temp->nptr=p->id;
		temp->nptr=pcb[run].id;
		printf("pcb[%d]==>NIL\n",pcb[run].id);
	}
	//----打印出阻塞队列---------
//	printf("s->L==>");
//	pp=&pcb[s->L];
//	while(pp->nptr!=NIL)
//	{
//		printf("pcb[%d]==>",pp->id);
//		pp=&pcb[pp->nptr];
//	}
//	printf("pcb[%d]==>NIL",pp->id);




}
/*----------------------------------------------------------*/
void wakeup(int *L)          //唤醒阻塞进程
{
	printf("waking up......pcb[%d]\n",*L);
	tagpcb *temp;
	//temp=&pcb[sem[i].L];
	temp=&pcb[*L];
	temp->status='R';
//	sem[i].L=temp->nptr;
	*L=temp->nptr;
	temp->nptr=NIL;//拉出了阻塞队列,进程队列指针应当变为NIL
	
//	printf("*********waitup over ,s->L=%d********\n",s->L); 
//	addr=temp->save;//通过addr判断是首次进入还是中断唤醒后进入
}
/*************^^^block() & wakeup() functions**************/

changePriority(int p)
		   {
			   int i;
			   for(i=0;i<MAX;i++)
				   if(i==p)
					   pcb[i].priority++;
				   else
					   pcb[i].priority--;
		   }


int scheduler()
{
	int i,j,nowpcb;
	j=10;//最低优先级
	printf("调度程序正在运行...\n");
	/*----------for()循环得到当前处于'R'状态的和优先级最高的进程---------*/
	for(i=0;i<MAX;i++)
	{
		
		if(pcb[i].status=='R')
		{
			if(pcb[i].priority<=j)
			{
				j=pcb[i].priority;
				nowpcb=i;
			}
		}
	}
/*--------------------------------------------------------------------*/
	printf("--------------------------------------------------\n");
	printf("优先级最高的'R'进程是pcb[%d].priority=%d\n",nowpcb,pcb[nowpcb].priority);
	printf("---------------------------------------------------\n");
	printf("阻塞队列如下:\n");//打印阻塞队列
	int temp;
	for(i=0;i<2;i++)
	{
		temp=sem[i].L;
		printf("sem[%d].L==>",i);
		while(temp!=NIL)
		{
			printf("pcb[%d]==>",temp);
			temp=pcb[temp].nptr;
		}
		printf("NIL\n");
	}	
	printf("\n");
	pcb[nowpcb].status='E';//正在被执行
	addr=pcb[nowpcb].save;
	run=nowpcb;//设置当前正在运行的进程的内部标识符
	switch(nowpcb)
      {
		int i,j;
	   case 0:
		   printf("进程A剩余运行次数=%d\n",k[0]);
		  i=processA();
			   if(i==0)
		   {
			   pcb[0].status='C';
			   printf("****进程A结束****\n");
		   }
		   else if(pcb[0].status=='B')
		   {
			   printf("进程处于阻塞态,优先权不变\n");
		   }
		   else
		   {
			   printf("进程优先权改变\n");
		   changePriority(nowpcb);
		   }
		   printf("*--------------------*\n");
			printf("各进程的优先权如下:\n");
		    for(j=0;j<MAX;j++)
			   printf("pcb[%d].priority=%d\n",j,pcb[j].priority);
		   printf("*-------------------------*\n");
		 break;
	   case 1:
		   printf("进程B剩余运行次数=%d\n",k[1]);
	     i=processB();
			 if(i==0)
		 {
			 pcb[1].status='C';
			 printf("****进程B结束****\n");
		 }
		 else if(pcb[1].status=='B')
		 {printf("进程处于阻塞态,优先权不变\n");
		 }
		 else
		 {
			 printf("进程优先权改变\n");//动态优先权改变
		 changePriority(nowpcb);
		 }
		  printf("*--------------------*\n");
			printf("各进程的优先权如下:\n");
		    for(j=0;j<MAX;j++)
			   printf("pcb[%d].priority=%d\n",j,pcb[j].priority);
		   printf("*-------------------------*\n");
		     break;
	   case 2:
		   printf("进程C剩余运行次数=%d\n",k[2]);
		  i=processC();
	     if(i==0)
		 {
			 pcb[2].status='C';
			 printf("****进程C结束****\n");
		 }
		 else if(pcb[2].status=='B')
		 {printf("进程处于阻塞态,优先权不变\n");
		 }
		 else
		 {
			 printf("进程优先权改变\n");//动态优先权改变
		  changePriority(nowpcb);
		 }
		  printf("*--------------------*\n");
			printf("各进程的优先权如下:\n");
		    for(j=0;j<MAX;j++)
			  printf("pcb[%d].priority=%d\n",j,pcb[j].priority);
			   printf("*-------------------------*\n");
		     break;
		case 3:
		   printf("进程D剩余运行次数=%d\n",k[3]);
		   i=processD();
	  		   if(i==0)
		   {
			   pcb[3].status='C';
			   printf("****进程D结束****\n");
		   }
		   else if(pcb[3].status=='B')
		 {printf("进程处于阻塞态,优先权不变\n");
		 }
		   else
		   { 
			   printf("进程优先权改变\n");//动态优先权改变
		  		   changePriority(nowpcb);
 		   }
		    printf("*--------------------*\n");
			printf("各进程的优先权如下:\n");
		    for(j=0;j<MAX;j++)
				   printf("pcb[%d].priority=%d\n",j,pcb[j].priority);
			   printf("*-------------------------*\n");
		     		 break;
		  case 4:
		   printf("进程E剩余运行次数=%d\n",k[4]);
			   i=processE();
			   if(i==0)
		   {
			   pcb[4].status='C';
			   printf("****进程E结束****\n");
		   }
		   else if(pcb[4].status=='B')
		 {printf("进程处于阻塞态,优先权不变\n");
		 }
		   else
		   {
			   printf("进程优先权改变\n");//动态优先权改变
		  		  changePriority(nowpcb);
  		   }
		    printf("*--------------------*\n");
			printf("各进程的优先权如下:\n");
		    for(j=0;j<MAX;j++)
			   printf("pcb[%d].priority=%d\n",j,pcb[j].priority);
		   printf("*-------------------------*\n");
		  		 break;
		  case 5:
		   printf("进程F剩余运行次数=%d\n",k[5]);
		   i=processF();
		   if(i==0)
		   {
			   pcb[5].status='C';
			   printf("****进程F结束****\n");
		   }
		   else if(pcb[5].status=='B')
		 {printf("进程处于阻塞态,优先权不变\n");
		 }
		   else
		   { printf("进程优先权改变\n");
			   //动态优先权改变
		   changePriority(nowpcb);
		   }
		    printf("*--------------------*\n");
			printf("各进程的优先权如下:\n");
		    for(j=0;j<MAX;j++)
			   printf("pcb[%d].priority=%d\n",j,pcb[j].priority);
		  printf("*-------------------------*\n");
		     		 break;
      }
	if(pcb[0].status=='C'&&pcb[1].status=='C'&&pcb[2].status=='C'&&pcb[3].status=='C'&&pcb[4].status=='C'&&pcb[5].status=='C')
		return NIL;
	else
		return 0;
}
			

⌨️ 快捷键说明

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