应用题 兄弟俩共同使用一个账号,每次限存或取10元,存钱与取钱的进程分别如下所示:
int amount=0:
sAVE(){ TAKE(){
int m1; int m2;
m1=amount: m2=amount;
m2=m2一10:
amount=m2;
}
m1=ml+10:
amount=m1:
}
由于兄弟俩可能同时存钱和取钱,因此两个进程是并发的。若哥哥先存了两次钱,但在第三次存钱时弟弟在取钱。请问:
问答题 25.最后账号amount上面可能出现的值是多少,7
【正确答案】 本题考查P、V操作实现进程的互斥。
哥哥存两次钱后,共享变量amount的值为20。哥哥的第三次存钱与弟弟的取钱同时进行,如果两者顺序执行,则最后amount的值为20;如果在一个进程的执行过程中进行CPU调度,转去执行另一进程,则最后amount的值取决于amount=ml及amount=m2的执行先后次序,若前者先执行,则最后amount的值为10,若后者先执行,则最后amount的值为30。因此,最后账号amount上可能出现的值有10、20、30。
【答案解析】
问答题 26.如何用P、V操作实现两并发进程的互斥执行?
【正确答案】在上述问题中,共享变量amount是一个临界资源,为了实现两并发进程对它的互斥访问,可为它设置一初值为l的互斥信号量mutex,并将上述算法修改为:
int amount=0;
semaphore mutex=1: //互斥访问amount变量的信号量
cobegin{
process SAVE(){
int ml;
P(mutex);
ml=amount;
m1=ml+10:
amount=ml;
V(mutex):
}
process TAKE(){
int m2;
P(mutex):
m2=amount;
m2=m2—10;
amount=m2;
V(mutex);
}
}eoend
【答案解析】