📄 wros2new.cpp
字号:
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 + -