经典的进程同步问题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
经典的进程同步问题
------生产者-消费者问题
问题描述:有一群生产者进程在生产产品, 并将这些产品提供给消费者进程去消费. 为使生产者进程与消费者进程能并发执 行,在两者之间设置了一个具有n个缓冲区 的缓冲池,生产者进程将它所生产的产品 放入一个缓冲区中;消费者进程可从一个 缓冲区中取走产品去消费.两者之间必须 保持同步.
生产者和消费者两进程共享下面的变量: Var n : integer; type item=…; var buffer : array[0 , 1, …, n-1] of item; in ,out : 0, 1, …, n-1 ; counter: 0 ,1 ,…, n ;
缓冲池是组织成循环缓冲的,故应把输入指 针加1表示成in:=(in+1) mod n;输出指针加1 表示成out:=(out+1)mod n. 当(in+1) mod n=out时表示缓冲池满;而 in=out则表示缓冲池空. 此外,还引入了一个整型变量counter,其初始 值为0.每当生产者进程向缓冲池中投放一个 产品后,使counter加1;反之,每当消费者进程 从中取走一个产品时,使counter减1.
produce(&item); p(s1); p(mutex); buffer[in]:=item; in:=(in+1) mod n; v(mutex); v(s2); } } consumer(消费者进程): Item_Type item; { while (true) { p(s2); p(mutex); item:=buffer[out]; out:=(out+1) mod n; v(mutex); v(s1); consume(&item); } }
解答: 进程:Producer - 生产者 进程,Consumer - 消费者 进程 共有的数据结构: buffer: array [0..n-1] of integer; in,out: 0..n-1; — in记录第一个空缓 冲区,out记录第一个不 空的缓冲区 s1,s2,mutex: semaphore; — s1控制缓冲区不 满,s2控制缓冲区不 空,mutex保护临界区; 初始化 s1=k,s2=0,mutex=1 producer(生产者进程): Item_Type item; { while (true) {
源自文库
一次只可放一个产品
生产者 消费者
缓冲池
放产品 取产品
生产者 缓冲池
消费者
缺货中~~~
不允许 消费者 进程到 一个空 缓冲区 去取产 品.
仓库已满
也不允许 生产者进 程向一个 已装满产 品且尚未 被取走的 缓冲区中 投放产品.
解题思路: 我们可利用一个数组来表示上述具有n个 (0,1,n-1)缓冲区的缓冲池.用输入指针in来指 示下一个可投放产品的缓冲区,每当生产者 进程生产并投放一个产品后,输入指针加1;每 当消费者进程取走一个产品后,输出指针加1.
------生产者-消费者问题
问题描述:有一群生产者进程在生产产品, 并将这些产品提供给消费者进程去消费. 为使生产者进程与消费者进程能并发执 行,在两者之间设置了一个具有n个缓冲区 的缓冲池,生产者进程将它所生产的产品 放入一个缓冲区中;消费者进程可从一个 缓冲区中取走产品去消费.两者之间必须 保持同步.
生产者和消费者两进程共享下面的变量: Var n : integer; type item=…; var buffer : array[0 , 1, …, n-1] of item; in ,out : 0, 1, …, n-1 ; counter: 0 ,1 ,…, n ;
缓冲池是组织成循环缓冲的,故应把输入指 针加1表示成in:=(in+1) mod n;输出指针加1 表示成out:=(out+1)mod n. 当(in+1) mod n=out时表示缓冲池满;而 in=out则表示缓冲池空. 此外,还引入了一个整型变量counter,其初始 值为0.每当生产者进程向缓冲池中投放一个 产品后,使counter加1;反之,每当消费者进程 从中取走一个产品时,使counter减1.
produce(&item); p(s1); p(mutex); buffer[in]:=item; in:=(in+1) mod n; v(mutex); v(s2); } } consumer(消费者进程): Item_Type item; { while (true) { p(s2); p(mutex); item:=buffer[out]; out:=(out+1) mod n; v(mutex); v(s1); consume(&item); } }
解答: 进程:Producer - 生产者 进程,Consumer - 消费者 进程 共有的数据结构: buffer: array [0..n-1] of integer; in,out: 0..n-1; — in记录第一个空缓 冲区,out记录第一个不 空的缓冲区 s1,s2,mutex: semaphore; — s1控制缓冲区不 满,s2控制缓冲区不 空,mutex保护临界区; 初始化 s1=k,s2=0,mutex=1 producer(生产者进程): Item_Type item; { while (true) {
源自文库
一次只可放一个产品
生产者 消费者
缓冲池
放产品 取产品
生产者 缓冲池
消费者
缺货中~~~
不允许 消费者 进程到 一个空 缓冲区 去取产 品.
仓库已满
也不允许 生产者进 程向一个 已装满产 品且尚未 被取走的 缓冲区中 投放产品.
解题思路: 我们可利用一个数组来表示上述具有n个 (0,1,n-1)缓冲区的缓冲池.用输入指针in来指 示下一个可投放产品的缓冲区,每当生产者 进程生产并投放一个产品后,输入指针加1;每 当消费者进程取走一个产品后,输出指针加1.