同步和互斥的区别
- 格式:doc
- 大小:1.51 MB
- 文档页数:4
进程的同步与互斥1. 同步:是进程间共同完成一项任务时直接发生相互作用的关系。
2. 互斥:排它性访问即竞争同一个物理资源而相互制约。
l 什么是临界资源、临界区?1. 临界资源:一次仅允许一个进程使用的资源。
2. 临界区:在每个进程中访问临界资源的那段程序。
3. 互斥进入临界区的准则:1) 如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。
2) 任何时候,处于临界区内的进程不可多于一个。
如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待。
3) 进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区。
4) 如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”现象。
l 信号量1. 信号量定义:信号量(信号灯)=<信号量的值,指向PCB的指针>2. 信号量的物理意义:大于0:表示当前资源可用数量1) 信号量的值小于0:其绝对值表示等待使用该资源的进程个数2) 信号量初值为非负的整数变量,代表资源数。
3) 信号量值可变,但仅能由P、V操作来改变。
l P,V操作原语1. P操作原语P(S) :1) P操作一次,S值减1,即S=S-1(请求分配一资源);2) 如果S≥0,则该进程继续执行;如果S<0表示无资源,则该进程的状态置为阻塞态,把相应的PCB连入该信号量队列的末尾,并放弃处理机,进行等待(直至另一个进程执行V(S)操作)。
2. V操作原语(荷兰语的等待)V(S) :1) V操作一次,S值加1,即S=S+1(释放一单位量资源);2) 如果S>0,表示有资源,则该进程继续执行;如果S≤0,则释放信号量队列上的第一个PCB所对应的进程(阻塞态改为就绪态),执行V操作的进程继续执行。
l 进程间简单同步与互斥的实现1. 用P,V原语实现互斥的一般模型:设互斥信号量mutex初值为12. 用P、V原语操作实现简单同步的例子供者和用者对缓冲区的使用关系如下图:S1缓冲区是否空(0表示不空,1表示空),初值S1=0;S2缓冲区是否满(0表示不满,1表示满),初值S2=0;3. 生产者---消费者问题(OS典型例子)mutex互斥信号量,初值为1;full满缓冲区数,初值为0;empty空缓冲区数,初值为N;4. 应用举例[例1] 设系统中只有一台打印机,有三个用户的程序在执行过程中都要使用打印机输出计算结果。
操作系统同步和互斥操作系统中的进程之间的关系只有两种:同步与互斥。
下面由店铺为大家整理了操作系统的同步和互斥的相关知识,希望对大家有帮助!操作系统同步和互斥1.进程同步进程同步也是进程之间直接的制约关系,是为完成某种任务而建立的两个或多个线程,这个线程需要在某些位置上协调他们的工作次序而等待、传递信息所产生的制约关系。
进程间的直接制约关系来源于他们之间的合作。
比如说进程A需要从缓冲区读取进程B产生的信息,当缓冲区为空时,进程B因为读取不到信息而被阻塞。
而当进程A产生信息放入缓冲区时,进程B才会被唤醒。
2.进程互斥进程互斥是进程之间的间接制约关系。
当一个进程进入临界区使用临界资源时,另一个进程必须等待。
只有当使用临界资源的进程退出临界区后,这个进程才会解除阻塞状态。
比如进程B需要访问打印机,但此时进程A占有了打印机,进程B会被阻塞,直到进程A释放了打印机资源,进程B才可以继续执行。
扩展:临界资源在操作系统中,进程是占有资源的最小单位(线程可以访问其所在进程内的所有资源,但线程本身并不占有资源或仅仅占有一点必须资源)。
但对于某些资源来说,其在同一时间只能被一个进程所占用。
这些一次只能被一个进程所占用的资源就是所谓的临界资源。
典型的临界资源比如物理上的打印机,或是存在硬盘或内存中被多个进程所共享的一些变量和数据等(如果这类资源不被看成临界资源加以保护,那么很有可能造成丢数据的问题)。
对于临界资源的访问,必须是互诉进行。
也就是当临界资源被占用时,另一个申请临界资源的进程会被阻塞,直到其所申请的临界资源被释放。
而进程内访问临界资源的代码被成为临界区。
对于临界区的访问过程分为四个部分:1.进入区:查看临界区是否可访问,如果可以访问,则转到步骤二,否则进程会被阻塞2.临界区:在临界区做操作3.退出区:清除临界区被占用的标志4.剩余区:进程与临界区不相关部分的代码临界资源使用规则:忙则等待、优先等待、空闲让进、让权等待(在临界区的进程,不能在临界区内长时间处于事件等待,必须在一定时间退出临界区)。
进程之间同步和互斥的区别和联系
1.同步是指多个进程之间按照一定的顺序执行,互斥是指多个进程之间不能同时访问共享资源。
2. 同步是为了保证进程之间执行顺序的正确性,互斥是为了避免多个进程同时访问共享资源导致数据不一致。
3. 同步机制可以通过信号量、事件、条件变量等方式实现,互斥机制通常使用互斥锁来实现。
联系:
1. 在多进程环境中,同步和互斥是相辅相成的,两者都是为了保证程序的正确性和安全性。
2. 互斥是同步的一种特殊形式,它是为了保证同步进行而采取的措施。
3. 同步和互斥都需要协调多个进程之间的关系,从而达到正确、高效地完成任务的目的。
总之,同步和互斥是操作系统中两个重要的概念,它们的区别在于同步是为了保证执行顺序的正确性,互斥是为了避免多个进程同时访问共享资源导致数据不一致,但是它们在多进程环境中都是相辅相成的。
- 1 -。
详解进程同步与互斥机制⽬录⼀、什么是进程同步⼆、什么是进程互斥三、常见的进程同步与互斥机制⼀、什么是进程同步在多道批处理系统中,多个进程是可以并发执⾏的,但由于系统的资源有限,进程的执⾏不是⼀贯到底的,⽽是⾛⾛停停,以不可预知的速度向前推进,这就是进程的异步性。
那么,进程的异步性会带来什么问题呢?举个例⼦,如果有 A、B 两个进程分别负责读和写数据的操作,这两个线程是相互合作、相互依赖的。
那么写数据应该发⽣在读数据之前。
⽽实际上,由于异步性的存在,可能会发⽣先读后写的情况,⽽此时由于缓冲区还没有被写⼊数据,读进程 A 没有数据可读,因此读进程 A 被阻塞。
进程同步(synchronization)就是⽤来解决这个问题的。
从上⾯的例⼦我们能看出,⼀个进程的执⾏可能影响到另⼀个进程的执⾏,所谓进程同步就是指协调这些完成某个共同任务的并发线程,在某些位置上指定线程的先后执⾏次序、传递信号或消息。
再举个⽣活中的进程同步的例⼦,你想要喝热⽔,于是你打了⼀壶⽔开始烧,在这壶⽔烧开之前,你只能⼀直等着,⽔烧开之后⽔壶⾃然会发⽣响声提醒你来喝⽔,于是你就可以喝⽔了。
就是说⽔烧开这个事情必须发⽣在你喝⽔之前。
注意不要把进程同步和进程调度搞混了:进程调度是为了最⼤程度的利⽤ CPU 资源,选⽤合适的算法调度就绪队列中的进程。
进程同步是为了协调⼀些进程以完成某个任务,⽐如读和写,你肯定先写后读,不能先读后写吧,这就是进程同步做的事情了,指定这些进程的先后执⾏次序使得某个任务能够顺利完成。
⼆、什么是进程互斥同样的,也是因为进程的并发性,并发执⾏的线程不可避免地需要共享⼀些系统资源,⽐如内存、打印机、摄像头等。
举个例⼦:我们去学校打印店打印论⽂,你按下了 WPS 的 “打印” 选项,于是打印机开始⼯作。
你的论⽂打印到⼀半时,另⼀位同学按下了 Word 的 “打印” 按钮,开始打印他⾃⼰的论⽂。
想象⼀下如果两个进程可以随意的、并发的共享打印机资源,会发⽣什么情况?显然,两个进程并发运⾏,导致打印机设备交替的收到 WPS 和 Word 两个进程发来的打印请求,结果两篇论⽂的内容混杂在⼀起了。
linux之多任务的同步与互斥
1、操作系统:
基本都是多任务操作系统,即同时有大量可调度实体在运行。
在多任务操作系统中。
2、同时运行的多个任务可能产生的问题
1) 都需要访问/使用同一种资源
2) 多个任务之间有依赖关系,某个任务的运行依赖于另一个任务
这两种情形是多任务编程中遇到的最基本的问题,也是多任务编程中的核心问题,同步和互斥就是用于解决这两个问题的。
3、互斥
是指散步在不同任务之间的若干程序片断,当某个任务运行其中一个程序片段时,其它任务就不能运行它们之中的任一程序片段,只能等到该任务运行完这个程序片段后才可以运行。
最基本的场景就是:一个公共资源同一时刻只能被一个进程或线程使用,多个进程或线程不能同时使用公共资源。
4、同步
是指散步在不同任务之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。
最基本的场景就是:两个或两个以上的进程或线程在运行过程中协同步调,按预定的先后次序运行。
比如A 任务的运行依赖于B 任务产生的数据。
显然,同步是一种更为复杂的互斥,而互斥是一种特殊的同步。
也就是说互斥是两个任务之间不可以同时运行,他们会相互排斥,必须等待一个线程运行完毕,另一个才能运行,而同步也是不能同时运行,但他是必须要安照某种次序来运行相应的线程(也是一种互斥)!因此互斥具有唯一性和排它性,但互斥并不限制任务的运行顺序,即
任务是无序的,而同步的任务之间则有顺序关系。
嵌入式系统开发同步、互斥与通信嵌入式系统开发中,同步、互斥与通信是三个重要的概念。
它们在系统设计和实现中起着至关重要的作用,确保系统能够高效、稳定地运行。
本文将详细介绍这三个概念,并提供一些实用的编程技巧。
同步是指在多个并发执行的任务或线程之间建立一种时间上的关系,确保它们按照一定的顺序执行。
在嵌入式系统中,同步机制可以帮助我们避免竞态条件、死锁等问题,保证系统的正确性和可靠性。
常用的同步机制包括信号量、互斥锁、条件变量等。
互斥是指在多任务环境下,确保同一时间只有一个任务能够访问共享资源。
互斥机制可以防止多个任务同时修改同一数据,从而避免数据不一致和竞争条件。
常用的互斥机制包括互斥锁、读写锁等。
通信是指在不同任务或线程之间进行数据交换和消息传递。
在嵌入式系统中,通信机制可以帮助我们实现任务之间的协作和资源共享,提高系统的效率和响应速度。
常用的通信机制包括消息队列、共享内存、管道等。
在嵌入式系统开发中,合理地使用同步、互斥和通信机制,可以有效地提高系统的性能和稳定性。
然而,不当的使用也可能导致系统出现死锁、资源竞争等问题。
因此,在进行系统设计和编程时,我们需要仔细分析任务之间的关系,选择合适的同步、互斥和通信机制,并进行严格的测试和验证。
在下一部分,我们将详细讨论如何使用这些机制进行嵌入式系统开发。
我们将通过一些具体的例子,展示如何利用信号量、互斥锁、条件变量等实现任务同步,如何利用互斥锁、读写锁等实现任务互斥,以及如何利用消息队列、共享内存、管道等进行任务通信。
同时,我们还将探讨一些常见的同步、互斥和通信问题,并提供一些解决方案和最佳实践。
嵌入式系统开发同步、互斥与通信嵌入式系统开发中,同步、互斥与通信是三个重要的概念。
它们在系统设计和实现中起着至关重要的作用,确保系统能够高效、稳定地运行。
本文将详细介绍这三个概念,并提供一些实用的编程技巧。
同步是指在多个并发执行的任务或线程之间建立一种时间上的关系,确保它们按照一定的顺序执行。
互斥与同步关系在计算机科学领域中,互斥与同步是非常重要的概念,它们对于多线程编程和并发控制起着至关重要的作用。
互斥和同步关系是为了解决多个线程或进程之间的资源竞争和协同工作的问题。
互斥是指在同一时间内,只允许一个线程或进程访问共享资源。
当一个线程进入临界区,其他线程必须等待,直到该线程退出临界区才能进入。
互斥机制的目的是确保在任何时刻只有一个线程可以访问共享资源,从而避免数据的不一致性和竞态条件的发生。
互斥机制有多种实现方式,其中最常见的是使用互斥锁。
互斥锁是一种同步原语,它提供了两个基本操作:锁定和解锁。
当一个线程想要访问共享资源时,它必须先获取互斥锁,其他线程则必须等待。
一旦线程完成了对共享资源的访问,它就释放互斥锁,其他线程便可以获取锁并进入临界区。
互斥锁的使用可以有效地避免多个线程同时访问共享资源而导致的数据冲突和错误。
与互斥不同,同步是指多个线程或进程之间按照一定的顺序和时间进行协调和合作。
在多线程编程中,同步机制可以确保线程按照一定的顺序执行,避免出现数据竞争和不一致的情况。
同步机制有多种实现方式,其中最常见的是使用信号量。
信号量是一种计数器,用于控制对共享资源的访问。
当一个线程需要访问共享资源时,它必须先获取信号量,如果信号量的计数器大于0,则线程可以继续执行;否则,线程将被阻塞直到信号量计数器大于0。
当线程完成对共享资源的访问后,它必须释放信号量,使得其他线程可以获取信号量并继续执行。
除了互斥锁和信号量,还有其他的同步机制,如条件变量、屏障和互斥量等。
这些机制可以根据具体的需求和应用场景进行选择和使用。
互斥与同步关系密切相关,它们共同构成了多线程编程和并发控制的基础。
互斥机制用于保护共享资源,确保在任何时刻只有一个线程可以访问资源;而同步机制用于协调多个线程的执行顺序,避免数据竞争和不一致的情况。
互斥和同步是为了保证程序的正确性和可靠性,是并发编程中必不可少的概念。
互斥和同步关系是多线程编程和并发控制中的重要概念。
进程互斥和进程同步的概念
进程互斥和进程同步是操作系统中非常重要的概念。
进程互斥指的是在多个进程同时访问共享资源时,需要保证同一时间只有一个进程能够访问该共享资源,以避免数据的破坏和混乱。
进程同步则是指多个进程之间需要协调配合,按照一定的顺序进行执行,以避免进程之间的竞争和冲突。
为了实现进程互斥和进程同步,操作系统引入了一些重要的机制。
其中,最常见的是信号量和互斥锁。
信号量是一种用于进程间通信和同步的机制,它可以实现进程之间的资源共享和协调配合;而互斥锁则是一种互斥访问共享资源的机制,它可以确保同一时间只有一个进程能够访问共享资源。
在实现进程互斥和进程同步时,还需要考虑到并发和死锁等问题。
并发指的是多个进程同时执行的情况,需要确保各个进程之间的执行不会相互干扰;而死锁则是指多个进程之间的循环等待,导致进程无法继续执行的情况。
为了避免这些问题,需要采用一些特殊的算法和机制,如银行家算法和等待唤醒机制等。
总之,进程互斥和进程同步是操作系统中非常重要的概念,对于保证系统的稳定性和可靠性具有重要意义。
在实际应用中,需要根据具体的需求选择合适的机制和算法,以确保系统能够正常运行。
- 1 -。
多线程、并发、并⾏、同步、异步和互斥的解释1. 并发:在中,是指⼀个时间段中有⼏个程序都处于已启动运⾏到运⾏完毕之间,且这⼏个程序都是在同⼀个上运⾏。
其中两种并发关系分别是同步和互斥2. 互斥:进程间相互排斥的使⽤临界资源的现象,就叫互斥。
3. 同步:进程之间的关系不是相互排斥临界资源的关系,⽽是相互依赖的关系。
进⼀步的说明:就是前⼀个进程的输出作为后⼀个进程的输⼊,当第⼀个进程没有输出时第⼆个进程必须等待。
具有同步关系的⼀组并发进程相互发送的信息称为消息或事件。
其中并发⼜有伪并发和真并发,伪并发是指单核处理器的并发,真并发是指多核处理器的并发。
4. 并⾏:在单处理器中多道程序设计系统中,进程被交替执⾏,表现出⼀种并发的外部特种;在多处理器系统中,进程不仅可以交替执⾏,⽽且可以重叠执⾏。
在多处理器上的程序才可实现并⾏处理。
从⽽可知,并⾏是针对多处理器⽽⾔的。
并⾏是同时发⽣的多个并发事件,具有并发的含义,但并发不⼀定并⾏,也亦是说并发事件之间不⼀定要同⼀时刻发⽣。
5. 多线程:多线程是程序设计的逻辑层概念,它是进程中并发运⾏的⼀段代码。
多线程可以实现线程间的切换执⾏。
6. 异步:异步和同步是相对的,同步就是顺序执⾏,执⾏完⼀个再执⾏下⼀个,需要等待、协调运⾏。
异步就是彼此独⽴,在等待某事件的过程中继续做⾃⼰的事,不需要等待这⼀事件完成后再⼯作。
线程就是实现异步的⼀个⽅式。
异步是让调⽤⽅法的主线程不需要同步等待另⼀线程的完成,从⽽可以让主线程⼲其它的事情。
异步和多线程并不是⼀个同等关系,异步是最终⽬的,多线程只是我们实现异步的⼀种⼿段。
异步是当⼀个调⽤请求发送给被调⽤者,⽽调⽤者不⽤等待其结果的返回⽽可以做其它的事情。
实现异步可以采⽤多线程技术或则交给另外的进程来处理。
为了对以上概念的更好理解举⼀个简单例⼦,假设我要做烧开⽔,举杠铃100下,洗⾐服 3件事情。
烧开⽔这件事情,我要做的事情为,准备烧开⽔ 1分钟,等开⽔烧开 8 分钟 , 关掉烧⽔机 1分钟举杠铃100下我要做的事情为, 举杠铃100下 10分钟洗⾐服我要做的事情为,准备洗⾐服 1分钟,等开⽔烧开 5 分钟 , 关掉洗⾐机 1分钟单核情况下同步的完成,我需要做的时间为 1+ 8 +1 + 10 + 1+ 5 +1 = 27 分如果异步,就是在等的时候,我可以切换去做别的事情准备烧开⽔(1) + 准备洗⾐服(1) + 举50下杠铃 (5)分钟+ 关洗⾐机 1分钟 + 举杠铃20下 (2)分钟+ 关烧⽔机 1分钟 + 举30下杠铃(3)分钟1+1+5+1+2+1+3 =14 分钟双核异步并⾏核1 准备烧开⽔ 1分钟+ 举杠铃50下(5)分钟+ 等待3分钟 + 关掉烧⽔机 1分钟核2 准备洗⾐服 1分钟+ 举杠铃50下(5)分钟+ 关掉洗⾐机 1分钟 + 等待3分钟其实只花了 1+5+3+1 = 10分钟其中还有双核都等待了3分钟双核异步⾮并⾏核1 举杠铃100下(10)分钟核2 准备烧开⽔ 1分钟+ 准备洗⾐服 1分钟+ 等待5 分钟+ + 关掉烧⽔机 1分钟 + 等待 1 分钟 + 关掉洗⾐机 1分钟其实只花了 1+5+3+1 = 10分钟多线程的做法单核下线程1 准备烧开⽔ 1分钟,等开⽔烧开 8 分钟 , 关掉烧⽔机 1分钟线程2 举杠铃100下 10分钟线程3 准备洗⾐服 1分钟,等开⽔烧开 5 分钟 , 关掉洗⾐机 1分钟cpu 可能这么切换最理想的切换⽅式线程1 准备烧开⽔1 sleep 1 sleep 5 sleep 1 sleep 2 关开⽔ 1分钟 exit线程2 sleep 1 sleep 1 举杠铃50 5分钟 sleep 1 举杠铃20 2分钟 sleep1 举杠铃30下 3分钟线程3 sleep 1 准备洗⾐服1 分钟 sleep 5 关洗⾐机1分钟 exit最后使⽤了 14分钟和异步是⼀样的。
第五章并发性:互斥和同步相关术语术语解释原⼦操作⼀个或多个指令的序列,对外是不可分的,没有其他线程能看到其中间状态,此操作也不能被中断临界区指的是⼀个保护共⽤资源的程序⽚段,同⼀临界区不能被多个线程同时访问临界资源不可被多个线程同时访问的资源死锁两个或以上的线程,每个都在等其他线程做完某些事情⽽不能继续执⾏的情况活锁两个或以上的线程为了响应其他线程⽽持续改变⾃⾝状态但不做有⽤⼯作的情况互斥当⼀个线程在临界区访问共享资源时,其他线程不能进⼊该临界区的情况条件竞争多个线程读写同⼀共享数据时,结果依赖于他们执⾏的相对时间的情况忙等待(⾃旋等待)线程在得到临界区访问权限之前,只能继续执⾏测试变量的指令来得到访问权,除此之外不能做其他事情⼀、硬件对互斥的⽀持中断禁⽤单处理器机器中可⽤此⽅法达成互斥,通过禁⽤中断的⽅式避免进程被中断,从⽽避免中断处理程序带来的竞争态。
/*关闭中断*//*临界区*//*开启中断*/专⽤机器指令CAS指令cas(compare and swap)是⼀个原⼦指令,不接受中断,由⽐较和交换操作组成:⽐较操作使⽤⼀个测试值与⼀个⽬标内存单元中的值进⾏⽐较,如果内存单元值与测试值⼀直,则进⾏“交换”交换操作设置⽬标内存单元的值为⼀个新值//版本⼀总是返回⽬标内存的旧值。
后续判断返回值与测试值是否相同,相同则表明⽬标内存单元已被更新int compare_and_swap(int *word, int testval, int newval){int oldval;oldval = *word; //取内存值的副本,这个很关键if(oldval == testval){*word = newval;}return oldval;}版本⼆发⽣交换返回true,否则返回falsebool compare_and_swap(int *word, int testval, int newval){int oldval;oldval = *word; //取内存值的副本,这个很关键if(oldval == testval){*word = newval;return true;}return false;}使⽤CAS构造临界区(达成互斥)的⽅法int target = 0; //所有线程均可访问...//每个线程内while(!compare_and_swap(&target, 0, 1)); //版本⼆/*临界区*/target = 0;/*⾮临界区*/...Exchange指令Exchange原⼦的交换两个寄存器间、寄存器与内存间的内容。
2.3进程互斥与同步1.进程互斥(1)临界资源:临界资源是指每次仅允许一个进程访问的资源。
属于临界资源的硬件有打印机、磁带机等,软件有消息缓冲队列、变量、数组、缓冲区等。
诸进程间应采取互斥方式,实现对这种资源的共享。
(2)每个进程中访问临界资源的那段代码称为临界区(3)在操作系统中,当一个进程进入临界区使用临界资源时,另一个进程必须等待,当占用临界资源的进程退出临界区后,另一进程才被允许去访问些临界资源。
我们称进程之间的这种相互制约关系为互斥。
(4)使用临界区的标准:每次至多有一个进程处于临界区;进程在临界区停留有限时间;2.互斥的实现方法(1)利用锁机机制实现互斥0资源可用,1资源已被占用进入临界区之前动作(关锁操作)A考察锁位的值B如果原来的值为0,将锁位置成1C如果原来的值为1,则返回第一步再考察当进程使用完资源后,应将锁位置成0,开锁操作(2)P、V操作实现互斥信号量(s,q)s是一个具有非负初值的整型变量,q是一个初始状态为空的队列,s表示系统中某类资源的数目,当其值大于0时,表示系统中可用资源的数目,当其值小于0时,其绝对值表示系统中因请求该类资源而被阴塞的进程数目。
P、V操作为两条原语P操作P操作记为P(S),其中S为一信号量,它执行是主要完成下述动作:S=S-1若S≥0,则进程继续运行若S<0,则该进程被阴塞,并将它插入该信号量的等待队列中。
V操作V操作记为V(S)S为一信号量,它执行时主要完成下述动作:S=S+1若S>0,则进程继续执行。
若S≤0,则从信号量等待队列中移出第一个进程,使其变为就绪状态,然后再返回原进程继续执行。
2.同步所谓进程同步是指对多个相关进程在执行次序上的协调。
这些进程相互合作,在一些关键点上可能需要互相等待或互通消息。
重温同步与互斥以及PV操作重新温习一下这个概念,其实理解了最重要,PV操作也是基于这个理解基础上的一种机制而已.从其他网站抄了一下,操作系统的书本不会天天带在身边.互斥与同步互斥和同步是两个紧密相关而又容易混淆的概念。
互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。
但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。
在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。
少数情况是指可以允许多个访问者同时访问资源,如"第一类读写者模型"。
信号量(Semaphore):信号量是一个资源计数器,当某线程获取某信号量时,信号量计数首先减1,如果计数小于0,那么该线程被阻塞;当某县城释放某信号量时,信号量计数首先加1,如果计数小于或等与0,那么唤醒某被阻塞的线程并执行之。
对信号量的总结如下:1.如果计数器m大于0,表示还有m个资源可以访问,此时信号量线程等待队列中没有线程被阻塞,新的线程访问资源也不会被阻塞;2.如果计数器m等与0,表示没有资源可以访问,此时信号量线程等待队列中没有线程被阻塞,但新的线程访问资源会被阻塞;3.如果计数器m小于0,表示没有资源可以访问,此时信号量线程等待队列中有abs(m)个线程被阻塞,新的线程访问资源会被阻塞;信号量常被用于保证对多个资源进行同步访问。
关于PV操作:在计算机操作系统中,PV操作是进程管理中的难点。
首先应弄清PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:P(S):①将信号量S的值减1,即S=S-1;②如果S=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
V(S):①将信号量S的值加1,即S=S+1;②如果S 0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。
进程互斥与同步
1、并发与并⾏是两个既相似⽽⼜不相同的概念:
并发性,⼜称共⾏性,是指能处理多个同时性活动的能⼒;
并⾏是指同时发⽣的两个并发事件,具有并发的含义,⽽并发则不⼀定并⾏,也亦是说并发事件之间不⼀定要同⼀时刻发⽣。
两者区别:⼀个是交替执⾏,⼀个是同时执⾏.
2、进程之间存在同步和互斥两种关系
同步是因合作进程之间协调彼此的⼯作⽽控制⾃⼰的执⾏速度,即因相互合作,相互等待⽽产⽣的制约关系。
⽽互斥是进程之间竞争临界资源⽽禁⽌两个以上的进程同时进⼊临界区所发⽣的制约关系。
3、互斥指的是某种资源⼀次只允许⼀个进程使⽤,即在你使⽤的时候我不能⽤,我使⽤是时候你不能⽤,这是⼀种协调⼀种同步
4、如果在⼀个进程集合中的每个进程都在等待只能由该集合中的其他进程才能引发的事件,⽽⽆限期僵持的局⾯称死锁。
⼀个可运⾏进程由于其他进程总是优先于它,⽽被⽆限期拖,延⽽不能被执⾏的现象称饥饿。
死锁进程必然处于饥饿状态,但处于饥饿状态的进程未必陷⼊死锁。
5、每个进程中访问临界资源的那段程序称为临界区,每次只准许⼀个进程进⼊临界区,进⼊后不允许其他进程进⼊。
如果有若⼲进程要求进⼊空闲的临界区,⼀次仅允许⼀个进程进⼊。
任何时候,处于临界区内的进程不可多于⼀个。
如已有进程进⼊⾃⼰的临界区,则其它所有试图进⼊临界区的进程必须等待。
进⼊临界区的进程要在有限时间内退出,以便其它进程能及时进⼊⾃⼰的临界区。
如果进程不能进⼊⾃⼰的临界区,则应让出CPU,避免进程出现“忙等”现象。
信号量互斥量条件变量
同步和互斥
一、信号量:用于进程间通信(linux中用于线程)
独立于进程在两个进程中都要初始化,若一个已创建,则另一个获取可以执行多次v操作,然后再执行p操作
信号量的一些概念:
以下是信号灯(量)的一些概念:
信号灯与互斥锁和条件变量的主要不同在于”灯”的概念,灯亮则意味着资源可用,灯灭则意味着不可用。
如果说后两中同步方式侧重于”等待”操作,即资源不可用的话,信号灯机制则侧重于点灯,即告知资源可用;没有等待线程的解锁或激发条件都是没有意义的,而没有等待灯亮的线程的点灯操作则有效,且能保持灯亮状态。
当然,这样的操作原语也意味着更多的开销。
信号灯的应用除了灯亮/灯灭这种二元灯以外,也可以采用大于1的灯数,以表示资源数大于1,这时可以称之为多元灯。
二、互斥量:(用于在线程间的通信)
1、在一个进程中创建
三、信号量与互斥量的区别
1. 互斥量用于线程的互斥,信号量用于线程的同步。
这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。
互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。
但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。
在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。
少数情况是指可以允许多个访问者同时访问资源
以上区别是主要想记住的。
note:信号量可以用来实现互斥量的功能
2. 互斥量值只能为0/1,信号量值可以为非负整数。
也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。
信号量可以实现多个同类资源的多线程互斥和同步。
当信号量为单值信号量是,也可以完成一个资源的互斥访问。
3、互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。
4、作用域
信号量: 进程间或线程间(linux仅线程间)
互斥锁: 线程间
5、上锁时
信号量: 只要信号量的value大于0,其他线程就可以sem_wait(p操作-1)成功,成功后信号量的value减一。
若value值不大于0,则sem_wait
阻塞,直到sem_post(v操作+1)释放后value值加一
互斥锁: 只要被锁住,其他任何线程都不可以访问被保护的资源
成功后否则就阻塞
四、条件变量:(常与互斥锁一起使用)
互斥锁的一个明显缺点是它只有两种状态:锁定和非锁定.而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法解决了互斥锁的不足,它常与互斥锁一起使用.使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化.一旦其他的某个线程改变了条件变量,它将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程.这些线程将重新锁定互斥锁并重新测试条件是否满足.条件变量的基本操作有以下两个:
触发条件:当条件变为true时;
等待条件:挂起线程直到其他线程触发条件.
注意:条件变量应该和互斥量配合使用,以避免出现条件竞争,一个线程预备等待一个条件变量,当它在真正进入等待之前,另一个线程恰好触发了该条件.
五、互斥量与条件变量之间的关系
1、互斥锁:保护临界资源同一时刻一个线程访问
只有一把锁,可用于锁多种临界资源
但同一时刻只能锁住一个临界资源(同一时刻只能一个进程访问)
2、信号量:只是为了进程通信间保持同步
3、条件变量:不满足条件时,用wait函数阻塞其所在的线程,。