8并发性:互斥和同步课件
操作系统第6章 进程互斥与同步

Co-begin void Producer_i( ) (i=1,2…k) { item next_p; while(1){ produce an item in next_p P(empty); P(s); add next_p to buffer V(s); V(full); } } void consumer_j( ) (j=1,2…m) { item next_c; while(1){ P(full); P(s); remove an item from buffer to next_c V(s); V(empty); consume the item in next_c}} Co-end
• 进入临界段之前要申请,获得批准方可进入; • 退出临界段之后要声明,以便其他进程进入。
用程序描述: While(1){ entry_section; critical_section; exit_section; remainder_section; }
解决临界段问题的软件算法必须遵循:
准则1:不能虚设硬件指令或假设处理机数目。 准则2:不能假设n个进程的相对速度。 准则3:当一个进程未处于其临界段时,不应阻止 其他进程进入临界段。 准则4:当若干进程欲进入临界段时,应在有限时 间内选出一个进程进入其临界段。 用准则3,4不难推出下面原则 协调各进程入临界段的调度原则: • 当无进程处于临界段时,允许一个进程立即进入临界段。
3.实现临界段的硬件方法
利用处理机提供的特殊指令实现临界区加锁。 常见硬件指令有: ⑴ “Test_and_Set”指令 该指令功能描述为: int *target ( 限定为0,1) int Test_and_Set (int *target) { int temp; temp = *target ; *target = 1; return temp; }
互斥与同步

互斥与同步互斥与同步是计算机科学中两个重要的概念,它们是多线程编程中必须掌握的知识点。
本文将介绍互斥与同步的概念、原理、实现方式以及应用场景。
一、互斥1.1 概念互斥是指在多线程并发执行时,对于共享资源的访问需要保证线程之间的排他性,即在任意时刻只有一个线程能够访问共享资源。
1.2 原理互斥的实现基于锁机制,即在访问共享资源前获取锁,在使用完毕后释放锁。
这样可以保证在任意时刻只有一个线程能够获得锁,从而避免了多个线程同时访问共享资源造成的数据竞争问题。
1.3 实现方式常见的实现方式包括:(1)临界区:将对共享资源的访问限制在一个代码块内,在进入临界区前获取锁,在离开临界区后释放锁。
(2)信号量:通过计数器来控制同时进入临界区的线程数量,当计数器为0时表示当前没有进入临界区的线程,当计数器大于0时表示当前有进入临界区的线程。
(3)互斥量:是一种特殊的信号量,只能被一个线程获取,其他线程需要等待该线程释放互斥量后才能获取。
1.4 应用场景互斥常用于对共享资源的访问控制,例如多个线程同时访问同一个文件、数据库或网络连接等。
二、同步2.1 概念同步是指在多线程并发执行时,保证线程之间的协调和顺序性,使得程序按照预期的顺序执行。
2.2 原理同步的实现基于信号机制,即在某个条件满足时通知其他线程进行操作。
例如,在生产者-消费者模型中,当生产者生产了数据后需要通知消费者进行消费。
2.3 实现方式常见的实现方式包括:(1)条件变量:通过等待和唤醒操作来实现对某个条件的等待和通知。
(2)事件对象:是一种特殊的条件变量,可以通过事件对象来设置和清除事件状态,并在事件状态发生改变时通知其他线程进行操作。
(3)屏障:是一种同步原语,在多个线程到达屏障点时会被阻塞,直到所有线程都到达后才会继续执行。
2.4 应用场景同步常用于对线程之间的协调和顺序性控制,例如在多个线程之间进行任务分配、消息传递等。
三、互斥与同步的关系互斥和同步是两个相互依存的概念。
第4章 进程的同步与互斥

