- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
T第2章进程3通信线程演示
FILENAME 3880420-58fb47452bc86.doc
PAGE 1
PAGE 16
2.4 经典进程的同步问题
① Dijkstra 1968年提出的生产者-消费者问题
② 五个哲学家进餐问题
③ 读者-写者问题(两类)
2.4.1 生产者-消费者问题(producer-consumer problems)
例3
S
T
GET
COPY
PUT
GET、COPY、PUT三进程共用两个缓冲区S、T(其大小为每次存放一个记录)。GET进程负责不断把输入记录送入缓冲区S中,COPY进程负责从缓冲区S中取出记录复制到缓冲区T中,PUT进程负责把记录从缓冲区T中取出打印,试用WAIT、SIGNAL操作实现这三个进程之间的同步。
① 对GET COPY S是临界区,同步为空满
② 对PUT T是临界区,同步为空满
初始 SE=1 空 TE=1 空
SF=0 满 TF=0 满
GET: COPY:
While(1) While(1)
{wait(se);//申请s空 {wait(sf);//申请s满
add data to s; take data from s;
signal(sf); signal(se);//通知get,s空
} add data to t;
signal(tf)//通知put,t满
}
PUT:
While(1)
{wait(tf);//申请t满
take data to output;
signal(te);//释放t
}
例3:有穷缓冲区生产者和消费者问题
设有多个生产者和消费者,他们共享一个具有n个存储单元的有穷缓冲区0……n-1。
in
out
满
空
遵循以下规则:
1)只要缓冲区有空闲单元,生产者都可存放信息,当缓冲区满时,任一生产者提出要求时,都必须等待。
2)只要缓冲区中有信息可取,消费者都可以从缓冲区中取用信息,当缓冲区空时,任一消费者取用信息都必须等待。
3)生产者们和消费者们不能同时读写缓冲区。
设缓冲区编号为0~n-1,设三个信号量。
semaphore mutex=1,empty= n,full=0;
char buffer[n];
int in=0,out=0;
producer(semaphore mutex, semaphore empty, semaphore full)
{
while(1)
{……
produce a new message m;
wait(empty);
wait(mutex);
buffer(in)=m;
in=(in+1)% n;
signal(mutex);
signal(full);
}
}
consumer(semaphore mutex, semaphore empty, semaphore full)
{
while(1)
{wait(full);
wait(mutex);
in=buffer(out);
out=(out+1)%n;
signal(mutex);
signal(empty);
consume message m
}
}
信号量只与制约进程及被制约进程有关而不是与整组并发进程有关,称该信号量为私用信号量(Private Semaphore)。
一个进程的私用信号量是从制约它的进程发送来的、使它能继续执行条件所需的消息,称互斥信号量为公用信号量(Public Semaphore)。
例4:利用信号量描述前驱关系
为了实现这种前驱关系,我们只需为进程P1,P2,……P6各设置一个私用信号量a,b,c,d,e,作为同步信号,赋初值为0。
S1
S2
S3
S4
S5
S6
p1:{ S1;signal(a);signal(a); }
p2: {wait(a); S2; signal(b);signal(b);}
p3: {wait(a); S3; signal(c); }
p4: {wait(b); S4; signal(d); }
p5: {wait(b); S5; signal(e); }
p6: {wait(d); wait(e); wait(c); S6; }
在考虑进程同步问题时,要注意到几个问题:
① 分析有几个临界区,是否需要公用互斥信号量,初值是多少(资源量)。
② 考虑几个进程如何同步,如何通过信号量互通消息,初值是多少。如何用信号量作为进程阻塞和唤醒的机构。
a)在资源分配和释放情况中,进程所等待的事件是其所要求的资源被其它进程释放出来成为可用。这时信号量代表该资源的数量。
b)在进程间相互协同情况下,使进程等待某事件来控制其执
原创力文档


文档评论(0)