前提:通过单处理机系统中的进程同步机制,保证程序执行的可再现性。
基本概念
进程同步机制的主要任务:对多个相关进程在执行次序上进行协调,使并发执行的进程之间能按照一定规则共享系统资源,并能相互合作,使程序的执行具有可再现性。
制约关系
进程共享系统中的资源,或为完成某一任务而相互合作,它们之间可能存在以下两种形式的制约关系。
由于制约关系的存在,进程以什么样的速度运行,并不是由进程自身控制,这也是进程的异步性。
- 间接相互制约关系:多个程序在并发执行时,需要使用如打印机的临界资源,必须保证多个进程间只能互斥的访问,因此多个进程间就形成了对该类资源共享的间接相互制约关系。对于系统中这类资源,必须由系统统一分配,即用户在使用之前要提出申请,不能直接使用。
- 直接相互制约关系:某些进程为了完成同一项任务相互合作,这些进程间就有直接制约关系,是一种相互协作的关系。
临界资源
- 进程间应该采用互斥方式共享的资源。比如打印机。
- 不论是硬件临界资源还是软件临界资源,多个进程必须互斥地对它进行访问。
临界区
- 进程中访问临界资源的那段代码,称为临界区。
- 若能保证进程互斥地进入自己的临界区,便可实现进程对临界资源的互斥访问。因此,在临界区前面加一段检查临界资源状态(是否被访问)的检查代码,这段代码称为进入区;相应的临界区后面也有恢复临界资源状态,称为退出区。
while(TRUE) { ... 进入区 临界区 退出区 ... }
同步机制应遵循的规则
- 空闲让进:若无进程在临界区,表明临界资源处于空闲状态,应该允许一个进程的请求进入临界区。
- 忙则等待:当有进程在临界区,表明临界资源正在被访问,因此其他试图进入临界区的进程必须等待,以保证对临界资源的互斥访问。
- 有限等待:对要求访问临界资源的进程,应该保证在有限时间内能进入自己的临界区,以免陷入“死等”的状态。
- 让权等待:当进程不能进入自己的临界区,应立即释放处理机,以免进程陷入“忙等”的状态。
硬件同步机制
实际上,对临界区的管理,可以将标志看成一个锁。锁开进入,锁关等待,初始时锁是打开的。每个进入临界区的进程必须要对锁先进行测试,当锁未开则必须等待至锁开;反之,锁开应立即关锁。为了防止多个进程同时测试到锁开的情况,测试和关锁的操作应该是连续的,不允许分开。(以下的ts指令和swap指令,都是为了保证在测试锁状态的同时,也关锁)
关中断
工作原理:在进入锁测试前关闭中断,直到完成锁测试并上锁之后才能打开中断,这样进程在临界区执行期间,计算机不响应中断,也不会引发进程调度,就不会发生进程或线程切换。
缺点:关中断时间如果过长,会影响系统效率;只能用于单处理机系统,因为只能防止当前进程所在的CPU不会发生调度,如果是多CPU系统其他CPU不可控;关闭中断可能导致严重后果。
利用Test-and-Set指令实现互斥
TS指令的一般性描述如下:该执行过程不可分割,是一条原语。
boolean TS (boolean *lock) {
// 将锁测试和关锁操作在ts中执行完
boolean old; // 存储原先锁状态
old=*lock;
*lock=TRUE