mxh
同步
生产者活动:
Repeat 加工一件物品
消费者活动:
Repeat wait(full)
wait(empty)
物品放入箱中 signal(full)
箱中取一物品
signal(empty) 消耗这件物品
Until false
Until false
mxh
互斥
生产者活动:
Repeat
认为缓冲区同一时刻只有一个人可
mxh
4.1 进程的同步和互斥
信号量定义(记录型信号量)
semaphore是一个结构体: typedef struct {
int value;
//资源的个数
//进程链表
struct process *L;
} semaphore;
mxh
4.1 进程的同步和互斥 申请一个
• 信号量操作wait现在可按如 下来定义: void wait (semaphore S) { S.value - -; if (S.value <0) { add this process to S.L; block(); } }
mxh
4.1 进程的同步和互斥
• 信号量的应用
–合作进程的执行次序 –共享缓冲区的进程的同步
mxh
4.1 进程的同步和互斥
• 合作进程的执行次序:
–保证一组合作进程按照逻辑需要所确定 的次序进行。
mxh
4.1 进程的同步和互斥
• 合作进程的执行次序
–可以用一个图来表示进程集合的执行次 序。图的连接描述了进程开始和结束的 次序约束,此图称为进程流图. –例如P78,图4-2。 –使用信号量机制实现图4-2的同步。(练 习)
详解进程同步与互斥机制

详解进程同步与互斥机制⽬录⼀、什么是进程同步⼆、什么是进程互斥三、常见的进程同步与互斥机制⼀、什么是进程同步在多道批处理系统中,多个进程是可以并发执⾏的,但由于系统的资源有限,进程的执⾏不是⼀贯到底的,⽽是⾛⾛停停,以不可预知的速度向前推进,这就是进程的异步性。
那么,进程的异步性会带来什么问题呢?举个例⼦,如果有 A、B 两个进程分别负责读和写数据的操作,这两个线程是相互合作、相互依赖的。
那么写数据应该发⽣在读数据之前。
⽽实际上,由于异步性的存在,可能会发⽣先读后写的情况,⽽此时由于缓冲区还没有被写⼊数据,读进程 A 没有数据可读,因此读进程 A 被阻塞。
进程同步(synchronization)就是⽤来解决这个问题的。
从上⾯的例⼦我们能看出,⼀个进程的执⾏可能影响到另⼀个进程的执⾏,所谓进程同步就是指协调这些完成某个共同任务的并发线程,在某些位置上指定线程的先后执⾏次序、传递信号或消息。
再举个⽣活中的进程同步的例⼦,你想要喝热⽔,于是你打了⼀壶⽔开始烧,在这壶⽔烧开之前,你只能⼀直等着,⽔烧开之后⽔壶⾃然会发⽣响声提醒你来喝⽔,于是你就可以喝⽔了。
就是说⽔烧开这个事情必须发⽣在你喝⽔之前。
注意不要把进程同步和进程调度搞混了:进程调度是为了最⼤程度的利⽤ CPU 资源,选⽤合适的算法调度就绪队列中的进程。
进程同步是为了协调⼀些进程以完成某个任务,⽐如读和写,你肯定先写后读,不能先读后写吧,这就是进程同步做的事情了,指定这些进程的先后执⾏次序使得某个任务能够顺利完成。
⼆、什么是进程互斥同样的,也是因为进程的并发性,并发执⾏的线程不可避免地需要共享⼀些系统资源,⽐如内存、打印机、摄像头等。
举个例⼦:我们去学校打印店打印论⽂,你按下了 WPS 的 “打印” 选项,于是打印机开始⼯作。
你的论⽂打印到⼀半时,另⼀位同学按下了 Word 的 “打印” 按钮,开始打印他⾃⼰的论⽂。
想象⼀下如果两个进程可以随意的、并发的共享打印机资源,会发⽣什么情况?显然,两个进程并发运⾏,导致打印机设备交替的收到 WPS 和 Word 两个进程发来的打印请求,结果两篇论⽂的内容混杂在⼀起了。
同步与互斥实现方法

