您好,欢迎访问三七文档
操作系统-同步互斥并发执行,在我们串行执行的pc上的含义,是指两部分的程序代码,可能以任意的次序执行。如果它们对共享对象进行了修改,如果汇编指令的执行顺序不同,就可能产生不同的结果,这样就有问题,必须对程序的执行过程进行控制。这个本质也提供了一种我们分析一段程序是否需要人工控制的标准:考虑两个程序的汇编级的指令混合,结果会如何?进程之间的关系主要有两种,同步与互斥。所谓互斥,是指散步在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。所谓同步,是指散步在不同进程之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。也就是说同步是指两个进程为完成某项任务,必须进行协作,有前后次序的等待关系。互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。当多个进程访问或操作同一个数据,且执行结果与访问的特定顺序有关,称为竞争条件。为了防止这种竞争,必须确保一段时间内只有一个进程能够操作这个数据。为了实现这种保证,就需要一定形式的进程间同步。实现互斥有这样一些方法,禁止中断,执行测试和设置操作,禁止调度,使用信号量。同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。同步机制有criticalsections(关键区域、临界区域),mutex(互斥器),semaphore(信号量),event(事件)。临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。互斥量:为协调共同对一个共享资源的单独访问而设计的。信号量:为控制一个具有有限数量用户资源而设计,允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。事件:用来通知线程有一些事件已发生,从而启动后继任务的开始。临界区,进程中有一个代码段,在该段中,进程可能改变共同变量,当某一个进程进入临界区后,不允许其他进程再进入。因此临界区的执行在时间上互斥。互斥器,跟临界区很相似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完后应将拥有的互斥对象交出,以便其他线程在获得后得以访问资源。互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。信号量,允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。在用CreateSemaphore()创建信号量时即要同时指出允许的最大资源计数和当前可用资源计数。一般是将当前可用资源计数设置为最大资源计数,每增加一个线程对共享资源的访问,当前可用资源计数就会减1,只要当前可用资源计数是大于0的,就可以发出信号量信号。但是当前可用计数减小到0时则说明当前占用资源的线程数已经达到了所允许的最大数目,不能在允许其他线程的进入,此时的信号量信号将无法发出。线程在处理完共享资源后,应在离开的同时通过ReleaseSemaphore()函数将当前可用资源计数加1。在任何时候当前可用资源计数决不可能大于最大资源计数。所谓的信号量,是一份数据,通过对它进行两个操作,一个是设置信号量signal,另一个是wait。当进程执行wait操作时,检查信号量的值,如果不为正,则它必须等待,等待完毕后会重设信号量使其值非正。而signal操作则完成信号的释放,使其值为正,从而让wait结束等待。等待可以通过忙等待实现,或者将它切换到阻塞状态。信号量机制的实现,依赖于wait和signal两个动作必须原子执行。这就等于把wait和signal做成临界区,对于单处理器可以通过在wait或者signal时,禁止中断来实现临界区。多个处理器情况下就不可以了。wait意味着该程序要等待,直到另一个进程执行signal为止。信号量与pv操作的过程基本一致。事件这样一些机制是由一些基本的通讯原语实现的,比如开锁和关锁,pv操作。lock和unlock使用一个共享变量x代表临界资源的一个状态。x=0(临界资源可用)1(临界资源不可用),使用过程如下:1.检查x的值,如果x==1,则陷入无限等待,返回继续检查;当x==0,表示资源可用,置x=12.进入临界区,访问临界区资源3.释放临界区资源,置x=0pv操作,更复杂,它可以避免无限等待,而使进程陷入阻塞状态。整个过程如下:p操作P(s)1.s=s-12.如果s=0表示有资源,则进程继续执行;如果s0,则表示无资源,执行原语的进程被置为阻塞状态,并使其在s信号量的队列中等待,直到其他进程执行v操作释放它为止。v操作V(s)1.s=s+12.如果s0该进程继续执行;如果s=0则释放s信号量队列的排头等待者,并清楚其阻塞状态,转为就绪状态,执行V(s)者继续运行。(因为如果s=0,说明在进程执行期间,有新的进程被阻塞,处在等待状态)需要注意的是,pv操作都是低级通讯原语,也就是说在执行中各个动作都是不可分割的,不允许任何进程中断它的操作,这就保证了同时只有一个进程对信号量s进行p或者v操作。pv操作实际上是实现进程同步与互斥的一个基本工具。lock和unlock可以看成是s初始为1的pv操作。pv操作放到一块,可以建立临界区,放到不同的地方,可以保证这两个地方执行的先后顺序。通过对一段程序,建立同一个s的pv操作P(S)...V(S)可以建立临界区,这样就实现了互斥。变换一下P(s1)A...--------------B....V(S1)置S1初始为0,就可以保证A等待B执行完毕之后执行,由此可以实现同步。关键术语:原子操作:一个或者多个指令的序列临界区:一段代码,在该代码中进程将访问该共享资源死锁:两个或者两个以上的进程因其中的每个进程都在等待其他进程做完事情而不能继续执行活锁:两个或者两个以上的进程为了响应其他进程中的变化而持续改变自己的状态但是不做有用的工作互斥:当一个进程在一个临界区访问共享资源时,其他进程不能进入该临界区访问任何共享资源竞争条件:多个线程或者进程在读写一个共享数据时,结果依赖于它们执行的相对时间饥饿:一个可运行的进程尽管能继续执行,但是被调度器无限期的忽视并发的原理:在单处理器多道程序设计系统中,进程交替执行,表现出一种同时执行的外部特征在多处理器系统中,不仅可以交替执行,还能够重叠执行进程单处理器,多道程序设计系统:全局资源充满危险操作系统很难对资源进行最优化分配定位程序设计存在困难竞争条件:竞争条件:多个进程或线程读写数据时,最终的结果依赖于多个进程的指令执行顺序进程的交互:知道程度关系一个进程对其他进程的影响潜在的控制问题进程之间不知道对方竞争一个进程的结果与其他的进程无关进程的执行时间可能受到影响互斥死锁饥饿进程间接知道对方存在通过共享合作一个进程的结果可能依赖于其他进程获得的信息进程的执行时间可能会受到影响互斥死锁饥饿数据一致性进程直接知道对方通过通信合作一个进程的结果可能依赖于其他进程获得的信息进程的计时可能会受到影响死锁饥饿互斥的要求:1.必须强制实施互斥,一次只能有一个进程进入临界区2.一个在非临界区停止的进程不能干涉其他进程3.不允许出现需要访问临界区的进程被无限延迟的现象,不会出现死锁和饥饿4.没有进程在临界区内,任何需要进入临界区的进程必须能够进入5.进程的执行数目与处理器的数目没有任何限制6.一个进程在临界区停留的时间必须有限互斥:两个或者更多的进程访问一个不共享的资源,在执行过程中,每个进程都给该IO设备发命令,接收状态信息,发送和接收数据,这类资源称为临界资源使用临界资源的那一部分程序称为临界区死锁:两个进程p1,p2,以及两个资源R1,R2,假设每个进程都需要访问该两个资源,操作系统把R1分配给P2,R2分配给P1,每个进程都在等待另一个资源,在获得其他资源并完全成功前,不会释放已拥有资源饥饿:三个进程P1,P2,P3,每个进程都周期性的访问资源P1拥有资源,P2和P3都被延迟,等待这个资源,当P1退出临界区时,P2和P3都被允许访问R,在P3访问完成临界区之前P1又需要访问该临界区,这样将访问权轮流的授予P1和P3,就会出现饥饿状态
本文标题:操作系统-同步互斥
链接地址:https://www.777doc.com/doc-2381320 .html