------------------------------------------《进程同步互斥问题》------------------------------------------
进程异步性:各进程并发的执行,以独立的不可预知的进度向前推进。
异步性使得进程可能不是按照预期的想法进行,提出了进程同步机制。比如下面这个图
同步就是直接制约关系
进程互斥:一段时间内只允许一个进程使用得资源成为互斥资源,
当对资源进行访问时,必须互斥进行,成为间接制约关系。
--------------------------------------------------------------------------------------------------------------------------
单标志法:
当前用标志的进程一直不进入临界区,后面的就得不到权限,违背了空闲等待原则。
双标志先检查法:
进入临界区之前先看一看别人有没有用的,没有的话把自己的标志设置为1然后进入临界区使用资源。先检查后上锁。
问题就是:
意思就是调度使得两个进程都被设置为1,导致两个进程同时进入临界区。
双标志后检查法:
就是把栓标志检查法的上锁标志放在检查之前,先上锁后检查。
但是由于调度使得两个进程同时上锁,这时候就是谁也用不上。
Peterson算法:
双标志后检查法中或造成谁也不让谁,增加标示量,标示能否让别的进程抢在自己面前进入临界区。
A谦让,B也谦让,B的为最后一句,A使用完之后让B用。
未遵循让权等待原则。
搞清楚进入区,然后让两个并发进行,看看结果有啥。
中断屏蔽方法:
多处理机时候,有可能多个处理机处理同一个临界区造成错误。
开关中断权限特别大,不能随意让用户使用。只能有操作系统内核来操作。
TS指令不能被中断:硬件实现,将一个指令上锁,不满足让权等待原则
Swap指令:硬件实现,
--------------------------------------------------------《信号量机制》-----------------------------------------
整形信号量:
原语是由关中断、开中断实现的。
P:wait S-=1
V:signal S+=1
整形信号量:不满足让权等待会发生忙等。
记录型信号量:不会发生忙等
记录性信号量:
在signal的时候检查一下信号量是不是负数,如果是负数就执行一个唤醒操作。一直唤醒直到标志量>=0。
记录型信号量在P之后发现标志小于0,就会让当前进程进入自我阻塞状态,当前进程主动释放CPU,实现了让权等待原则,不会出现忙等状态。
记录型信号量在V之后发现标志小于0,标明依然有进程在等待该资源,此时调用wakeup唤醒等待对列中的第一个资源,从阻塞态转化为就绪态。
-----------------------------------信号量机制实现进程互斥--------------------------------
PV成对出现,
信号量实现前驱关系:
对应上面的同步,只能先V使得S++,然后才能进行下一步P操作。
-----------------------------------------------《第二波》-------------------------------------------------
生产者消费者问题:
两个同步关系:当缓存区为空的时候,消费者需要等待生产者生产,当换股长宁区为空的时候,生产者需要等待消费者消费。
一个互斥关系:互斥的使用临界区资源。
实现互斥的PV操作应该放在同步的锁之后。
当同步在互斥之后,就会发生生产者先P(mutex),然后P(empty}的时候发生堵塞,此时生产者等待消费者消费,但是消费者得不到权限,被生产者占有,所以造成死锁。此时的empty为0.
同样的,另一种情况是消费者的。此时mutex为0.
两个v操作可以互换位置。
通常不会把使用产品放到PV操作中,虽然影响不大,但是代码量增多,影响同步效率。
先同步后互斥。
实现同步:前v后p。
多生产者多消费着:生产和消费的种类有多个。
同步:抽象为一个时间发生另一个事件之前。
读者写着问题:
只有互斥条件,需要多个条件,哲学家进餐文题。
哲学家进餐:
1.一次性最多只有n-1个人进餐,这样肯定有一根筷子剩下来。
2.奇数位置的抢左边,偶数位置的抢右边,这样两个人一定会有一个人阻塞状态,从而避免死锁。
3.只有两个筷子都拿起来的时候才能进行,否则就会被阻塞,其他的也都会被阻塞。知道当前的他所需要的筷子都被拿起来。