操作系统教程第3章-3 进程的同步与互斥
- 格式:ppt
- 大小:735.00 KB
- 文档页数:23
操作系统中的进程同步与互斥进程同步和互斥是操作系统中重要的概念和技术。
在多道程序环境中,多个进程同时运行,但它们之间存在着共享资源、互相依赖等情况,因此需要进行同步和互斥处理。
本文将从互斥与同步的定义、需求、常用的同步与互斥机制等方面进行论述。
一、互斥与同步的定义互斥是指某个资源同时只允许一个进程访问,其他进程需要等待。
同步是指一组相关进程在执行过程中需要相互合作,按照一定顺序执行。
二、互斥与同步的需求1. 互斥:当多个进程同时访问一个共享资源时,若不进行互斥处理,可能会引发数据不一致、竞争条件等问题。
例如,多个进程同时对一个文件进行写操作,可能导致文件内容错乱。
因此,需要通过互斥来保证每个进程访问共享资源的独占性,避免冲突。
2. 同步:在某些情况下,多个进程需要按照一定顺序执行,以满足某种逻辑关系或条件。
例如,生产者-消费者问题中,生产者需要在缓冲区未满时才能生产,消费者需要在缓冲区非空时才能消费。
因此,需要通过同步来协调进程的执行顺序。
三、常用的同步与互斥机制1. 互斥机制:常用的互斥机制包括信号量、互斥锁和临界区等。
a) 信号量:是一种用于控制对共享资源的访问的机制。
通过定义一个信号量,以保证同一时间只有一个进程可以访问共享资源。
典型的信号量包括二进制信号量和计数信号量。
b) 互斥锁:是一种用于协调多个进程访问共享资源的机制。
通过对共享资源加锁,只有持有锁的进程才能访问该资源,其他进程需要等待。
常见的互斥锁有互斥量(Mutex)和读写锁(ReadWrite Lock)等。
c) 临界区:是指一段在并发执行环境中,对某种共享资源进行操作的代码段。
在进入临界区之前,进程需要获取临界区的访问权限,执行完临界区代码后,释放访问权限。
通过临界区机制,可以保证同一时间只有一个进程在执行临界区的代码。
2. 同步机制:常用的同步机制包括信号量、条件变量和屏障等。
a) 信号量:除了用于互斥机制,信号量也可以用于同步机制。
操作系统同步和互斥操作系统中的进程之间的关系只有两种:同步与互斥。
下面由店铺为大家整理了操作系统的同步和互斥的相关知识,希望对大家有帮助!操作系统同步和互斥1.进程同步进程同步也是进程之间直接的制约关系,是为完成某种任务而建立的两个或多个线程,这个线程需要在某些位置上协调他们的工作次序而等待、传递信息所产生的制约关系。
进程间的直接制约关系来源于他们之间的合作。
比如说进程A需要从缓冲区读取进程B产生的信息,当缓冲区为空时,进程B因为读取不到信息而被阻塞。
而当进程A产生信息放入缓冲区时,进程B才会被唤醒。
2.进程互斥进程互斥是进程之间的间接制约关系。
当一个进程进入临界区使用临界资源时,另一个进程必须等待。
只有当使用临界资源的进程退出临界区后,这个进程才会解除阻塞状态。
比如进程B需要访问打印机,但此时进程A占有了打印机,进程B会被阻塞,直到进程A释放了打印机资源,进程B才可以继续执行。
扩展:临界资源在操作系统中,进程是占有资源的最小单位(线程可以访问其所在进程内的所有资源,但线程本身并不占有资源或仅仅占有一点必须资源)。
但对于某些资源来说,其在同一时间只能被一个进程所占用。
这些一次只能被一个进程所占用的资源就是所谓的临界资源。
典型的临界资源比如物理上的打印机,或是存在硬盘或内存中被多个进程所共享的一些变量和数据等(如果这类资源不被看成临界资源加以保护,那么很有可能造成丢数据的问题)。
对于临界资源的访问,必须是互诉进行。
也就是当临界资源被占用时,另一个申请临界资源的进程会被阻塞,直到其所申请的临界资源被释放。
而进程内访问临界资源的代码被成为临界区。
对于临界区的访问过程分为四个部分:1.进入区:查看临界区是否可访问,如果可以访问,则转到步骤二,否则进程会被阻塞2.临界区:在临界区做操作3.退出区:清除临界区被占用的标志4.剩余区:进程与临界区不相关部分的代码临界资源使用规则:忙则等待、优先等待、空闲让进、让权等待(在临界区的进程,不能在临界区内长时间处于事件等待,必须在一定时间退出临界区)。
操作系统习题讲解进程的同步与互斥(三)赵俊峰P 、V 题的一般分析过程1问题的分析确定有哪些进程y1.问题的分析,确定有哪些进程;2y2.确定各个进程之间的同步互斥关系;y3.信号量的设计(初值以及用来实现哪些进程间的同步互斥、是否需要一般变量的辅助)辅助);y4、实现(避免出现不公平现象比如饥饿、避免出现死锁如P 操作的次序问题)。
同学们的问题1有几个进程进程的划分?y:有几个进程,进程的划分?y 2:if 判断语句与P/V 之间的区别?多余的判断?y 3:每个进程的行为划分?对于行为的控制?该谁去控制?触发行为的条件及被触发的行为?y 5:触发行为的条件及被触发的行为?y 6:需要全面考虑题目要求需要全面考虑题目要求y 7:什么时候需要计数?共享变量需要互斥使用y 8:共享变量需要互斥使用进程同步与互斥习题(四)请用信号量解决以下问题y 把学生和监考老师都看作进程, 学生有N 人, 考场门口每次只能进出个人教师1人. 考场门口每次只能进出一个人, 进考场原则是先来先进. 当N 个学生都进入考场后, 教师才能发卷子. 学生交卷后可以离开考场. 教师要等收上来全部卷子并封装卷子后才能离开考场.(1)(1)问共需设置几个进程?(2) 试用P 、V 操作解决上述问题中的同步和互斥关系.进程同步与互斥习题(四)共享资源:考场门口请用信号量解决以下问题y 把学生和监考老师都看作进程, 学生有N 人, 考场门口每次只能进出个人教师1人. 考场门口每次只能进出一个人, 进考场原则是先来先进.c 当N 个学生都进入考场后, 教师才能发卷子. 学生交卷后可以离开考场. d 教师要等收上来全部卷子并封离同步行为:c d 装卷子后才能离开考场.(1) ?()问共需设置几个进程(2) 试用P 、V 操作解决上述问题中的同步和互斥关系.信号量及其他变量的设置需设置以下的信号量S_Door = 1//能否进出门;S St d tR d 0学生是否到齐S_StudentReady = 0//学生是否到齐;S_Mutex1 = 1//互斥信号量;S M t 21互斥信号量S_Mutex2 = 1//互斥信号量;S_ExamBegin = 0//开始考试;S E O 0考试结束所有试卷S_ExamOver = 0//考试结束,所有试卷已交;int nStudentNum 0;int nStudentNum = 0;int nPaperNum = 0;student(){学生进程P(S_Door);进门;V(S Door);V(S_Door);P(S_Mutex1);// 增加学生的个数nStudentNum ++;if(nStudentNum N)V(S StudentReady);if(nStudentNum == N) V(S_StudentReady);V(S_Mutex1);P(S_ExamBegin);//等老师宣布考试开始考试;交卷;P(S Mutex2);P(S_Mutex2);//增加试卷的份数nPaperNum ++;if(nPaperNum == N) V(S_ExamOver);V(S Mutex2);V(S_Mutex2);P(S_Door);出门;V(S_Door);}Teacher()教师进程(){P(S_Door);进门进门;V(S_Door);P(S StudentReady);//P(S_StudentReady); 最后一个进来学生把老师唤醒;发卷子;for(i=1; i <= N; i++)(;;)V(S_ExamBegin);//开始考试;P(S_ExamOver);//等待考试结束;封装卷子P(S_Door);出门;V(S_Door);}进程同步与互斥习题(五)某商店有两种食品B A 和B, 最大数量各为m 个.该商店将A,B 两种食品搭配出售, 每次各取一个. 为避免食品变质, 遵循先到食品先出售的原则, 有两个食品公司分别不断地供应A,B 两)种食品(每次一个). 为保证正常销售, 当某种食品的数量比另一种的数量超过k(k<m)个时, 暂停对数量大的食品进货, 补充数量少的食品.◦(1)(1) 问共需设置几个进程?◦(2) 试用P ,V 操作解决上述问题中的同步和互斥关系.生产者-消费者中的消费者行为进程同步与互斥习题(五)某商店有两种食品B A 和B, 最大数量各为m 个. 该商店将A,B 两种食品搭配出售, 每次各取一个. 为避免食品变质, 遵循先到食品先出售的原则, 有两个食品公司分别不断地供应A,B 两)种食品(每次一个).为保证正常销售, 当某种食品的数量比另一种的数量超过k(k<m)个生产者-消费者中的生产者行为生产者之间时, 暂停对数量大的食品进货, 补充数量少的食品.的同步行为◦(1) 问共需设置几个进程?(2)PV ◦(2) 试用P ,V 操作解决上述问题中的同步和互斥关系.信号量及其他变量的设置设置以下的信号量 S_Mutex = 1 S Wait A = 0; S_Wait_A = 0; S_Num_A = 0; S BuffNum A = m; S_BuffNum_A = m; S_Wait_B = 0; S Num B 0; S_Num_B = 0 S_BuffNum_B = m; i t N int nNum_A = 0; A 0 int nNum_B = 0; //用于互斥访问的信号量 //A太多了,要等一等 太多了 要等一等B //食品A的空闲缓冲区个数; //B太多了,要等一等A //食品B的空闲缓冲区个数;Producer_A() A进程 { int b_TooMuch; while(1) { 生产产品; P(S_Mutex); if((nNum A nNum_B) == k) b_TooMuch = 1; if((nNum_A nNum B) == k) b TooMuch = 1; else b_TooMuch = 0; V(S_Mutex); if(b T M h) P(S W i A) //A太多了 if(b_TooMuch) P(S_Wait_A); 太多 P(S_BuffNum_A); 向商店提供一个 向商店提供 个A商品; V(S_Num_A); P(S_Mutex); nNum A ++; nNum_A ++; if(nNum_B - nNum_A == k-1) V(S_Wait_B); //可以进B了}}V(S Mutex); V(S_Mutex);Producer_B() B进程 { int b_TooMuch; while(1) { 生产产品; P(S_Mutex); if((nNum B nNum_A) == k) b_TooMuch = 1; if((nNum_B nNum A) == k) b TooMuch = 1; else b_TooMuch = 0; V(S_Mutex); if(b T M h) P(S W i B) //B太多了 if(b_TooMuch) P(S_Wait_B); 太多 P(S_BuffNum_B); 向商店提供一个 向商店提供 个B商品; V(S_Num_B); P(S_Mutex); nNum B ++; nNum_B ++; if(nNum_A - nNum_B == k-1) V(S_Wait_A); //可以进A了}}V(S Mutex); V(S_Mutex);Shop() Sh () { while(1) { P(S_Num_A); ( _Num_B); ); P(S 出售A、B食品各一个; V(S BuffNum A); V(S_BuffNum_A); V(S_BuffNum_B); } }Shop进程信号量和P、V原语的小结对信号量和P、V原语的使用可以归纳为三种情形: 第一,把信号量视为一个加锁标志位,其目的是为了 实现对某个唯一 实现对某个唯 唯一的共享数据 唯 的共享数据 共享数据的互斥访问 互斥访问,如数据库中 的某个记录,各个进程间的某个共享变量。
操作系统中的进程同步与互斥实现在操作系统中,进程同步和互斥是非常重要的概念。
进程同步是确保多个进程在共享资源时按照特定的顺序进行访问,而互斥是确保在任何时候只能有一个进程访问共享资源。
本文将介绍进程同步和互斥的操作系统机制,并讨论它们在现代操作系统中的应用。
一、进程同步机制实际应用场景中,许多进程都需要共享某些资源。
在这种情况下,同步机制可以确保按照特定的顺序共享资源,以避免竞争和死锁。
1.信号量信号量是最常见的同步机制之一。
在操作系统中,信号量是一个计数器,用于记录共享资源的使用次数。
当进程需要访问资源时,它会尝试获取信号量。
如果资源当前没有被其他进程使用,信号量的值将减去1,并且进程将可以访问资源。
如果资源已经被其他进程使用,进程将被阻塞,直到资源可用。
当进程完成资源的使用时,它必须释放信号量,使其值增加1,以便其他进程可以访问该资源。
2.互斥锁互斥锁是一种更简单和更常见的同步机制,它用于确保共享资源仅由一个进程使用。
在操作系统中,互斥锁是一种执行阻塞锁的特殊锁。
如果一个进程想要访问一个共享资源,它必须先尝试获取互斥锁。
如果锁当前未被其他进程使用,则该进程将能够访问资源,锁将被锁定,以允许进程在访问资源时保持独占状态。
当进程完成访问资源时,它必须释放该锁,以便其他进程可以使用它。
3.条件变量条件变量是一种同步机制,用于仅在特定条件下执行操作。
条件变量由两个主要部分组成:条件和等待队列。
条件是一个布尔表达式,用于检查是否满足特定的条件。
等待队列是队列,其中包含在条件不满足时被阻塞的进程。
当条件被满足时,等待进程将被唤醒,并且可以开始执行所需的操作。
二、进程互斥机制在共享资源时,进程互斥是非常重要的。
这可以确保在任何时候仅有一个进程访问共享资源。
以下是三种常见的互斥机制的例子:1.临界区临界区是指只能由一个进程访问的代码部分。
在这种情况下,进程将在进入临界区之前获得互斥锁,以确保在任何时候只有一个进程可以访问临界区。
操作系统中进程同步和互斥的实现方法在操作系统中,进程同步和互斥是非常重要的概念。
它们确保了并发程序的正确性和可靠性。
本文将介绍进程同步和互斥的实现方法。
一、进程同步在多任务环境中,不同的进程之间存在着相互依赖和相互制约的关系。
进程同步是为了协调进程之间的交互,使得它们在适当的时间进行合作,共同完成任务。
1. 互斥锁(Mutex)互斥锁是最常见的进程同步机制之一。
它通过给临界资源加锁,保证同一时刻只有一个进程可以访问该资源。
当一个进程占用了互斥锁后,其他进程试图访问该资源时会被阻塞,直到锁被释放。
2. 信号量(Semaphore)信号量是一种更加通用的进程同步机制。
它是一个计数器,用来控制多个进程对共享资源的访问。
当信号量的值大于等于1时,进程可以访问资源;当值为0时,进程被阻塞。
通过对信号量的操作(P/V操作),可以实现进程之间的同步和互斥。
3. 条件变量(Condition Variable)条件变量用于实现进程间的同步和通信。
当一个进程等待某个条件满足时,可以调用条件变量的等待操作来挂起它的执行;当条件满足时,其他进程可以通过唤醒操作通知等待的进程继续执行。
二、进程互斥进程互斥是为了防止多个进程同时访问或修改共享资源而引发的竞争条件和数据不一致问题。
它保证了同一时刻只有一个进程可以对共享资源进行操作,从而避免了竞争和冲突。
1. 临界区(Critical Section)临界区是一段代码,其中包含对共享资源的访问和操作。
为了实现进程的互斥访问,可以使用互斥锁、信号量等同步机制来对临界区进行保护。
一次只允许一个进程进入临界区,其他进程必须等待。
2. Peterson算法Peterson算法是一种经典的实现进程互斥的算法。
它利用了共享的标志和转弯顺序来实现两个进程之间的互斥访问。
然而,Peterson算法只适用于两个进程之间的互斥,对于多个进程之间的互斥并不适用。
3. 同步屏障(Barrier)同步屏障是一种常用的进程互斥机制。
详解进程同步与互斥机制⽬录⼀、什么是进程同步⼆、什么是进程互斥三、常见的进程同步与互斥机制⼀、什么是进程同步在多道批处理系统中,多个进程是可以并发执⾏的,但由于系统的资源有限,进程的执⾏不是⼀贯到底的,⽽是⾛⾛停停,以不可预知的速度向前推进,这就是进程的异步性。
那么,进程的异步性会带来什么问题呢?举个例⼦,如果有 A、B 两个进程分别负责读和写数据的操作,这两个线程是相互合作、相互依赖的。
那么写数据应该发⽣在读数据之前。
⽽实际上,由于异步性的存在,可能会发⽣先读后写的情况,⽽此时由于缓冲区还没有被写⼊数据,读进程 A 没有数据可读,因此读进程 A 被阻塞。
进程同步(synchronization)就是⽤来解决这个问题的。
从上⾯的例⼦我们能看出,⼀个进程的执⾏可能影响到另⼀个进程的执⾏,所谓进程同步就是指协调这些完成某个共同任务的并发线程,在某些位置上指定线程的先后执⾏次序、传递信号或消息。
再举个⽣活中的进程同步的例⼦,你想要喝热⽔,于是你打了⼀壶⽔开始烧,在这壶⽔烧开之前,你只能⼀直等着,⽔烧开之后⽔壶⾃然会发⽣响声提醒你来喝⽔,于是你就可以喝⽔了。
就是说⽔烧开这个事情必须发⽣在你喝⽔之前。
注意不要把进程同步和进程调度搞混了:进程调度是为了最⼤程度的利⽤ CPU 资源,选⽤合适的算法调度就绪队列中的进程。
进程同步是为了协调⼀些进程以完成某个任务,⽐如读和写,你肯定先写后读,不能先读后写吧,这就是进程同步做的事情了,指定这些进程的先后执⾏次序使得某个任务能够顺利完成。
⼆、什么是进程互斥同样的,也是因为进程的并发性,并发执⾏的线程不可避免地需要共享⼀些系统资源,⽐如内存、打印机、摄像头等。
举个例⼦:我们去学校打印店打印论⽂,你按下了 WPS 的 “打印” 选项,于是打印机开始⼯作。
你的论⽂打印到⼀半时,另⼀位同学按下了 Word 的 “打印” 按钮,开始打印他⾃⼰的论⽂。
想象⼀下如果两个进程可以随意的、并发的共享打印机资源,会发⽣什么情况?显然,两个进程并发运⾏,导致打印机设备交替的收到 WPS 和 Word 两个进程发来的打印请求,结果两篇论⽂的内容混杂在⼀起了。
操作系统进程同步与互斥在操作系统中,进程同步与互斥是非常重要的概念,它们对于保证系统的正确运行、提高资源利用率以及避免各种错误和冲突起着关键作用。
首先,咱们来聊聊什么是进程。
进程可以简单理解为正在运行的程序的实例。
比如说,你打开一个浏览器浏览网页,这时候就有一个浏览器进程在运行;你同时又打开一个文档编辑器写文章,那就又多了一个进程。
那进程同步又是什么呢?想象一下,有两个进程 A 和 B,它们需要合作完成一项任务。
进程 A 要完成某个操作后,进程 B 才能继续进行下一步操作。
这就需要一种机制来确保这种先后顺序,使得它们能够协调工作,这种机制就是进程同步。
举个例子,假设有一个打印任务。
进程 A 负责生成要打印的数据,进程 B 负责控制打印机进行打印。
进程 A 必须先把数据准备好,进程B 才能开始打印。
如果没有进程同步,进程 B 可能在数据还没准备好的时候就去打印,那结果肯定是一团糟。
再来说说进程互斥。
当多个进程都想要访问同一个资源,比如一个共享的变量或者一段代码,但是在同一时间只能有一个进程使用这个资源,这时候就需要进程互斥来保证资源的正确使用。
比如说,有一个银行账户,多个进程可能同时想要对这个账户进行操作,比如存钱或者取钱。
但在同一时刻,只能有一个进程来修改账户的余额,否则就会出现混乱,比如余额计算错误等问题。
为了实现进程同步和互斥,操作系统提供了一些常用的方法和机制。
信号量就是其中一种重要的工具。
信号量可以看作是一个计数器,它的值表示当前可以使用的资源数量。
进程通过对信号量进行操作来实现同步和互斥。
比如,P 操作会减少信号量的值,如果信号量的值小于 0 ,进程就会被阻塞;V 操作会增加信号量的值,如果有被阻塞的进程,就会唤醒其中一个。
还有管程,它把共享资源和对共享资源的操作封装在一起,进程只能通过管程提供的接口来访问共享资源,这样就保证了互斥访问。
另外,临界区也是常见的概念。
临界区是一段代码,在这段代码中进程访问共享资源。