|
主题 : : 这两个P操作顺序能否换? [待解决] |
回复[ 7次 ]
点击[ 676次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2008-11-23 16:37 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:4
注册日期:2007-11-29 08:16 |
生产者和消费者问题。
avail是生产者进程的私用的信号量,表示有界缓冲区空单元数初值为1;
full是消费者进程的私用信号量,表示有界缓冲区满单元数初值为0;
而mutex是公用信号量用来生产者之间和消费者之间的互斥,初值为1。
deposit(data):
begin
p(avail)
p(mutex)
送数据入缓冲区某单元
v(avail)
v(mutex)
end
move(data)
begin
p(full)
p(mutex)
取缓冲区某单元数据
v(avail)
v(mutex)
end
deposit函数中p(avail),p(mutex)或者move函数中的p(avail),p(mutex)的先后顺序能否换?互换后是不是会发生死锁的结果?能详细地解析一下吗? | | |
|
|
|
|
[第1楼]
[ 回复时间:2008-11-26 15:07 ]
[引用]
[回复]
[ top ] | |
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23 |
mov中到底是p(avail)还是p(full)啊?
怎么题目中的跟你提问中的描述有点出入呢? | | |
|
|
|
|
[第2楼]
[ 回复时间:2008-11-26 15:12 ]
[引用]
[回复]
[ top ] | |
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23 |
我觉得,题目中的过程有点不对头,生产者生产后应该是v(full),所以题目应该是如下:
deposit(data):
begin
p(avail)
p(mutex)
送数据入缓冲区某单元
v(full)
v(mutex)
end
move(data)
begin
p(full)
p(mutex)
取缓冲区某单元数据
v(avail)
v(mutex)
end
然后,我们接下来分析一下会不会死锁。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2008-11-26 15:23 ]
[引用]
[回复]
[ top ] | |
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23 |
deposit函数中p(avail),p(mutex)或者move函数中的p(full),p(mutex)的先后顺序能否换?互换后是不是会发生死锁的结果?
-----------------------
根据楼主的意思,pv顺序改为:p(mutex)p(avail)和p(mutex)p(full),我们分析一下死锁的可能性。
首先,mutex是生产者和消费者的公用信号量,假设此时mutex=1生产者p(mutex),那么,mutex=0了,生产者进程就可以进行;而由于消费者在p(mutex)的时候,发现mutex-1=-1 小于0了,消费者就阻塞了;与此同时,假设生产者的avail为0,那么,p(avail)是就会发现avail-1=-1小于0,生产者就不能够继续进行生产,得等待消费者释放一个空单元才行;而消费者由于有mutex而阻塞的,谁然p(full)符合执行条件,但是由于p(mutex)在p(full)之前,所以,消费者此时不能运行v(avail),那么生产者也就不能继续进行了。这时候,生产者和消费者都阻塞了,生产者等待avail,而消费者等待mutex,显然死锁了。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2008-11-26 19:59 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:4
注册日期:2007-11-29 08:16 |
根据3楼的说法,公用信号量mutex是生产者和消费者的公用信号量而不是各个生产者之间或者各个消费者之间的互斥信号量了。生产者者和消费者之间应该是同步关系而不是互斥关系吧? | | |
|
|
|
|
[第5楼]
[ 回复时间:2008-12-03 10:21 ]
[引用]
[回复]
[ top ] | |
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23 |
根据3楼的说法,公用信号量mutex是生产者和消费者的公用信号量而不是各个生产者之间或者各个消费者之间的互斥信号量了。生产者者和消费者之间应该是同步关系而不是互斥关系吧?
------------------
回复:生产者和消费者之间的通信自然得用一个公共信号量了。这个公共信号量才是控制生产者和消费者互斥的变量;而生产者自己之间以及消费者自己之间是通过自己的私有变量控制公用的缓冲区来控制自身行为的。
互斥不是说共有私有的问题,不容的进程同时访问临街资源区就会有互斥产生。就像不能单单的理解p、v语句是成对出现的一样,现象是本质的反应,但不能单以现象去理解本质,容易偏颇。 | | |
|
|
|
|
[第6楼]
[ 回复时间:2008-12-03 10:22 ]
[引用]
[回复]
[ top ] | |
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23 |
还有一个问题就是:同步是通过互斥来实现的。没有互斥,进程不久异步了?!所以,同步和互斥不是一个同等概念。不能做比较。 | | |
|
|
|
|
[第7楼]
[ 回复时间:2010-04-30 23:02 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-04-30 21:37 |
在操作系统第二版里面有生—消的问题的,好像上面的不是太一样的说…… | | |