进程同步习题全
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
process R1 begin L1:从磁盘上读数据送x1; P(mutex); B:=x1; V(s1); goto L1 end;
process W1 begin L3: P(s1); y:=B; V(mutex); 打印y goto L3 end;
进程管理
process R2 begin L2:从键盘上读数据送x2; P(mutex); B:=x2; V(s2); goto L2 end;
进程管理
【例】进程P1使用缓冲区buffer向进程P2,P3,P4发 送消息,要求每当P1向buffer中发消息时,只有 当P2,P3,P4进程都读取这条消息后才可再向 buffer中发送消息。利用PV原语描述进程的动作 序列
P2 P1 buffer P3
P4
进程管理
【解答】设置信号量初值S1=S2=S3=0,S=3 进程P1 进程P2 进程P3 P4 P(S) P(S1) P(S2) P(S3) P(S) 读消息 读消息 读消息 P(S) V(S) V(S) V(S) 发送消息到 Buffer V(S1) V(S2)
进程管理
生产者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操作 【解答】 只有buffer有空间时才能进行putdata操作 只有buffer有数据时才能进行getdata操作 不允许多个消费者和多个生产者同时操作 信号量 full:表示buffer是否有数据,初值为0 empty:表示buffer是否为空,初值为n mutex:表示buffer是否可操作,初值为1
进程管理
semaphore mutex,empty,full=1,n,0 integer pbuff,pdata=0,0 生产者i repeat P(empty) P(mutex) in=getEBuffer() out=getDBuffer() V(mutex) putdata(in) getdata(out) V(full) V(empty)
进程管理
【例】一个buffer,一个生产者,一个消费者,生产 者不断进行putdata操作,消费者不断进行 getdata操作,即生产者不断生产,消费者不断消 费。 【解答】buffer为空时,才能进行putdata操作,只 有buffer有数据时,才能进行getdata操作 信号量 full:是否有数据初值为0 empty:是否为空,初值为1
进程管理
【分析】把进程R看作是生产者,把进程W1和W2看作是消费 者。现在有一个生产者(进程R)能生产不同的产品(读入 奇数或偶数),把生产的产品存放在缓冲器B中,供不同 的消费者(进程W1和进程W2)取用。可以看出,当进程R 读入的是整数,则要把有奇数的消息发送给进程W1;当进 程R读入的是偶数,则要把有偶数的消息发送给W2,在进 程W1或进程W2从缓冲器中取出数后,应把缓冲器中又可有 一个数的消息告诉进程R,于是,可以定义如下3个信号量: S表示是否可以把数存入缓冲器,由于缓冲器中每次只能放 一个数,所以其初值取为”1“ SO:表示缓冲器中是否有奇数,初值为”0“,表示无奇数 SE:表示缓冲器是否偶数,初值为0,表示无偶数
进程管理
R1
W1
R2
W2
进程管理
【解答】4个进程互斥,R1,W1同步,R2,W2同步 mutex:表示能否把数据存如缓冲器,初始化时缓 冲器为空,故初值为1 S1:进程R1是否已向缓冲器存入一个数据,初值为 0 S2:进程R2是否已向缓冲器存入一个数据,初值为 0
进程管理
begin mutex,s1,s2:semaphore; s:=1;s2:=0;s2:=0; cobegin
进程管理
【例】一个buffer,一个生产者,一个消费者,生产 者只生产一个东西,消费者只进行一次消费,即: 生产者只进行一次putdata操作,消费者只进行一次 getdata操作。
进程管理
【解答】 设置信号量full,表示buffer是否有数据,初值为0 生产者 消费者 putdata P(full) V(full) getdata
process W2 begin L4: P(s2); z:=B; V(mutex); 打印z; goto L4 end;
进程管理
【例】假定有3个进程R,W1,W2共享一个缓冲器,而B中每 次只能存放一个数,当缓冲器中无数时,进程R可将M输入 设备上读入的数存放到缓存器B中,若存放到缓存器中的 是奇数,则允许进程W1将其取出打印;若存放到缓冲器中 的是偶数,则允许进程W2将取出打印。同时规定:进程R 必须等缓冲器中的数被取出打印后才能再存放一个数;进 程W1或W2对每次存入缓冲器中的数只能打印一次;W1和W2 都不能从空的缓冲器中取数。写出这3个并发进程能正确 工作的程序。
进程管理
<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
进程管理
PUT MOVE Buff1 Buff2
GET
进程管理
【解答】三类进程:多个PUT类进程,一个MOVE类进 程,多个GET类进程 操作规则 1 只有buff1有空间才能进行PUT操作 2 只有buff1有数据,buff2有空间才能进行MOVE操 作 3 只有buff2有数据才能进行GET操作 4 不允许多个进程同时操作buff1 5 不允许多个进程同时操作buff2
进程管理
生产者: repeat P(empty) putdata V(full)
消费者: repeat P(full) getdata V(empty)
进程管理
【例】一个buffer,多个生产者,多个消费者,多个生产者 和消费者都在不断地存取buffer,即生产者不断地进行 putdata操作,消费者不断进行getdata操作。 【解答】 只有buffer为空时能进行putdata操作,只有buffer有数据 时能进行putdata操作。 不允许多个进程同时操作buffer,即不允许多个消费者同时 进行getdata,不允许多个生产者进行putdata操作 信号量 full:buffer是否有数据,初值为0 empty:buffer是否为空,初值为1 mutex:buffer是否可操作,初值为1
进程同步习题
设有n个进程共享一个程序段,对如下两种情况: (1)如果每次只允许一个进程进入该程序段; (2)如果每次最多允许m个进程(M<=n)同时进入该 程序段。 试问:所采用的信号量初值是否相同?信号量值的变 化范围如何? 所采用信号量的初值不相同。 在情况(1)中,信号量的初值为1, 信号量值的变化范围是l,0,-1…-(n-1)。 在情况(2)中,信号量的初值为M, 信号量值的变化范围是M,m-1,m-2…(m-n)。
进程管理
5 PV操作实现 <PUT类进程> repeat p(empty1);//判断buff1是否有空间,没有 则等待 p(mutex1);//是否可操作buff1 PUT; v(mutex1);//设置buff1可操作标志 v(full);//设置buff1有数据标志
进程管理
<MOVE类进程> repeat P(full1);判断buff1是否有数据,没有则等待 P(empty2);//判断buff2是否有空间,没有则等待 P(mutex1);//是否可操作buff1 P(mutex2);//是否可操作buff2 MOVE; V(mutex1);//设置buff1可操作标志 V(mutex2);//设置buff2可操作标志 V(empty1);//设置buff1有空间标志 V(full2);//设置buff2有数据标志
进程
进程管理
【例】设A,B为两个并发进程,它们共享一个临界 区,其执行临界区的算法框图如下。试判断该算 法是否有错?请说明理由。如果有错,请改正。 S1,S2的初值为0,CSA,CSB为临界区。
进程管理
操作流程 <PUT类进程> repeat 判断buff1是否有空间,没有则等待 是否可操作buff1 PUT 设置buff1可操作标志 设置buff1有数据的标志 until false
进程管理
<MOVE类进程> repeat 判断buff1是否有数据,没有则等待 判断buff2是否有空间,没有则等待 是否可操作buff1 是否可操作buff2 MOVE 设置buff1可操作标志 设置buff2可操作标志 设置buff1有空间标志 设置buff2有空间标志
消费者j repeat P(full) P(mutex)
V(mutex)
进程管理
【练习】如图,有多个PUT操作同时向Buff1放数据, 有一个MOVE操作不断地将Buff1的数据移到Buff2, 有多个GET操作不断地从Buff2中将数据取走。 Buff1的容量是m,Buff2的容量是n,PUT,MOVE,GET 每次操作一个数据,在操作的过程中要保证数据 不丢失。试用P,V原语协调PUT,MOVE操作,并说明 每个信号量的含义和初值。
进程管理
<GET类进程> repeat P(empty2);//判断buff2是否有空间,没有则 等待 P(mutex2);//是否可操作buff2 GET V(mutex2);//设置buff2可操作标记 V(full2);//设置buff2有数据标记
进程管理
【例】现有4个进程R1,R2,W1,W2。它们共享可以存放一 个数据的缓冲器B。进程R1每次把磁盘上读出的一个数据 存到缓冲器B中,供进程W1打印输出;进程R2每次从键盘 上读一个数据存放到缓冲器B,供W2打印输出。当一个进 程把数据存放到缓冲器后,在该数据还没有打印输出之前 不准任何进程再想缓冲器中存数据。当一个进程已把缓冲 器中的数据打印输出后,在缓冲器中还没有存如新数据之 前不准任何进程再从缓冲器中取数打印。问怎样用PV操作 使这4个进程并发执行时能相互协作地工作?
进程管理
【解答】 integer B; semaphore S,SO,SE SO=0;SE=0: integer x L1:从输入设备读入一个数 X=读入的数 P(S); B=X if(B=偶数)V(SO) else V(SE) goto L1
进程管理
进程管理
Hale Waihona Puke 【例】设有一个具有N个信息元素的环形缓冲区,A 进程顺序地把信息写入缓冲区,B进程依次从缓冲 区读出信息。回答下列问题: 1 叙述A,B两进程的相互制约关系 2 判别下列用PV操作表示的同步算法是否正确?如 不正确,试说明理由,并修改成正确的算法。 设置信号量初值:S1=0,S2=N; 设置变量初值:in=out=0;
进程管理
生产者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的 并行操作。 getEBuffer()返回空的buffer号 getEBuffer() return (pbuffer+1)mod n getDBuffer()返回有数据的buffer号 getDBuffer() return (pdata+1)mod n
process W1 begin L3: P(s1); y:=B; V(mutex); 打印y goto L3 end;
进程管理
process R2 begin L2:从键盘上读数据送x2; P(mutex); B:=x2; V(s2); goto L2 end;
进程管理
【例】进程P1使用缓冲区buffer向进程P2,P3,P4发 送消息,要求每当P1向buffer中发消息时,只有 当P2,P3,P4进程都读取这条消息后才可再向 buffer中发送消息。利用PV原语描述进程的动作 序列
P2 P1 buffer P3
P4
进程管理
【解答】设置信号量初值S1=S2=S3=0,S=3 进程P1 进程P2 进程P3 P4 P(S) P(S1) P(S2) P(S3) P(S) 读消息 读消息 读消息 P(S) V(S) V(S) V(S) 发送消息到 Buffer V(S1) V(S2)
进程管理
生产者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操作 【解答】 只有buffer有空间时才能进行putdata操作 只有buffer有数据时才能进行getdata操作 不允许多个消费者和多个生产者同时操作 信号量 full:表示buffer是否有数据,初值为0 empty:表示buffer是否为空,初值为n mutex:表示buffer是否可操作,初值为1
进程管理
semaphore mutex,empty,full=1,n,0 integer pbuff,pdata=0,0 生产者i repeat P(empty) P(mutex) in=getEBuffer() out=getDBuffer() V(mutex) putdata(in) getdata(out) V(full) V(empty)
进程管理
【例】一个buffer,一个生产者,一个消费者,生产 者不断进行putdata操作,消费者不断进行 getdata操作,即生产者不断生产,消费者不断消 费。 【解答】buffer为空时,才能进行putdata操作,只 有buffer有数据时,才能进行getdata操作 信号量 full:是否有数据初值为0 empty:是否为空,初值为1
进程管理
【分析】把进程R看作是生产者,把进程W1和W2看作是消费 者。现在有一个生产者(进程R)能生产不同的产品(读入 奇数或偶数),把生产的产品存放在缓冲器B中,供不同 的消费者(进程W1和进程W2)取用。可以看出,当进程R 读入的是整数,则要把有奇数的消息发送给进程W1;当进 程R读入的是偶数,则要把有偶数的消息发送给W2,在进 程W1或进程W2从缓冲器中取出数后,应把缓冲器中又可有 一个数的消息告诉进程R,于是,可以定义如下3个信号量: S表示是否可以把数存入缓冲器,由于缓冲器中每次只能放 一个数,所以其初值取为”1“ SO:表示缓冲器中是否有奇数,初值为”0“,表示无奇数 SE:表示缓冲器是否偶数,初值为0,表示无偶数
进程管理
R1
W1
R2
W2
进程管理
【解答】4个进程互斥,R1,W1同步,R2,W2同步 mutex:表示能否把数据存如缓冲器,初始化时缓 冲器为空,故初值为1 S1:进程R1是否已向缓冲器存入一个数据,初值为 0 S2:进程R2是否已向缓冲器存入一个数据,初值为 0
进程管理
begin mutex,s1,s2:semaphore; s:=1;s2:=0;s2:=0; cobegin
进程管理
【例】一个buffer,一个生产者,一个消费者,生产 者只生产一个东西,消费者只进行一次消费,即: 生产者只进行一次putdata操作,消费者只进行一次 getdata操作。
进程管理
【解答】 设置信号量full,表示buffer是否有数据,初值为0 生产者 消费者 putdata P(full) V(full) getdata
process W2 begin L4: P(s2); z:=B; V(mutex); 打印z; goto L4 end;
进程管理
【例】假定有3个进程R,W1,W2共享一个缓冲器,而B中每 次只能存放一个数,当缓冲器中无数时,进程R可将M输入 设备上读入的数存放到缓存器B中,若存放到缓存器中的 是奇数,则允许进程W1将其取出打印;若存放到缓冲器中 的是偶数,则允许进程W2将取出打印。同时规定:进程R 必须等缓冲器中的数被取出打印后才能再存放一个数;进 程W1或W2对每次存入缓冲器中的数只能打印一次;W1和W2 都不能从空的缓冲器中取数。写出这3个并发进程能正确 工作的程序。
进程管理
<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
进程管理
PUT MOVE Buff1 Buff2
GET
进程管理
【解答】三类进程:多个PUT类进程,一个MOVE类进 程,多个GET类进程 操作规则 1 只有buff1有空间才能进行PUT操作 2 只有buff1有数据,buff2有空间才能进行MOVE操 作 3 只有buff2有数据才能进行GET操作 4 不允许多个进程同时操作buff1 5 不允许多个进程同时操作buff2
进程管理
生产者: repeat P(empty) putdata V(full)
消费者: repeat P(full) getdata V(empty)
进程管理
【例】一个buffer,多个生产者,多个消费者,多个生产者 和消费者都在不断地存取buffer,即生产者不断地进行 putdata操作,消费者不断进行getdata操作。 【解答】 只有buffer为空时能进行putdata操作,只有buffer有数据 时能进行putdata操作。 不允许多个进程同时操作buffer,即不允许多个消费者同时 进行getdata,不允许多个生产者进行putdata操作 信号量 full:buffer是否有数据,初值为0 empty:buffer是否为空,初值为1 mutex:buffer是否可操作,初值为1
进程同步习题
设有n个进程共享一个程序段,对如下两种情况: (1)如果每次只允许一个进程进入该程序段; (2)如果每次最多允许m个进程(M<=n)同时进入该 程序段。 试问:所采用的信号量初值是否相同?信号量值的变 化范围如何? 所采用信号量的初值不相同。 在情况(1)中,信号量的初值为1, 信号量值的变化范围是l,0,-1…-(n-1)。 在情况(2)中,信号量的初值为M, 信号量值的变化范围是M,m-1,m-2…(m-n)。
进程管理
5 PV操作实现 <PUT类进程> repeat p(empty1);//判断buff1是否有空间,没有 则等待 p(mutex1);//是否可操作buff1 PUT; v(mutex1);//设置buff1可操作标志 v(full);//设置buff1有数据标志
进程管理
<MOVE类进程> repeat P(full1);判断buff1是否有数据,没有则等待 P(empty2);//判断buff2是否有空间,没有则等待 P(mutex1);//是否可操作buff1 P(mutex2);//是否可操作buff2 MOVE; V(mutex1);//设置buff1可操作标志 V(mutex2);//设置buff2可操作标志 V(empty1);//设置buff1有空间标志 V(full2);//设置buff2有数据标志
进程
进程管理
【例】设A,B为两个并发进程,它们共享一个临界 区,其执行临界区的算法框图如下。试判断该算 法是否有错?请说明理由。如果有错,请改正。 S1,S2的初值为0,CSA,CSB为临界区。
进程管理
操作流程 <PUT类进程> repeat 判断buff1是否有空间,没有则等待 是否可操作buff1 PUT 设置buff1可操作标志 设置buff1有数据的标志 until false
进程管理
<MOVE类进程> repeat 判断buff1是否有数据,没有则等待 判断buff2是否有空间,没有则等待 是否可操作buff1 是否可操作buff2 MOVE 设置buff1可操作标志 设置buff2可操作标志 设置buff1有空间标志 设置buff2有空间标志
消费者j repeat P(full) P(mutex)
V(mutex)
进程管理
【练习】如图,有多个PUT操作同时向Buff1放数据, 有一个MOVE操作不断地将Buff1的数据移到Buff2, 有多个GET操作不断地从Buff2中将数据取走。 Buff1的容量是m,Buff2的容量是n,PUT,MOVE,GET 每次操作一个数据,在操作的过程中要保证数据 不丢失。试用P,V原语协调PUT,MOVE操作,并说明 每个信号量的含义和初值。
进程管理
<GET类进程> repeat P(empty2);//判断buff2是否有空间,没有则 等待 P(mutex2);//是否可操作buff2 GET V(mutex2);//设置buff2可操作标记 V(full2);//设置buff2有数据标记
进程管理
【例】现有4个进程R1,R2,W1,W2。它们共享可以存放一 个数据的缓冲器B。进程R1每次把磁盘上读出的一个数据 存到缓冲器B中,供进程W1打印输出;进程R2每次从键盘 上读一个数据存放到缓冲器B,供W2打印输出。当一个进 程把数据存放到缓冲器后,在该数据还没有打印输出之前 不准任何进程再想缓冲器中存数据。当一个进程已把缓冲 器中的数据打印输出后,在缓冲器中还没有存如新数据之 前不准任何进程再从缓冲器中取数打印。问怎样用PV操作 使这4个进程并发执行时能相互协作地工作?
进程管理
【解答】 integer B; semaphore S,SO,SE SO=0;SE=0: integer x L1:从输入设备读入一个数 X=读入的数 P(S); B=X if(B=偶数)V(SO) else V(SE) goto L1
进程管理
进程管理
Hale Waihona Puke 【例】设有一个具有N个信息元素的环形缓冲区,A 进程顺序地把信息写入缓冲区,B进程依次从缓冲 区读出信息。回答下列问题: 1 叙述A,B两进程的相互制约关系 2 判别下列用PV操作表示的同步算法是否正确?如 不正确,试说明理由,并修改成正确的算法。 设置信号量初值:S1=0,S2=N; 设置变量初值:in=out=0;
进程管理
生产者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的 并行操作。 getEBuffer()返回空的buffer号 getEBuffer() return (pbuffer+1)mod n getDBuffer()返回有数据的buffer号 getDBuffer() return (pdata+1)mod n