操作系统同步互斥问题
一些经典的例子就不列举了,接下来讲一些在学习操作系统课程的过程中所遇到的几个进程同步的题目。
1.取放水果问题
用基本记录型信号量解决如下同步关系:一空盘放一水果,父放梨,母放橘,儿取梨,女取橘,四人如何并发?由题目我们可以知道缓冲区只有一个,父母放水果之间及儿女取水果之间是互斥的关系,而且父放了梨之后儿子才能取梨,母亲放了橘子后女儿才能取橘子。站着资源的角度上,我们要定义三个信号量,empty:表示空盘,pear:表示梨子,orange:表示橘子。以下是伪代码:
seamphore empty=1,pear=0,orange=0;//最开始是有一个空,还没有放橘子和梨;
//父亲
threadAddF(){
wait(empty);
···
放梨;
···
signal(peal);
}
//母亲
threadAddM(){
wait(empty);
···
放橘子;
···
signal(orange);
}
//儿子
threadAddS(){
wait(pear);
···
取梨;
···
signal(empty);
}
//女儿
threadAddF(){
wait(orange);
···
取橘子;
···
signal(empty);
}
//主函数
void main(){
threadAddF();
threadAddM();
threadAddS();
threadAddD();
}
这个例子比较简单,也很好理解。
2.黑白棋子问题
大家对于下棋肯定不陌生,这里列举两种情况:
黑子先下;
谁先抢到谁先下。第一种情况:黑子先下时
seamphore bfg=1,wfg=0;//bfg表示控制黑棋的信号量,wfg控制白棋;
//黑棋
void black(){
while(true){
wait(bfg);
if(在棋盘上找到位置)