目录
进程同步的基本概念
1)两种形式的制约关系
2)Critical section(临界区)
3)Mutual exclusion(互斥)
4)Dead lock(死锁)
5)Starvation(饥饿)
6)面包问题(锁的概念)
同步机制原则
实现进程互斥的方法
方法一 基于软件的解决方案
算法一 x
算法二 x
算法三 x
算法四——Peterson算法 1981 √
算法五——Backery算法作为补充
方法二 禁用硬件中断
(一)锁方法 TS互斥
(二)交换指令Swap方法
方法三 信号量机制
1)整型信号量
2).记录型信号量
3)AND型信号量集机制
3)一般信号量集机制
在多道系统中,并发执行的诸进程之间,既有独立性,又有制约性。
独立性是指各进程都可独立地向前推进;
制约性是指由于资源共享和进程合作所引起的进程之间的相互依赖和相互制约的关系。进程之间的相互制约关系有两种:互斥和同步,互斥也可看作是一种同步,一种特殊的同步。
(1)间接相互制约关系。
(2) 直接相互制约关系。
临界区是指进程中的一段需要访问共享资源并且当一个进程处于响应代码区域时编不会被执行的代码区域。
当一个进程处于临界区并访问共享资源时,没有其他进程会处于临界区并且访问任何相同的共享资源。
两个或以上的进程,在相互等待完成特定任务,而最终没法将自身任务进行下去。
一个可执行的进程,被调度器持续忽略,以至于虽然处于可执行状态却不被执行。
-Lock (锁)∶在门、抽屉等物体上加上保护性装置,使得外人无法访问物体内的东西,只能等待解锁后才能访问。
-Unlock(解锁):打开保护性装置,使得可以访问之前被锁保护的物体类的东西。
-Deadlock (死锁)∶A拿到锁1,B拿到锁2,A想继续拿到锁2后再继续执行,B想继续拿到锁1后再继续执行。导致A和B谁也无法继续执行。
空闲让进:当无进程处于临界区时,表明临界资源处于空闲状态,应允许一个请求进入临界区的进程立即进入自己的临界区,以有效利用临界资源
忙则等待:当已有进程进入临界区时,表明临界资源正在被占用,因而其他试图进入临界区的进程必须等待,以保证对临界资源的互斥使用
有限等待:对要求访问临界资源的进程,应保证在有限时间内能进入到自己的临界区,以免陷入死等的状态
让权等待:当进程不能进入自己的临界区时,应立即释放处理机,以避免进程陷入忙等状态
解决临界区问题的三个必须标准:互斥访问, 进入(即不死锁), 有限等待(即不饿死)
缺点:满足互斥,但是Starvation。必须轮流使用临界区,不能同一进程使用两次
一个进程失败,另一个将被永久阻塞。
缺点:不能互斥,若起初设置flag[i]和flag[j]都为false,那么可以先执行 1再执行2,这样就同时进入临界区了。
缺点: 满足互斥,但是死锁先执行1再执行2,两者都无法进入临界区
这个佬讲得很好:Peterson‘s Algorithm皮特森算法详解_我知道你是高手的博客-CSDN博客_皮特森算法
flag数组:为了判定是否有其他进程想要进入临界区(避免如果没有其他进程想要进入,当前进程一直空等)
turn变量:为想要进入临界区的进程进行排序(turn==i则Pj在前,turn==j则Pi在前),先提出申请的进程优先进入临界区,其他进程等待,就这样实现了对临界区访问的互斥。
若Pi和Pj都想进入临界区,i先提出申请,j后提出申请,进入while循环判定时turn==i(Pi执行turn=j在前,Pj执行turn=i在后,所以while循环中的turn==i);先提出申请的进程先进入临界区;Pi走到while循环,此时flag[j]==true,turn==i,不满足循环条件,跳出(若是Pj不想进入临界区压根就没有提出申请,那么flag[j]==false,更不满足循环条件),Pi就可以继续进入critical section;Pj走到while循环,但是因为此时flag[i]==ture且turn==i,Pj陷入while循环中无法进入critical section,Pj需要一直等到Pi退出临界区时置flag[i]==false才能跳出循环,进入临界区;
没有中断,没有上下文切换,因此没有并发
>硬件将中断处理延迟到中断被启用之后
>大多数现代计算机体系结构都提供指令来完成
进入临界区 >禁用中断
离开临界区 >开启中断
缺点:一旦中断被禁用,线程无法被停止,整个系统都会停下,可能导致其他线程starvation
临界区若可以任意长,无法限制响应中断所需时间:忙等
抽象数据类型:一个整形(sem),两个原子操作
ps:
e.g.计算机系统的打印机 图from:信号量机制_fFee-ops的博客-CSDN博客_信号量机制
——为克服“忙等”,重新对信号量和P.V操定义
图from: 信号量机制_fFee-ops的博客-CSDN博客_信号量机制
注意:
S.Value >0 表示某类可用资源的数量
<0 其绝对值为因请求该资源而被阻塞的进程数
S.Value的初值为1时,表示只允许一个进程访问临界资源,此时的信号量转化为互斥信号量。
基本思想:
定义如下:
每次只能获得或释放一个单位的临界资源太低效;
当资源数量低于某一下限值时,便不予分配;
基于以上两点对And信号进行扩充。
特殊情况讨论:
(1)Swait(S,d,d)。
此时在信号量集中只有一个信号量,但它允许每次申请d个资源,当现有资源数少于d时,不予分配。
(2)Swait(S,1,1)。
此时的信号量集蜕化为一般的记录型信号量(S>1时)或互斥信号量(S = 1 时)。
(3)Swait(S,1,0)。 相当于一个可控开关
这是一种很特殊且很有用的信号量,不分配资源。
当S>=1时,允许多个进程进入某特定区;
当S=0时,将阻止任何进程进入特定区。