同步与互斥实现方法一、同步与互斥的概念同步是指多个线程或进程之间按照一定的顺序执行,以达到其中一种约定或要求。
在同步的过程中,程序等待其他线程或进程完成一些操作后再继续执行。
互斥是指多个线程或进程之间访问共享资源时,要互相排斥,避免冲突和竞争。
互斥的目的是保证多个线程或进程对共享资源的操作是互斥的,即同一时刻只有一个线程或进程可以访问共享资源。
二、实现同步的方法1. 互斥锁(Mutex)互斥锁是一种最常用的同步机制,通过对一些代码块或函数的访问加上互斥锁的操作,可以保证只有一个线程能够执行该代码块或函数。
当一些线程获得互斥锁时,其他线程在获得该锁之前会被阻塞。
2. 信号量(Semaphore)信号量是一种更为复杂的同步机制,用于实现一些资源的访问控制。
一个信号量有一个整型值和两个原子操作:P和V。
P操作(也称为wait或down)会使信号量的值减1,如果值小于0,当前线程或进程就会被阻塞。
V操作(也称为signal或up)会使信号量的值加1,如果值小于等于0,就会唤醒等待的线程或进程。
信号量可以用于解决生产者-消费者问题、读者-写者问题等并发编程中的资源竞争问题。
3. 条件变量(Condition Variable)条件变量是一种同步机制,用于在多个线程或进程之间同步共享资源的状态。
条件变量对应一个条件,并提供了等待和通知的机制。
等待操作可以使一个线程或进程等待一些条件成立,直到其他线程或进程通知条件变量,使得等待的线程或进程被唤醒。
通知操作可以使等待中的线程或进程被唤醒,继续执行。
条件变量常和互斥锁一起使用,互斥锁用于保护共享资源,条件变量用于同步共享资源的状态。
三、实现互斥的方法1. Peterson算法Peterson算法是一种经典的软件方法,用于解决两个进程之间的互斥访问问题。
该算法使用了两个布尔型变量flag和turn,通过交替使用这两个变量,实现了两个进程之间的互斥。
2. 印章(Semaphores)信号量也可以用于实现互斥操作。
线程与并发控制:处理多线程的同步和互斥

