?? wros2new.cpp
字號(hào):
if(addr=='I') goto i1;//判斷是首次進(jìn)入還是中斷喚醒后進(jìn)入
f1: //k[2]--;//首次進(jìn)入
printf("消費(fèi)者進(jìn)程E正在運(yùn)行...\n");
if(wait(1)==0)//wait succeed
{
printf("processE wait succeed:%d\n",sem[1].value);
goto i2;
// return signal(&sem[0]);//-1還有阻塞的進(jìn)程
//0沒(méi)有阻塞的進(jìn)程
}
else//wait failed
{
printf("processE wait failed\n");
// pcb[2].status='B';//進(jìn)程C阻塞,要保存斷點(diǎn)
return 1;
}
i1:
printf("消費(fèi)者進(jìn)程E被喚醒...\n");//中斷喚醒后的入口地址
i2:
printf("消費(fèi)者進(jìn)程E將打印計(jì)算結(jié)果: ");
// printf("m=%d\n",m);
printf("buffer[%d]=%d\n",out,buffer[out]);
out=(out+1)%Length;
signal(0); //-1還有阻塞的進(jìn)程
//0沒(méi)有阻塞的進(jìn)程
if(--k[4]==0)
return 0;
else
// goto f1;
{
pcb[4].status='R';
return 2;
}
}
//-------------------------------------------------------
int processF()
{
if(addr=='I') goto i1;//判斷是首次進(jìn)入還是中斷喚醒后進(jìn)入
f1: //k[2]--;//首次進(jìn)入
printf("消費(fèi)者進(jìn)程F正在運(yùn)行...\n");
if(wait(1)==0)//wait succeed
{
printf("processF wait succeed:%d\n",sem[1].value);
goto i2;
// return signal(&sem[0]);//-1還有阻塞的進(jìn)程
//0沒(méi)有阻塞的進(jìn)程
}
else//wait failed
{
printf("processF wait failed\n");
// pcb[2].status='B';//進(jìn)程C阻塞,要保存斷點(diǎn)
return 1;
}
i1:
printf("消費(fèi)者進(jìn)程F被喚醒...\n");//中斷喚醒后的入口地址
i2:
printf("消費(fèi)者進(jìn)程F將打印計(jì)算結(jié)果: ");
// printf("m=%d\n",m);
printf("buffer[%d]=%d\n",out,buffer[out]);
out=(out+1)%Length;
signal(0); //-1還有阻塞的進(jìn)程
//0沒(méi)有阻塞的進(jìn)程
if(--k[5]==0)
return 0;
else
// goto f1;
{
pcb[5].status='R';
return 2;
}
}
/**************^^^六個(gè)進(jìn)程函數(shù)A,B,C,D,E,F**************************/
/************block() & wakeup() functions************************/
void block(int *L)//插入阻塞隊(duì)列
{
printf("blocking...\n");
//p->status='B';//進(jìn)程阻塞,要保存斷點(diǎn)
pcb[run].status='B';
pcb[run].save='I';
//p->save='I'; /////I表示是中斷之后
tagpcb *temp;
// if(sem[i].L==NIL)//隊(duì)列為空,插在隊(duì)頭
if(*L==NIL)
//if(i==NIL)
{
printf("隊(duì)列為空,插在隊(duì)頭\n");
//s->L=p->id;
//sem[i].L=pcb[run].id;
*L=pcb[run].id;
// i=pcb[run].id;
}
else //隊(duì)列非空,插在隊(duì)尾
{ printf("隊(duì)列非空,插在隊(duì)尾\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);
}
//----打印出阻塞隊(duì)列---------
// 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) //喚醒阻塞進(jìn)程
{
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;//拉出了阻塞隊(duì)列,進(jìn)程隊(duì)列指針應(yīng)當(dāng)變?yōu)镹IL
// printf("*********waitup over ,s->L=%d********\n",s->L);
// addr=temp->save;//通過(guò)addr判斷是首次進(jìn)入還是中斷喚醒后進(jìn)入
}
/*************^^^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;//最低優(yōu)先級(jí)
printf("調(diào)度程序正在運(yùn)行...\n");
/*----------for()循環(huán)得到當(dāng)前處于'R'狀態(tài)的和優(yōu)先級(jí)最高的進(jìn)程---------*/
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("優(yōu)先級(jí)最高的'R'進(jìn)程是pcb[%d].priority=%d\n",nowpcb,pcb[nowpcb].priority);
printf("---------------------------------------------------\n");
printf("阻塞隊(duì)列如下:\n");//打印阻塞隊(duì)列
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';//正在被執(zhí)行
addr=pcb[nowpcb].save;
run=nowpcb;//設(shè)置當(dāng)前正在運(yùn)行的進(jìn)程的內(nèi)部標(biāo)識(shí)符
switch(nowpcb)
{
int i,j;
case 0:
printf("進(jìn)程A剩余運(yùn)行次數(shù)=%d\n",k[0]);
i=processA();
if(i==0)
{
pcb[0].status='C';
printf("****進(jìn)程A結(jié)束****\n");
}
else if(pcb[0].status=='B')
{
printf("進(jìn)程處于阻塞態(tài),優(yōu)先權(quán)不變\n");
}
else
{
printf("進(jìn)程優(yōu)先權(quán)改變\n");
changePriority(nowpcb);
}
printf("*--------------------*\n");
printf("各進(jìn)程的優(yōu)先權(quán)如下:\n");
for(j=0;j<MAX;j++)
printf("pcb[%d].priority=%d\n",j,pcb[j].priority);
printf("*-------------------------*\n");
break;
case 1:
printf("進(jìn)程B剩余運(yùn)行次數(shù)=%d\n",k[1]);
i=processB();
if(i==0)
{
pcb[1].status='C';
printf("****進(jìn)程B結(jié)束****\n");
}
else if(pcb[1].status=='B')
{printf("進(jìn)程處于阻塞態(tài),優(yōu)先權(quán)不變\n");
}
else
{
printf("進(jìn)程優(yōu)先權(quán)改變\n");//動(dòng)態(tài)優(yōu)先權(quán)改變
changePriority(nowpcb);
}
printf("*--------------------*\n");
printf("各進(jìn)程的優(yōu)先權(quán)如下:\n");
for(j=0;j<MAX;j++)
printf("pcb[%d].priority=%d\n",j,pcb[j].priority);
printf("*-------------------------*\n");
break;
case 2:
printf("進(jìn)程C剩余運(yùn)行次數(shù)=%d\n",k[2]);
i=processC();
if(i==0)
{
pcb[2].status='C';
printf("****進(jìn)程C結(jié)束****\n");
}
else if(pcb[2].status=='B')
{printf("進(jìn)程處于阻塞態(tài),優(yōu)先權(quán)不變\n");
}
else
{
printf("進(jìn)程優(yōu)先權(quán)改變\n");//動(dòng)態(tài)優(yōu)先權(quán)改變
changePriority(nowpcb);
}
printf("*--------------------*\n");
printf("各進(jìn)程的優(yōu)先權(quán)如下:\n");
for(j=0;j<MAX;j++)
printf("pcb[%d].priority=%d\n",j,pcb[j].priority);
printf("*-------------------------*\n");
break;
case 3:
printf("進(jìn)程D剩余運(yùn)行次數(shù)=%d\n",k[3]);
i=processD();
if(i==0)
{
pcb[3].status='C';
printf("****進(jìn)程D結(jié)束****\n");
}
else if(pcb[3].status=='B')
{printf("進(jìn)程處于阻塞態(tài),優(yōu)先權(quán)不變\n");
}
else
{
printf("進(jìn)程優(yōu)先權(quán)改變\n");//動(dòng)態(tài)優(yōu)先權(quán)改變
changePriority(nowpcb);
}
printf("*--------------------*\n");
printf("各進(jìn)程的優(yōu)先權(quán)如下:\n");
for(j=0;j<MAX;j++)
printf("pcb[%d].priority=%d\n",j,pcb[j].priority);
printf("*-------------------------*\n");
break;
case 4:
printf("進(jìn)程E剩余運(yùn)行次數(shù)=%d\n",k[4]);
i=processE();
if(i==0)
{
pcb[4].status='C';
printf("****進(jìn)程E結(jié)束****\n");
}
else if(pcb[4].status=='B')
{printf("進(jìn)程處于阻塞態(tài),優(yōu)先權(quán)不變\n");
}
else
{
printf("進(jìn)程優(yōu)先權(quán)改變\n");//動(dòng)態(tài)優(yōu)先權(quán)改變
changePriority(nowpcb);
}
printf("*--------------------*\n");
printf("各進(jìn)程的優(yōu)先權(quán)如下:\n");
for(j=0;j<MAX;j++)
printf("pcb[%d].priority=%d\n",j,pcb[j].priority);
printf("*-------------------------*\n");
break;
case 5:
printf("進(jìn)程F剩余運(yùn)行次數(shù)=%d\n",k[5]);
i=processF();
if(i==0)
{
pcb[5].status='C';
printf("****進(jìn)程F結(jié)束****\n");
}
else if(pcb[5].status=='B')
{printf("進(jìn)程處于阻塞態(tài),優(yōu)先權(quán)不變\n");
}
else
{ printf("進(jìn)程優(yōu)先權(quán)改變\n");
//動(dòng)態(tài)優(yōu)先權(quán)改變
changePriority(nowpcb);
}
printf("*--------------------*\n");
printf("各進(jìn)程的優(yōu)先權(quán)如下:\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;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -