操作系统之进程同步
一、 进程同步的基本概念:
- 主要任务:进程同步机制的主要任务,是对多个相关进程在执行次序上进行协调,使并发执行的诸进程之间能按照一定的规则(或时序)共享系统资源,并能很好地相互合作,从而使程序的执行具有可再现性。
- 两种形式的制约关系:
- 间接相互制约关系
多个程序在并发执行时,由于共享系统资源,如CPU、I/O设备等,致使在这些并发执行的程序之间形成相互制约的关系。对于像打印机、磁带机这样的临界资源,必须保证多个进程对之只能互斥地访问,由此,在这些进程间形成了源于对该类资源共享的所谓间接相互制约关系。为了保证这些进程能有序地运行,对于系统中的这类资源,必须由系统实施统一分配,即用户在要使用之前,应先提岀申请,而不允许用户进程直接使用。 - 直接相互制约关系
某些应用程序,为了完成某任务而建立了两个或多个进程。这些进程将为完成同一项任务而相互合作。进程间的直接制约关系就是源于它们之间的相互合作。例如,有两个相互合作的进程——输入进程A和计算进程B,它们之间共享一个缓冲区。进程A通过缓冲向进程B提供数据。进程B从缓冲中取出数据,并对数据进行处理。但如果该缓冲空时,计算进程因不能获得所需数据而被阻塞。一旦进程A把数据输入缓冲区后便将进程B唤醒; 反之,当缓冲区已满时,进程A因不能再向缓冲区投放数据而被阻塞,当进程B将缓冲区数据取走后便可唤醒A。
- 临界区(critical section): 人们把在每个进程中访问临界资源的那段代码称为临界区(critical section)
- 进入区(entry section): 在临界区前面增加一段用于进行上述检查的代码,把这段代码称为进入区(entry section)
- 退出区(exit section): 在临界区后面也要加上一段称为退出区(exit section)的代码,用于将临界区正被访问的标志恢复为未被访问的标志。
- 剩余区: 进程中除上述进入区、临界区及退出区之外的其它部分的代码在这里都称为剩余区。
二、所有同步机制都应遵循下述四条准则:
- 空闲让进。当无进程处于临界区时,表明临界资源处于空闲状态,应允许一个请求进入临界区的进程立即进入自己的临界区,以有效地利用临界资源。
- 忙则等待。当已有进程进入临界区时,表明临界资源正在被访问,因而其它试图进入临界区的进程必须等待,以保证对临界资源的互斥访问。
- 有限等待。对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区,以免陷入"死等”状态。
- 让权等待。当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入 “忙等”状态。
三、硬件同步机制
- 背景:虽然可以利用软件方法解决诸进程互斥进入临界区的问题,但有一定难度,并且存在很大的局限性,因而现在已很少采用。相应地,目前许多计算机已提供了一些特殊的硬件指令,允许对一个字中的内容进行检测和修正,或者是对两个字的内容进行交换等。可利用这些特殊的指令来解决临界区问题。
- 实现互斥的方法:
- 关中断:
关中断是实现互斥的最简单的方法之一。
在进入锁测试之前关闭中断,直到完成锁测试并上锁之后才能打开中断。这样,进程在临界区执行期间,计算机系统不响应中断,从而不会引发调度,也就不会发生进程或线程切换。由此,保证了对锁的测试和关锁操作的 连续性和完整性,有效地保证了互斥。但是,关中断的方法存在许多缺点:①滥用关中断 权力可能导致严重后果;②关中断时间过长,会影响系统效率,限制了处理器交叉执行程 序的能力;③关中断方法也不适用于多CPU系统,因为在一个处理器上关中断并不能防 止进程在其它处理器上执行相同的临界段代码。 - 利用Test-and-Set指令实现互斥:
这是一种借助一条硬件指令——“测试并建立”指令TS(Test-and-Set)以实现互斥的方法。在许多计算机中都提供了这种指令。
TS指令的一般性描述如下:
见链接:https://blog.csdn.net/Abit_Go/article/details/104012860
操作系统中的Test-and-Set指令实现互斥(java实现) - 利用Swap指令实现进程互斥
该指令称为对换指令,在Intel 80x86中又称为XCHG指令,用于交换两个字的内容。 其处理过程描述如下:
- 关中断: