这是川大操作系统的一道期末考试题
There is an cage, and only one animal can be put into this cage. The hunters can put tiger into the cage, and farmers can put the pig into the cage. When there is an animal in the cage, if the animal is a tiger, zoo can take it from the cage, and if the animal is a pig, the hotel can take it from the cage. Please describe the above process with the semaphore.
翻译如下:有一个笼子,这个笼子只能关一只动物。猎人可以把老虎关进笼子、
农民可以把猪关进笼子里。当笼子里有动物时,如果是老虎,动物园可以把它从笼子里拿出来,如果是猪,酒店可以把它从笼子里拿出来,请用信号量描述这些进程。
思路如下:
放动物:先判断是否能放入动物(即笼子是否为空),然后再互斥打开笼子放动物
取动物:判断是否是自己想要的动物,然后互斥打开笼子带走,笼子就为空了。
semaphore mutex1=1; //互斥访问笼子
semaphore mutex2=1;//当前是否能放动物
semaphore flag1=0;//笼子里是否有老虎
semaphore flag2=0;//笼子里是否有猪
hunter(){
P(mutex2)
P(mutex1);
打开空的笼子,放入老虎。
V(flag1);
V(mutex1);
}
farmer(){
P(mutex2);
P(mutex1);
打开空的笼子,放入猪。
V(flag2);
V(mutex1)
}
zoo(){
P(flag1);
P(mutex1);
打开有老虎的笼子,带走老虎。
V(mutex2);
V(mutex1);
}
hotel(){
P(flag2);
P(mutex1);
打开有猪的笼子,带走猪。
V(mutex2);
V(mutex1);
}
此时还能优化,我们发现可以把互斥信号量变成一个
semaphore mutex=1; //能否放入动物
semaphore flag1=0;//笼子里是否有老虎
semaphore flag2=0;//笼子里是否有猪
hunter(){
P(mutex);
打开空的笼子,放入老虎。
V(flag1);
关闭笼子。
}
farmer(){
P(mutex);
打开空的笼子,放入猪。
V(flag2);
}
zoo(){
P(flag1);
打开有老虎的笼子,带走老虎。
V(mutex);
}
hotel(){
P(flag2);
打开有猪的笼子,带走猪。
V(mutex);
}