线程与并发控制:处理多线程的同步和互斥线程和并发控制是计算机科学领域中非常重要的概念,特别是在多核处理器和分布式系统中。
线程是程序执行的基本单位,而并发控制则是指有效地管理多个线程之间的同步和互斥,以保证数据的一致性和程序的正确执行。
在多线程编程中,线程之间的并发控制是一个关键问题。
当多个线程同时访问共享资源时,如果没有适当的同步和互斥机制,就会出现数据竞争和不一致的问题。
因此,了解如何处理线程的同步和互斥是非常重要的。
同步指的是多个线程之间按照一定的顺序执行,以保证数据的一致性。
常见的同步机制包括互斥锁、条件变量、信号量等。
互斥锁是最基本的同步机制,它可以确保同时只有一个线程能访问共享资源,从而避免数据竞争。
条件变量可以在多个线程之间传递信号,以协调它们的执行流程。
信号量可以用来控制并发访问资源的数量,避免资源的过度竞争。
除了同步机制外,还有一些高级的并发控制技术,如读写锁、原子操作、事务内存等。
读写锁可以提高多线程读取共享资源的效率,因为读取操作不涉及数据一致性问题,可以同时进行。
原子操作可以确保某些操作的原子性,即要么全部执行成功,要么全部不执行。
事务内存是一种基于硬件的并发控制技术,可以提供更高的性能和可靠性。
在处理多线程的同步和互斥时,需要遵循一些基本原则。
首先,避免死锁,即当多个线程互相等待对方释放资源时,就会陷入死锁状态。
其次,避免资源泄漏,即确保每个线程在完成任务后释放所有的资源。
最后,避免竞争条件,即多个线程对共享资源的访问顺序可能影响程序的正确执行,需要避免这种情况的发生。
为了提高多线程程序的性能和可靠性,在设计和实现上需要注意一些细节。
首先,尽量减少共享资源的数量,因为共享资源越多,就越容易引发数据竞争和并发控制问题。
其次,合理设计线程的通信和同步机制,避免不必要的等待和阻塞。
最后,尽量避免线程间频繁地切换和竞争,提高程序的并发执行效率。
总的来说,线程和并发控制是计算机科学中非常重要的概念,能够有效地提高程序的性能和可靠性。
同步与互斥实例
同步与互斥的解题思路
①分清哪些是互斥问题(互斥访问临界资源的),哪些是同步问 题(具有前后执行顺序要求的)。 ②对互斥问题要设置互斥信号量,不管有互斥关系的进程有几个 或几类,通常只设置一个互斥信号量,且初值为1,代表一次只允 许一个进程对临界资源访问。 ③对同步问题要设置同步信号量,通常同步信号量的个数与参与 同步的进程种类有关,即同步关系涉及几类进程,就有几个同步 信号量。同步信号量表示该进程是否可以开始或该进程是否已经 结束。 ④在每个进程中用于实现互斥的PV操作必须成对出现;用于实现 同步的PV操作也必须成对出现,但可以分别出现在不同的进程中; 在某个进程中如果同时存在互斥与同步的P操作,则其顺序不能颠 倒,必须先执行对同步信号量的P操作,再执行对互斥信号量的P 操作,但V操作的顺序没有严格要求。
购物问题。某超级市场,可容纳100个人同时 购物,入口处备有篮子,每个购物者可持一个 篮子入内购物。出口处结账,并归还篮子(出、 入口仅容纳一人通过)。请用P、V操作完成 购物同步算法。
Var S, mutex1, mutex2: semaphore;
S:=100; mutex1:=1; mutex2:=1 process Pi:
提水入缸供老和尚饮用。水缸可以容纳10桶水,
水取自同一井水。水井狭窄,每次只能容一个
桶取水。水桶总数为 3 个。每次入、出水缸仅
一桶,且不可同时进行。试给出有关取水、入 水的算法描述。
process 小和尚: begin repeat P(empty); P(count); P(mutex1); 从井中取水;
拣棋子问题。生产围棋的工人不小心把相等数 量的黑棋子和白棋混装在一个箱子里,先要用 自动分拣系统把黑棋子和白棋子分开,该系统 由两个并发执行的进程组成,系统功能如下: (1)进程A专门拣黑子,进程B专门拣白子; (2)每个进程每次只拣一个子,当一个进程在 拣子时不允许另一进程去拣子; (3)当一个进程拣了一个子(黑或白)以后, 必让另一个进程拣一个子(黑或白) 。 请用P、V操作管理两个并发进程,使其能正 确实现上述功能。
操作系统精髓与设计原理-第5章 并发性_互斥和同步
第五章并发性:互斥和同步复习题:5.1列出与并发相关的四种设计问题答:进程间的交互,共享资源之间的竞争,多个进程的同步问题,对进程的处理器时间分配问题5.2列出并发的三种上下文答:多个应用程序,结构化应用程序,操作系统结构5.3执行并发进程的最基本要求是什么?答:加强互斥的能力5.4列出进程间的三种互相知道的程度,并简单地给出各自的定义。
答:进程间互相不知道对方:这是一些独立的进程,他们不会一起工作。
进程间间接知道对方:这些进程并不需要知道对方的进程ID号,但他们共享访问某些对象,如一个I/O缓冲区。
进程间直接知道对方:这些进程可以通过进程ID号互相通信,用于合作完成某些活动。
5.5竞争进程和合作进程进程间有什么区别。
答:竞争进程需要同时访问相同的资源,像磁盘,文件或打印机。
合作进程要么共享访问一个共有的资源,像一个内存访问区,要么就与其他进程相互通信,在一些应用程序或活动上进行合作。
5.6列出与竞争进程相关的三种控制问题,并简单地给出各自的定义。
答:互斥:竞争进程仅可以访问一个临界资源(一次仅有一个进程可以访问临界资源),并发机制必须满足一次只有一个进程可以访问临界资源这个规则。
死锁:如果竞争进程需要唯一的访问多于一个资源,并且当一个进程控制着一个进程,且在等待另一个进程,死锁可能发生。
饥饿:一组进程的一个可能会无限期地拒绝进入到一个需要资源,因为其他成员组成垄断这个资源。
5.7列出对互斥的要求。
答:1.必须强制实施互斥:在具有关于相同资源或共享对象的临界区的所有进程中,一次只允许一个进程进入临界区。
2.一个在临界区停止的进程必须不干涉其他进程。
3.绝不允许出现一个需要访问临界区的进程被无限延迟的情况,即不会饿死或饥饿。
4.当没有进程在临界区中时,任何需要进入临界区的进程必须能够立即进入。
5.对相关进程的速度和处理器的数目没有任何要求和限制。
6.一个进程驻留在临界区中的时间是有限的。
5.8在信号量上可以执行什么操作。
并发性:互斥和同步
此两种进程必须遵循一定的规则
利用信号量实现进程同步-2
• 为了实现进程同步,需采用同步信号量。 • 设置一个同步信号量full,它代表的资源是缓冲器满,它 的初值为0。这个资源是Print进程所拥有,Print进程可以 申请该资源,对它施加P操作,如条件满足Print进程可从 Buffer中取数。而Print进程的合作进程Compute对full信号 量施加V操作,即它可释放该资源。当Compute进程将数 据存入Buffer后,即可释放该资源供Print进程再使用。 • 设置另一个同步信号量empty,它代表的资源是缓冲器空, 它的初值为1 。缓冲器空这个资源是进程Compute所拥有, 它可以申请该资源,对它施加Print操作。而它的合作进程 Print对empty信号量施加V操作。
5.5 读者/写者问题
• 一个数据集(如文件)如果被几个并行进程所共享,有些 一个数据集(如文件)如果被几个并行进程所共享, 进程只要求读数据集内容,它称读者, 进程只要求读数据集内容,它称读者,而另一些进程则要 求修改数据集内容,它称写者, 求修改数据集内容,它称写者,几个读者可以同时读些数 据集,而不需要互斥,但一个写者不能和其它进程( 据集,而不需要互斥,但一个写者不能和其它进程(不管 是写者或读者)同时访问些数据集,它们之间必须互斥。 是写者或读者)同时访问些数据集,它们之间必须互斥。 • 设置互斥信号量 信号量wmutex 表示写者间、读者和写者间互 表示写者间、 设置互斥信号量 读者和写者主要程序如下 程序如下: 斥,读者和写者主要程序如下: reader: writer: 第一个读者到时P( P(wmutex) 第一个读者到时 (wmutex) ) ( ) Read Text Write Text 最后一个读者离开时 一个读者离开时V( V(wmutex) 最后一个读者离开时 (wmutex) ) (
操作系统 进程管理三互斥和同步二
while TS(&lock); critical section lock = FALSE; remainder section
• 利用TS实现进程互斥:每个临界资源设置一个 公共布尔变量lock,初值为FALSE • 在进入区利用TS进行检查:有进程在临界区时, 重复检查;直到其它进程退出时,检查通过;
Test-and-Set指令
该指令读出标志后设置为TRUE boolean TS(boolean *lock) { boolean old; old = *lock; *lock = TRUE; return old; } lock表示资源的两种状态:TRUE表示正被占用, FALSE表示空闲
6
互斥算法(TS指令)
记录型信号量和wait、signal原语
• 信号量是一个确定的二元组(value, L), value 是一个具有非负初值的整型变量,L 是 一个初始状态为空的队列。 • value代表资源的实体。在实际应用中应准确地说
明s的意义和初值;
– 初始化指定一个非负整数值,表示空闲资源总数(又称为―资源信号 量‖)--若为非负值表示当前的空闲资源数,若为负值其绝对值表示 当前等待临界区的进程数
第n个缓冲区
•Empty:有多少空缓冲区,初值为n; •Full:有多少带数据的缓冲区,初值 为0
B[n-1]
生产者消费者问题(续4)
4 用信号量实现进程的同步--生产者-消费者问题
• 我们把上面的例子扩 充,假定缓冲区 buffer 是 一 个 有 界 缓 冲 区, 可存放 n 个数据,同时 假 定 有 n 个 CP 进 程 不 断地产生数据,并送 buffer ; 有 m 个 IOP 进 程 从缓 冲区 中 取数 据 打印。 • 在我们生活中有很多 这样的例子。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. 中断禁止
CPU进行进程切换的事情。所以,通过中断禁止的办法,完全不必 担心别的进程会进入临界区。这时程序的结构如图所示。 禁止中断对于操作系统来说是实现互斥的一项很有用 TSL指令工作流程 的技术。在系统内核中,利用它来保证访问共享资源的安 开始 全是方便的。
临界区 退出区
临界区
开中断
2. 专用机器指令
until false;
8.1.2 同步
一些进程没有使用该资源前,另一些进程不能使用该资源。即必须保证一些进程先使 用资源,另一些进程才能使用该资源,否则进程的执行就要出现问题。这种由于进程 间使用资源次序而产生的制约,就是进程间的所谓“直接制约”关系。 例8-2 : 编写复制n个记录的程序,它把文件F中的记录依次先读到输入缓冲区R,再 从R拷贝到输出缓冲区T,最后写到文件G中。假定R和T的大小正好存放一个记录,如 图所示。 文件F 文件G 解: 可编写三个进程GET、COPY、 记录1 PUT互相配合完成这一工作: 记录1 记录2 (1) GET:负责从文件F中按照顺序 记录2 读出记录,送到输入缓冲区R; GET COPY PUT (2) COPY:负责把输入缓冲区R中 的记录拷贝到输出缓冲区T中; 输入缓冲区R 输出缓冲区T (3) PUT:负责从输出缓冲区T中读 出一个记录,然后依照顺序写入文件们随意的并发执行顺序不可能保证运行结果的正确。
. 进程间因资源共享(这里的资源体现为是一个公共变量)而产生间接制约关系时,
2. 互斥和临界区
的个体行为都是没有问题的(p1和p2的程序编写是正确的),问题在于 “共享”,在于大家都要竞争使用这种共享的资源。
. 例8-1中的进程p1和p2之所以会出问题,不在于它们个体的行为,它们
8.3.1 信号量与P、V操作定义 8.3.2 用P、V操作实现互斥 8.3.3 用P、V操作实现同步
8.5 高级进程通信
8.5.1 消息缓冲通信 8.5.2 信箱通信
8.1 互斥和同步
8.1.1 互斥和临界区
关系,但不能同时使用。即在一个进程使用时,另一个进程不能使用,否则会导致错误。 这种由于使用具有“排他性”资源、而对进程的执行产生影响,使它们间产生了的关系, 就是进程间所谓的“间接制约”关系。 例8-1 : 某用户编写进程p1用于存款,进程p2用于取款。它们都访问变量balance表 示的余额:p1用于增加balance,p2用于减少balance。p1和p2的几条汇编指令代码框 架如下(其中x1、x2分别是p1和p2的临时变量): p1的代码框架: p2的代码框架: …… …… load R1, balance load R1, balance load R2, x1 load R2, x2 add R1, R2 sub R1, R2 store R1, balance store R1, balance … … … …
. 如图所示,给出了临界区互斥时进程的行为。进程A在时刻T 进入临界
区。稍后,在时刻T2进程B试图进入临界区。但是由于进程A已经在临界区 内,因此进程B被阻挡不得进入,直到时刻T3进程A离开临界区,进程B才 被允许进入临界区,并在时刻T4离开临界区。
A进入临界区 进程A: A离开临界区 1
B试图进 入临界区 进程B: B被阻塞 T1 T2 时间 T3
容读到寄存器中,然后往该单元里写入一个非零值,且 读和写操作是不可分割(即在一个指令周期内完成)。 这种指令称为“测试并上锁(TSL)”。格式是: TSL R , x
. 一些计算机中有专门指令,功能是将内存单元的内
x→R (将单元x内容读入寄存器R) 不可分割 1→x (将数值1写入单元x) 结束
变量x里当前值读入寄存器R,同时把 变量x设置为1。这样,寄存器R里保 enter_section : TSL R, x /* 将x的值读入R后设置为1 */ 存的是变量x的原值,x的新值为1。 进入区 CMP R, #1 /* R中的值为1? */ JNE enter_section /* R中的值为1, 转enter_section */ 程序中的指令: CMP R , #1 JNE enter_section 临界区代码 用于测试到变量x的原先值为1时,表 明已有进程在其临界区里,别的进程 exit_section: 退出区 MOVE x, #0 /* 把x设置为0 */ 就不能进入;只有在测试到变量x的原 先值为0时,请求加入临界区的进程才 能够进入它的临界区。也就是说,变 量x起到一把“锁”的作用。 由指令MOVE x , #0完成退出临界区的功能,即把变量x设置为0。只有把“锁”x 打开了,别的进程才可有机会进入自己的临界区。 利用指令TSL确实能够保证临界区的互斥,其缺点是当已有进程在临界区里时,欲 进入临界区的进程就必须不断地去循环执行TSL指令和测试寄存器R的值,从而形成所 谓的“忙等待”。
. 所谓“同步”,是指某进程执行到一点时,若有关进程已完成某种操
.
同步点 进程A: X
进程B: 同步条件
Y
一道工序做准备,在上一道工序的半成品没有到达之前,下一道工序的工人只能处于等 待状态而无所事事。又比如,接力赛跑中,只有在接力区里下一棒运动员接过上一棒运 动员递过来的接力棒,才能奋力奔跑,否则就是犯规。
分析及措施
最后,储蓄余额可能为6000或者7000,都是不 正确的。 原因是:两个进程同时修改同一个数据,而没有 进行有效控制。 正确地方法:如果有多个进程同时对同一数据进 行修改时,系统必须控制一次仅允许一个进程完 成读数据、修改数据两件事,才允许其他进程对 同一数据的读和修改操作。
本章目录
8.1 互斥和同步
记录n
2. 同步
作,那么该进程就可运行下去;否则必须暂停下来,等待有关进程操作的完 成,然后才继续运行。暂停下来等待的那点,称为“同步点”;等待完成的 操作,称为“同步条件”。这时称该进程要与有关进程在同步点取得同步。 如图所示,给出了进程间同步时的行为。进程A执行到点X处时,要与进程B取得 同步;进程B执行到点Y处时,为进程A准备好了同步条件。为此,在进程A执行到点X时, 若进程B还没有越过点Y,那么进程A就须在X处阻塞,等待进程B为准备好条件;若进程 A执行到点X前,进程B已越过点Y,那么进程A就可不受阻挡地一直执行下去。
. 如上例,系统中有这样的一类资源,哪个进程先用它、哪个进程后用它没有什么
1. 进程间的间接制约关系
P2的执行: 代码单独执行时,都会正确地工 P1的执行: … 作。关键是如果两个进程在系统中并 load R1, balance 发地运行,就可能会发生灾难性的错 load R2, x1 时钟中断 误。比如如果两个进程的执行有如图 … 所示的顺序。 load R1, balance 这时,p1在执行到指令:“load R2, x1”后, load R2, x2 sub R1, R2 被时钟中断。随后调度到p2执行。在这个特定的 store R1, balance 运行情景下,会发生下面的动作序列: … 时钟中断 (1) p1中断时,运行现场寄存器(R1、R2) add R1, R2 里的值被保存到PCB1中; store R1, balance (2) p2读balance的值(应该和p1读出的值一 … 样)到R1,读x2的值到R2,然后计算(在寄存器R1里的)balance和(在寄存器R2里 的)x2的差,并将这个差值(在寄存器R1里)回存到变量balance; (3) 又由于时钟中断,使p1最终得到执行,依据PCB1恢复寄存器R1和R2后,计算 (在寄存器R1里的)balance与(在寄存器R2里的)x1的和,但因为balance还是p2执 行前被保存在寄存器R1里的旧值,因此计算时并没有考虑到p2已经把它改变了; (4) 最后的结局是balance里面的值没有正确反映出用户存、取款的情况。
B进入 临界区
B离开 临界区
T4
. 因此,如果进程程序中有临界区,那么其设计应该包括如下的三个部分:
(1) 请求进入临界区的代码段,称为“进入区”,任务是判定是否有进程在临界区 里。如果有,则等待进入;否则才能允许进入临界区;如果可以进入则必须设置临界区 使用标志,阻止它后来的进程进入临界区,后来的进程通过查看临界区的使用标志,知 道自己不能进入临界区,就进入阻塞队列将自己阻塞 。 (2) 请求退出临界区代码段,称为“退出区”,任务是修改临界区使用标志,判定 是否有进程在等待进入临界区。如果有,就要唤醒它们,给予进入的机会。
第8章 并发性:互斥和同步
问题: 、如何协调多个进程对系统资源、 问题:1、如何协调多个进程对系统资源、如内存 空间、外部设备等的资源和共享? 空间、外部设备等的资源和共享? 2、如何解决多个进程因为竞争资源而出现的执行 、 甚至系统不稳定,失效等问题? 结果异常 ,甚至系统不稳定,失效等问题? 3、进程同时申请文件打印,如何有效分配打印机? 、进程同时申请文件打印,如何有效分配打印机? 同步—协调 对相关进程在执行次序上进行协调, 协调, 同步 协调,对相关进程在执行次序上进行协调,使 并发执行 的进程之间有效共享资源和相互合作, 的进程之间有效共享资源和相互合作,使程序的执行 具有可再现性。 具有可再现性。
8.1.1 互斥和临界区 8.1.2 同步 8.3.4 用P、V操作实现资源分配 8.3.5 管程
8.2 实现互斥的方法讨论
8.2.1 实现互斥的硬件方法 8.2.2 实现互斥的软件方法
8.4 互斥、同步的样例分析
8.4.1 读者-写者问题 8.4.2 哲学家就餐问题 8.4.3 理发师理发问题
8.3 信号量与P、V操作
及共享任何资源的情况时,都有可能引发类似的问题。既要允许进程共享资源,又要阻 止错误的发生,唯一的办法是保证进程“互斥”地使用资源,即确保当一个进程在使用 一个共享资源时,其他进程不能同时去使用。 用的资源称为“临界资源”。
. 计算机中,凡涉及共享变量、共享内存区、共享队列(如就绪队列)、共享文件