- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第五讲 进程同步
第五讲 进程同步 中国科学技术大学计算机系 陈香兰 xlanchen@ustc.edu.cn 2013Fall 内容提要 进程同步问题的来由和进程同步的主要任务 临界资源和临界区 2任务的进程互斥问题的解决方案 信号量Semaphores 死锁和饿死现象 经典同步问题 管程 进程间通信 内容提要 进程同步问题的来由和进程同步的主要任务 临界资源和临界区 2任务的进程互斥问题的解决方案 信号量Semaphores 死锁和饿死现象 经典同步问题 管程 进程间通信 进程同步问题的来由 The processes are cooperating with each other directly or indirectly. Concurrent access to shared data may result in data inconsistency. 举例: 打印机 共享变量、表格、链表 细分进程之间的相互制约关系 间接相互制约关系来源于进程间的资源共享关系,例如打印机 直接相互制约关系来源于进程间的合作,例如利用缓冲区传递信息 进程同步的主要任务是: 对多个相关进程在执行次序上进行协调,以使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可在现性 内容提要 进程同步问题的来由和进程同步的主要任务 临界资源和临界区 2任务的进程互斥问题的解决方案 信号量Semaphores 死锁和饿死现象 经典同步问题 管程 进程间通信 临界资源和临界区 举例:生产者-消费者问题(P-C问题) Example: producer-consumer problem PC问题是经典的同步问题 一群生产者进程(Producer)生产产品(信息)提供给消费者进程消费 它们使用具有n个缓冲区的缓冲池来传递(共享)产品 生产者每次将一个产品放入一个缓冲区 消费者每次从一个缓冲区中取走一个产品 生产者进程与消费者进程并发异步的运行,它们之间必须同步: 不允许生产者向一个满的缓冲区投放产品 不允许消费者从一个空的缓冲区去取产品 错误示例程序 producer: repeat…produce an item in nextp…while counter = n do no-opbuffer[in] := nextp;in:=in+1 mod ncounter:=counter+1;until false; consumer: repeatwhile counter =0 do no-op;nextc:=buffer[out];out:=(out+1) mod n;counter:=counter-1;…consumer the item in nextc;…until false; var n: integer; //缓冲池大小 type item=…; var buffer: array [0,1,…,n-1] of item; //缓冲池 in, out : 0,1,…,n-1; //下一个可投和可取,初始0 counter: 0,1,…,n; //当前产品个数 C语言的表示(1) Shared data #define BufSize 10 typedef struct { … } item; item buf[BufSize]; int in=0; int out = 0; int count =0; Producer item newProduced; While (1) { /*produce an new item;*/ while (count==BufSize) ; /* do nothing */ ++count; buf[in] = newProduced; in = (in+1) %BufSize; } Consumer item nextConsumed; While(1) { while (count==0); /* do nothing */ --count; nextConsumed = buf[out]; out = (out+1) %BufSize; /* consume */ } C语言的表示(2),判断空和满的方法不同 Shared data #define BufSize 10 typedef struct { … } item; item buf[BufSize]; int in=0; int out = 0; The shared buffer is implemented as a circular array in points to the next free position in t
文档评论(0)