文章目录
2.10 进程同步和进程互斥
进程同步
eg:
并发性带来了异步性,有时需要通过进程同步解决这种异步问题。让各并发进程按要求有序地推进。同步亦称直接制约关系。
进程互斥
对临界资源的访问,需要互斥的进行。即同一时间段内只能允许一个进程访问该资源。互斥亦称间接制约关系。
四个部分
对临界资源的互斥访问,可以在逻辑上分为如下四部分:
- 注意:
-
临界区是进程中访问临界资源的代码段
-
进入区和退出区是负责实现互斥的代码段。
-
临界区也可称为“临界段”
-
进程互斥遵循的原则
为了实现对临界资源的互斥访问,同时保证系统整体性能,需要遵循以下原则:
- **空闲让进。**临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区;
- 忙则等待。当已有进程进入临界区时,其他试图进入临界区的进程必须等待;
- **有限等待。**对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿);
- **让权等待。**当进程不能进入临界区时,应立即释放处理机,防止进程忙等待
2.11 进程互斥的软件实现方法
单标志法
算法思想:两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予
主要问题:违背“空闲让进”原则
双标志先检查法
算法思想:设置一个布尔型数组 flag[],数组中各个元素用来标记各进程想进入临界区的意愿,比如 “flag[0] = ture”意味着 0 号进程 P0 现在想要进入临界区。每个进程在进入临界区之前先检查当前有 没有别的进程想进入临界区,如果没有,则把自身对应的标志 flag[i] 设为 true,之后开始访问临界区
主要问题:违反“忙则等待”原则,原因在于进入区的“检查”和“上锁”两个处理不是一气呵成的。
双标志后检查法
算法思想:较上一个先“上锁”后“检查” 的方法
主要问题:违背了“空闲让进”和“有限等待”的原则,会因各进程都长期无法访问临界资源而产生“饥饿”现象。解决了“忙则等待”的问题。
Peterson算法
算法思想:结合双标志法、单标志法的思想
eg:123678、1623、13678、16278(依照此顺序进行演示)
主要问题:解决了进程互斥问题,遵循了空闲让进、忙则等待、有限等待三个原则,但是依然未遵循让权等待的原则。
2.12 进程互斥的硬件实现方法
中断屏蔽方法
利用“开/关中断指令”实现(与原语的实现思想相同,即在某进程开始访问临界区到结束访问为 止都不允许被中断,也就不能发生进程切换,因此也不可能发生两个同时访问临界区的情况)
优点:简单、高效
缺点:不适用于多处理机;只适用于操作系统内核进程,不适用于用户进程(因为开/关中断指令 只能运行在内核态,这组指令如果能让用户随意使用会很危险)
TestAndSet指令
简称 TS 指令,也有地方称为 TestAndSetLock 指令,或 TSL 指令
TSL 指令是用硬件实现的,执行的过程不允许被中断,只能一气呵成。以下是用C语言描述的逻辑
优点:实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;适用于多处理机环境
缺点:不满足“让权等待”原则,暂时无法进入临界区的进程会占用CPU并循环执行TSL指令,从 而导致“忙等”。
(连续测试一个变量直到某个值出现为止,称为忙等。)
Swap指令
有的地方也叫 Exchange 指令,或简称 XCHG 指令。
Swap 指令是用硬件实现的,执行的过程不允许被中断,只能一气呵成。以下是用C语言描述的逻辑
优缺点:和TSL一样