互斥
使用PV原语实现的同步机制对于共享变量及信号变量的操作被分期在各个进程中,造成如下缺点:
1程序可读性差
2不利于维护
3正确性很难保证
为了更易于编写正确的程序,Brinch Hansen和Hoare提出了一种高级同步原语,即管程。一次只能有一个进程可以在管程内活动是它的一个重要特性。
引入管程是为了让系统自动处理临机资源的互斥使用问题。
生产者和消费者问题是一个既有同步又有互斥的问题。
1、一组生产者进程和一组消费者进程共享一个初始为空、大小为n的缓冲区,只有缓冲区没满时,生产者才能把消息放入到缓冲区,否则必须等待;只有缓冲区不空时,消费者才能从中取出消息,否则必须等待。
2、由于缓冲区是临界资源,它只允许一个生产者放入消息,或者一个消费者从中取出消息。
3、关系分析:生产者和消费者对缓冲区互斥访问是互斥关系,同时生产者和消费者又是一个相互协作的关系,只有生产者生产之后,消费者才能消费,他们也是同步关系。
死锁
死锁是指多个进程因竞争资源而造成的一种僵持状态。若无外力作用,这些进程都将永远处于阻塞状态,不能再运行下去。
产生死锁的原因有:资源不足、进程推进次序不当。
产生死锁的4个必要条件
1.不可剥夺
进程所获得的资源在未使用完毕之前,资源申请者不能强行地从资源占有者手中夺取资源,而只能由该资源的占有者进程自行释放
2.互斥
即某个资源在一段时间内只能由一个进程占有,不能同时被两个或以上的进程占有
3.请求和保持
进程至少已经占有一个资源,但又申请新的资源;由于该资源已被另外进程占有,此时该进程阻塞;但是,它在等待新资源之时,仍继续占用已占有的资源
4.环路等待
存在一个进程等待序列{P1,P2,…,Pn},其中P1等待P2所占有的某一资源,P2等待P3所占有的某一源,……,而Pn等待P1所占有的的某一资源,形成一个进程循环等待环
破坏一个即可破坏死锁
避免死锁:银行家算法
预防死锁:静态分配资源
检测死锁:资源分配图简化法
解除死锁:消进程法(剥夺资源法)
静态分配资源
所有进程在开始运行之前,一次性地申请其在整个运行过程所需的全部资源。但在分配资源时,只要有一种资源不能满足某进程的要求,即使它所需的其他资源都空闲,也不分配给该进程,而让进程等待。
在进程的等待期间,它并未占有任何资源,摒弃了“保持”条件,避免发生死锁。
银行家算法
系统处于安全状态时,一定不会发生死锁;
系统处于不安全状态时,不一定会发生死锁;
在银行家算法中,对某时刻的资源分配情况进行安全分析,如果该时刻状态是安全的,则存在一个安全序列,且这个安全序列不是是唯一的。
银行家算法中的数据结构包括
1、可利用资源向量Available
2、最大需求矩阵Max(系统中n个进程中的每一个进程对m类资源的最大需求)
3、分配矩阵Allocation(系统中每一类资源当前已分配给每一进程的资源数)
4、需求矩阵Need(用以表示每一个进程尚需的各类资源数)
Need[i,j]= Max[i,j]- Allocation[i,j]
即最大需求资源数=已分配的资源+还需申请的资源.
系统中的资源可以分为两类
一类是可剥夺资源 ,是指某进程在获得这类资源后,该资源可以再被其他进程或系统剥夺 , CPU 和 主存
均属于可剥夺性资源。另一类资源是不可剥夺资源,当系统把这类资源分配给某进程后,再不能强行收回,只能在进程用完后自行释放,如 磁带机(IO设备) 、打印机等。