- 1、本文档共132页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
操作系统-进程互斥与同步
并发:互斥与同步 本章教学目标 理解进程的并发性带来的问题 理解什么是临界区管理 掌握临界区管理的软、硬件方法 掌握信号量及PV操作解决互斥与同步问题 掌握管程的概念及用法 掌握进程间通信的方法 进程的顺序性 一个进程在顺序处理器上的执行是严格按序的,一个进程只有当一个操作结束后,才能开始后继操作 顺序程序设计是把一个程序设计成一个顺序执行的程序模块,顺序的含义不但指一个程序模块内部,也指两个程序模块之间。 顺序程序设计特点 程序执行的顺序性 程序环境的封闭性 程序执行结果的确定性 计算过程的可再现性 进程的并发性(1) 进程执行的并发性:一组进程的执行在时间上是重叠的。 并发性举例:有两个进程A(a1、a2、a3)和B(b1、b2、b3)并发执行。 a1, a2, a3, b1, b2, b3 a1, b1, b2, a2, a3, b3 从宏观上看,并发性反映一个时间段中几个进程都在同一处理器上,处于运行还未运行结束状态。 从微观上看,任一时刻仅有一个进程在处理器上运行。 进程的并发性(2) 并发的实质是一个处理器在几个进程之间的多路复用,并发是对有限的物理资源强制行使多用户共享,消除计算机部件之间的互等现象,以提高系统资源利用率。 进程的并发性(3) 单处理机系统中,多道程序设计使得不同的进程交错执行 多处理机系统中,不同的进程可以同时执行。 进程执行的速度不可预测,依赖于其它进程的行为、操作系统处理中断的方式以及操作系统的调度策略。 并发性使程序的执行失去了封闭性、顺序性、确定性和可再现性 并发程序设计 while(true) { input; process; output; } 并发带来的问题 并发进程可能是无关的,也可能是交互的 无关的并发进程是指它们分别在不同的变量集合上操作 交互的并发进程共享某些变量,之间具有制约关系,有可能产生时间相关的错误。 无关的并发进程 无关的并发进程 一组并发进程分别在不同的变量集合上操作 一个进程的执行与其他并发进程的进展无关。 并发进程的无关性是进程的执行与时间无关的一个充分条件,又称为Bernstein条件。 Bernstein条件 设R(pi)={a1, a2, …, an},表示程序pi在执行期间引用的变量集; W(pi)={b1, b2, …, bn},表示程序pi在执行期间改变的变量集; 两个进程的程序p1和p2满足Bernstein条件是指引用变量集与改变变量集交集之并为空集,即: (R(p1)∩W(p2))∪(R(p2)∩W(p1))∪(W(p1)∩W(p2))={ } Bernstein条件举例 例如,有如下四条语句: S1: a := x + y S2: b := z + 1 S3: c := a – b S4: w := c + 1 于是有:R(S1)={x,y} ,R(S2)={z},R(S3)={a,b},R(S4)={c};W(S1)={a}, W(S2)={b},W(S3)={c},W(S4)={w}。 S1和S2可并发执行,满足Bernstein条件。 并发程序带来的好处 单处理器系统上,可有效利用资源,让处理器和I/O设备,I/O设备和I/O设备同时工作,充分发挥机器部件的并行能力; 硬件能并行工作仅有了提高效率的可能性,硬部件并行性的实现需要软件技术去利用和发挥,这种软件技术就是并发程序设计。 在多处理器系统上,可让进程在不同处理器上物理地并行工作 并发程序设计是多道程序设计的基础,多道程序的实质就是把并发程序设计引入到系统中。 与时间有关的错误 并发进程使得进程的执行不可预测,甚至无法再现。 进程间的相互影响和制约导致对资源的共享充满了危险,各种与时间有关的错误就可能出现 结果不唯一 结果与进程执行的速度相关 永远等待 进程相互等待产生死锁,或进程一直得不到资源产生饿死现象 结果不唯一(例1) 生产者 while(true) { /* produce an item in nextProduced; */ while(counter == BUFFER_SIZE) ; /* do nothing */ buffer[in]=nextProduced; in = (in+1)%BUFFER_SIZE; counter++; } T0: 生产者执行 register1=counter; [register1=5] T1: 生产者执行 register1=register1+1; [register1=6] T2: 消费者执行 register2=counter;
文档评论(0)