bool timeint(char ad)
/*时间片中断*/
// char ad;
{ int x;
printf("ad=%c",ad);
x=rand1();
printf("x=%d",x);
if ( (x<0)&&(exe==0)) return(FALSE);
if ( (x<1)&&(exe==1)) return(FALSE);
if ( (x<2)&&(exe==2)) return(FALSE);
savearea[exe][0]=i; /*优先级*/
savearea[exe][1]=ad; /*随机数*/
pcb[exe].ch='t';
printf("\n");
printf("\n");
printf(" ★★★注意★★★ !!! 发生时间片中断!!!\n");
//sleep(3);
// clrscr();
//sleep(1);
//delay(6000000);
printf(" *****进程%d进入低就绪状态.*****\n",exe+1);
exe=NIL;
return(TRUE);
}
find()
{ int j,pd=NIL,w=MAX;
for (j=0;j<3;j++)
if (pcb[j].ch=='r')
if(pcb[j].priority<w)
{ w=pcb[j].priority;
pd=j;
}
if(pd==NIL)
for(j=0;j<3;j++)
if(pcb[j].ch=='t')
if(pcb[j].priority<w)
{ w=pcb[j].priority;
pd=j;
}
return(pd);
}
scheduler()
{ int pd;
if( (pd=find())==NIL && exe==NIL)
return(NIL);
if(pd!=NIL)
{ if(exe==NIL)
{ pcb[pd].ch='e';
exe=pd;
printf("********进程%d正在执行!!!*** ******\n",exe+1);
}
else if (pcb[pd].priority<pcb[exe].priority)
{ pcb[exe].ch='r';
printf(" 进程%d进入等待状态!\n" ,exe+1);
pcb[pd].ch='e';
exe=pd;
printf("****进程%d正在执行!!!*****\n",exe+1);
}
}
i=savearea[exe][0]; /*优先权*/
addr=savearea[exe][1]; /*地址*/
return(exe);
}
void block(int se) /*阻塞*/
//int se;
{ int w;
printf(" 进程%d 现在被阻塞,调用进程入等待队列!!\n",exe+1);
pcb[exe].ch='w';
pcb[exe].nextwr=NIL;
printf("当前在等待队列中的为第%d个进程\n",exe+1);
if((w=sem[se].firstwr)==NIL)
sem[se].firstwr=exe;
else { while(pcb[w].nextwr!=NIL)
w=pcb[w].nextwr;
pcb[w].nextwr=exe;
}
getchar();
}
p (int se,char ad)
//int se;
//char ad;
{ if (--sem[se].value>=0) return(FALSE);
block(se);
savearea[exe][0]=i;
savearea[exe][1]=ad;
exe=NIL;
return(TRUE);
}
void wakeup(int se)
// int se;
{ int w;
w=sem[se].firstwr;
printf("从等待队列唤醒等待进程%d!",w+1);
if(w!=NIL)
{ sem[se].firstwr=pcb[w].nextwr;
pcb[w].ch='r';
printf(" 进程%d被唤醒!\n",w+1);
}
}
v(int se,char ad)
//int se;
//char ad;
{ if(++sem[se].value>0) return(FALSE);
wakeup(se);
savearea[exe][1]=ad;
savearea[exe][0]=i;
return(TRUE);
}
void eexit(int n) /*结束函数*/
// int n;
{ pcb[n].ch='c';
printf("______________进程%d被完成!!!________________\n",n+1);
exe=NIL;
}
void process1( )
{
if (addr=='a') goto a1;
if (addr=='b') goto b1;
if (addr=='c') goto c1;
if (addr=='d') goto d1;
if (addr=='e') goto e1;
if (addr=='f') goto f1;
for (i=1;i<6;i++)
{ printf("\n 现在开始调度进程一\n");
printf("进程一调用P信号1 !\n");
if(p(0,'a')) break; /*进程一被阻塞*/
a1: printf("进程一被执行使用临界资源 s1 !\n");
if (timeint('b')) break; /*时间片中断*/
b1: printf("s1=%d\n",++s1);
printf("进程一调用V信号1并且释放临界资源 s1 !\n");
if (v(0,'c')) break; /*唤醒一个阻塞进程*/
c1: printf("进程一调用P信号2 !\n");
if(p(1,'d')) break;
d1: printf("进程一被执行使用临界资源 s2 !\n");
if(timeint('e')) break;
e1: printf("s2=%d\n",++s2);
printf("进程一调用V信号 2并且释放临界资源 s2 !\n");
if (v(1,'f')) break; /*唤醒一个阻塞进程*/
f1: printf("##############进程一循环数=%d#################\n",i);
}
if(i<6) return;
eexit(0);
getchar();
}
void process2( )
{ if (addr=='a') goto a2;
if (addr=='b') goto b2;
if (addr=='c') goto c2;
if (addr=='d') goto d2;
if (addr=='e') goto e2;
if (addr=='f') goto f2;
for(i=1;i<6;++i)
{ printf("\n 现在开始调度进程二\n");
printf("进程二调用P信号2 !\n");
if(p(1,'a')) break; /*进程二被阻塞*/
a2: printf("**********进程二被执行使用临界资源 s2 ! \n");
if(timeint('b')) break;
b2: printf("s2=%d\n",++s2);
printf("进程二调用V信号2并且释放临界资源 s2 !\n");
if(v(1,'c')) break; /*唤醒一个阻塞进程*/
c2: printf("进程二调用P信号1!\n");
if(p(0,'d')) break; /*进程二被阻塞*/
d2: printf("*********进程二被执行使用临界资源 s1!\n");
if(timeint('e')) break;
e2: printf("s1=%d\n",++s1);
printf("进程二调用V信号 1 并且释放临界资源 s1 !\n");
if(v(0,'f')) break; /*唤醒一个阻塞进程*/
f2: printf("################进程二循环数=%d##############\n",i);
}
if(i<6) return;
eexit(1);
getchar();
}
void process3( )
{
if(addr=='a') goto a3;
if(addr=='b') goto b3;
if(addr=='c') goto c3;
for(i=1;i<6;++i)
{ printf("\n 现在开始调度进程三\n");
printf("进程三调用P信号 2 !\n");
if(p(1,'a')) break; /*进程三被阻塞*/
a3: printf("进程三被执行使用临界资源 s1 !\n");
if(timeint('b')) break;
b3: printf("s2=%d\n",++s2);
printf("进程三调用V信号2释放临界资源s1 !\n");
if(v(1,'c')) break; /*唤醒一个阻塞进程*/
c3: printf("###############进程三循环数=%d#############\n",i);