进程同步习题全
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
getEBuffer()返回空的buffer号 getEBuffer()
return (pbuffer+1)mod n getDBuffer()返回有数据的buffer号 getDBuffer()
return (pdata+1)mod n
进程管理
semaphore mutex,empty,full=1,n,0
V(empty)
进程管理
【练习】如图,有多个PUT操作同时向Buff1放数据, 有一个MOVE操作不断地将Buff1的数据移到 Buff2,有多个GET操作不断地从Buff2中将数据取 走。Buff1的容量是m,Buff2的容量是 n,PUT,MOVE,GET每次操作一个数据,在操作的 过程中要保证数据不丢失。试用P,V原语协调 PUT,MOVE操作,并说明每个信号量的含义和初 值。
integer pbuff,pdata=0,0
生产者i
消费者j
repeat
repeat
P(empty)
P(full)
P(mutex)
P(mutex)
in=getEBuffer()
out=getDBuffer()
V(mutex)
V(mutex)
putdata(in)
getdata(out)
V(full)
进程管理
生产者i repeat
P(empty) P(mutex) putdata V(mutex) V(full)
消费者i repeat
P(full) P(mutex) getdata V(mutex) V(empty)
进程管理
【例】多个生产者,多个消费者,N个buffer,多次循环存 取buffer,即多个生产者不断进行putdata操作,多个消费 者不断进行getdata操作
进程管理
生产者: repeat
P(empty) putdata V(full)
消费者: repeat
P(full) getdata V(empty)
进程管理
【例】一个buffer,多个生产者,多个消费者,多个生产者和 消费者都在不断地存取buffer,即生产者不断地进行 putdata操作,消费者不断进行getdata操作。
进程同步习题
设有n个进程共享一个程序段,对如下两种情况: (1)如果每次只允许一个进程进入该程序段; (2)如果每次最多允许m个进程(M<=n)同时进入 该程序段。 试问:所采用的信号量初值是否相同?信号量值的变 化范围如何? 所采用信号量的初值不相同。 在情况(1)中,信号量的初值为1, 信号量值的变化范围是l,0,-1…-(n-1)。 在情况(2)中,信号量的初值为M, 信号量值的变化范围是M,m-1,m-2…(m-n)。
进程管理
【例】一个buffer,一个生产者,一个消费者,生产者 只生产一个东西,消费者只进行一次消费,即:生 产者只进行一次putdata操作,消费者只进行一次 getdata操作。
进程管理
【解答】
源自文库
设置信号量full,表示buffer是否有数据,初值为0
生产者
消费者
putdata
P(full)
V(full)
进程管理
<GET类进程> repeat 判断buff2是否有数据,没有则等待 是否可操作buff2 GET 设置buff1可操作标志 设置buff1有空间标志
进程管理
4 信号量 设置6个信号量 full1:buff1是否有数据,初值为0 empty1:buff1有空间,初值为m mutex1:buff1是否可操作,初值为1 full2:buff2是否有数据,初值为0 empty2:buff2有空间,初值为n mutex2:buff2是否可操作,初值为1
getdata
进程管理
【例】一个buffer,一个生产者,一个消费者,生产 者不断进行putdata操作,消费者不断进行 getdata操作,即生产者不断生产,消费者不断 消费。
【解答】buffer为空时,才能进行putdata操作, 只有buffer有数据时,才能进行getdata操作
信号量 full:是否有数据初值为0 empty:是否为空,初值为1
进程管理
操作流程 <PUT类进程>
repeat 判断buff1是否有空间,没有则等待 是否可操作buff1 PUT 设置buff1可操作标志 设置buff1有数据的标志
until false
进程管理
<MOVE类进程> repeat 判断buff1是否有数据,没有则等待 判断buff2是否有空间,没有则等待 是否可操作buff1 是否可操作buff2 MOVE 设置buff1可操作标志 设置buff2可操作标志 设置buff1有空间标志 设置buff2有空间标志
【解答】 只有buffer有空间时才能进行putdata操作 只有buffer有数据时才能进行getdata操作 不允许多个消费者和多个生产者同时操作 信号量 full:表示buffer是否有数据,初值为0 empty:表示buffer是否为空,初值为n mutex:表示buffer是否可操作,初值为1
进程管理
生产者i repeat
P(empty) P(mutex) putdata V(mutex) V(full)
消费者j repeat
P(full) P(mutex) putdata V(mutex) V(empty)
进程管理
【改进】putdata和getdata操作都在临界区中,因 此多个进程对多个buffer的操作不能并行进行的, 进程间并行操作的程度很低。实际上只要保证多个 进程同时操作不同buffer就可以实现对整个buffer 的并行操作。
进程管理
PUT
Buff1
MOVE
Buff2
GET
进程管理
【解答】三类进程:多个PUT类进程,一个MOVE 类进程,多个GET类进程
操作规则 1 只有buff1有空间才能进行PUT操作 2 只有buff1有数据,buff2有空间才能进行MOVE
操作 3 只有buff2有数据才能进行GET操作 4 不允许多个进程同时操作buff1 5 不允许多个进程同时操作buff2
【解答】 只有buffer为空时能进行putdata操作,只有buffer有数据
时能进行putdata操作。 不允许多个进程同时操作buffer,即不允许多个消费者同时进
行getdata,不允许多个生产者进行putdata操作 信号量 full:buffer是否有数据,初值为0 empty:buffer是否为空,初值为1 mutex:buffer是否可操作,初值为1
return (pbuffer+1)mod n getDBuffer()返回有数据的buffer号 getDBuffer()
return (pdata+1)mod n
进程管理
semaphore mutex,empty,full=1,n,0
V(empty)
进程管理
【练习】如图,有多个PUT操作同时向Buff1放数据, 有一个MOVE操作不断地将Buff1的数据移到 Buff2,有多个GET操作不断地从Buff2中将数据取 走。Buff1的容量是m,Buff2的容量是 n,PUT,MOVE,GET每次操作一个数据,在操作的 过程中要保证数据不丢失。试用P,V原语协调 PUT,MOVE操作,并说明每个信号量的含义和初 值。
integer pbuff,pdata=0,0
生产者i
消费者j
repeat
repeat
P(empty)
P(full)
P(mutex)
P(mutex)
in=getEBuffer()
out=getDBuffer()
V(mutex)
V(mutex)
putdata(in)
getdata(out)
V(full)
进程管理
生产者i repeat
P(empty) P(mutex) putdata V(mutex) V(full)
消费者i repeat
P(full) P(mutex) getdata V(mutex) V(empty)
进程管理
【例】多个生产者,多个消费者,N个buffer,多次循环存 取buffer,即多个生产者不断进行putdata操作,多个消费 者不断进行getdata操作
进程管理
生产者: repeat
P(empty) putdata V(full)
消费者: repeat
P(full) getdata V(empty)
进程管理
【例】一个buffer,多个生产者,多个消费者,多个生产者和 消费者都在不断地存取buffer,即生产者不断地进行 putdata操作,消费者不断进行getdata操作。
进程同步习题
设有n个进程共享一个程序段,对如下两种情况: (1)如果每次只允许一个进程进入该程序段; (2)如果每次最多允许m个进程(M<=n)同时进入 该程序段。 试问:所采用的信号量初值是否相同?信号量值的变 化范围如何? 所采用信号量的初值不相同。 在情况(1)中,信号量的初值为1, 信号量值的变化范围是l,0,-1…-(n-1)。 在情况(2)中,信号量的初值为M, 信号量值的变化范围是M,m-1,m-2…(m-n)。
进程管理
【例】一个buffer,一个生产者,一个消费者,生产者 只生产一个东西,消费者只进行一次消费,即:生 产者只进行一次putdata操作,消费者只进行一次 getdata操作。
进程管理
【解答】
源自文库
设置信号量full,表示buffer是否有数据,初值为0
生产者
消费者
putdata
P(full)
V(full)
进程管理
<GET类进程> repeat 判断buff2是否有数据,没有则等待 是否可操作buff2 GET 设置buff1可操作标志 设置buff1有空间标志
进程管理
4 信号量 设置6个信号量 full1:buff1是否有数据,初值为0 empty1:buff1有空间,初值为m mutex1:buff1是否可操作,初值为1 full2:buff2是否有数据,初值为0 empty2:buff2有空间,初值为n mutex2:buff2是否可操作,初值为1
getdata
进程管理
【例】一个buffer,一个生产者,一个消费者,生产 者不断进行putdata操作,消费者不断进行 getdata操作,即生产者不断生产,消费者不断 消费。
【解答】buffer为空时,才能进行putdata操作, 只有buffer有数据时,才能进行getdata操作
信号量 full:是否有数据初值为0 empty:是否为空,初值为1
进程管理
操作流程 <PUT类进程>
repeat 判断buff1是否有空间,没有则等待 是否可操作buff1 PUT 设置buff1可操作标志 设置buff1有数据的标志
until false
进程管理
<MOVE类进程> repeat 判断buff1是否有数据,没有则等待 判断buff2是否有空间,没有则等待 是否可操作buff1 是否可操作buff2 MOVE 设置buff1可操作标志 设置buff2可操作标志 设置buff1有空间标志 设置buff2有空间标志
【解答】 只有buffer有空间时才能进行putdata操作 只有buffer有数据时才能进行getdata操作 不允许多个消费者和多个生产者同时操作 信号量 full:表示buffer是否有数据,初值为0 empty:表示buffer是否为空,初值为n mutex:表示buffer是否可操作,初值为1
进程管理
生产者i repeat
P(empty) P(mutex) putdata V(mutex) V(full)
消费者j repeat
P(full) P(mutex) putdata V(mutex) V(empty)
进程管理
【改进】putdata和getdata操作都在临界区中,因 此多个进程对多个buffer的操作不能并行进行的, 进程间并行操作的程度很低。实际上只要保证多个 进程同时操作不同buffer就可以实现对整个buffer 的并行操作。
进程管理
PUT
Buff1
MOVE
Buff2
GET
进程管理
【解答】三类进程:多个PUT类进程,一个MOVE 类进程,多个GET类进程
操作规则 1 只有buff1有空间才能进行PUT操作 2 只有buff1有数据,buff2有空间才能进行MOVE
操作 3 只有buff2有数据才能进行GET操作 4 不允许多个进程同时操作buff1 5 不允许多个进程同时操作buff2
【解答】 只有buffer为空时能进行putdata操作,只有buffer有数据
时能进行putdata操作。 不允许多个进程同时操作buffer,即不允许多个消费者同时进
行getdata,不允许多个生产者进行putdata操作 信号量 full:buffer是否有数据,初值为0 empty:buffer是否为空,初值为1 mutex:buffer是否可操作,初值为1