进程同步问题

本文最后更新于:2 months ago

进程同步问题

设自行车生产线上有一个箱子,其中有N个位置(N≥3),每个位置可存放一个车架或者一个车轮,设有3名工人,其活动分别为:
工人1活动:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
while(1){
加工一个车架;
车架放入箱中;
}

工人2活动:
while(1){
加工一个车轮;
车轮放入箱中;
}

工人3活动:
while(1){
箱中取一个车架;
箱中取两个车轮;
组装为一辆车;
}

要求分别用信号量PV操作实现三名工人的合作,要求解中不含死锁。

算是比较经典的进程同步问题了,也是在刷复试学校历年真题的时候遇到的。难度不大,但有一些细节,对于进程同步问题不熟悉的同学,可能会忽略,所以这里记录一下。
首先分析题目,一个箱子可以放N个零件,工人1一次放一个车架,工人2一次放一个车轮,工人3要做的是从箱子里拿出零件,然后组装车,但第一个需要注意的点是一辆车需要两个车轮和一个车架。
知道题目的要求之后,我们需要考虑此题目中,需要哪些信号量。
1、箱子可以放N个零件,这里我们设empty=N,代表最多可以放置N个零件。第二个需要注意的点是,有的人可能会再设一个mutex来互斥访问箱子,但这里其实是没有必要的,也是新手经常犯的一个错误。因为P、V操作都是原语,而原语是不可中断的程序段。而此题,当对empty进行PV操作时,其实以及实现了对箱子的互斥操作。
2、接着我们设置frame=0和wheel=0信号量来表示,箱子中车架和车轮的数量。
3、第三个需要注意的的点是,程序可能出现,箱子里面全是车轮或者车架,所以我们要分别设定信号量来保证避免这种情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
semaphore empty=N;//箱子内的空位
semaphore weel=0;//车轮
semaphore frame=0;//车架
semaphore s1=N-2;//车架最大值
semaphore s2=N-1;//车轮最大值

工人1活动:
while(1){
加工一个车架;
P(empty);
P(s1);
车架放入箱中;
V(frame);
}

工人2活动:
while(1){
加工一个车轮;
P(empty);
P(s2);
车轮放入箱中;
V(wheel);
}

工人3活动:
while(1){
P(frame);
箱中取一个车架;
V(empty);
V(s1);
P(wheel);
P(wheel);
箱中取两个车轮;
V(empty);
V(empty);
V(s2);
V(s2);
组装为一辆车;
}

把一些注意点弄清楚了,代码其实就不难写了。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!