写在前面:
这一篇博客主要学习进程同步的知识。进程同步的主要任务是对多个相关进程在执行次序上进行协调,以使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。
两种形式的制约关系:
在多道程序环境下,当程序并发执行时,由于资源共享和进程合作,使同处于一个系统中的诸进程之间可能存在着以下两种形式的制约关系:
- 间接相互制约关系。同处于一个系统中的进程,通常都共享着某种系统资源,如共享 CPU、共享 I/O 设备等。这种资源共享导致了间接相互制约。例如,有两个进程 A和 B,如果在 A 进程提出打印请求时,系统已将惟一的一台打印机分配给了进程 B,则此时进程 A 只能阻塞;一旦进程 B 将打印机释放,则 A 进程才能由阻塞改为就绪状态。
- 直接相互制约关系。这种制约主要源于进程间的合作。例如,有一输入进程 A 通过单缓冲向进程 B 提供数据。当该缓冲空时,计算进程因不能获得所需数据而阻塞,而当进程 A 把数据输入缓冲区后,便将进程 B 唤醒;反之,当缓冲区已满时,进程 A 因不能再向缓冲区投放数据而阻塞,当进程 B 将缓冲区数据取走后便可唤醒 A。
进程的两大关系:
- 互斥:互斥是并发执行的多个进程由于竞争同一资源而产生的相互排斥的关系。
- 同步:同步是进程间共同完成一项任务时直接发生相互作用关系。同步进程间具有合作关系,在执行时间上必须按一定的顺序协调进行。
临界资源:
一次仅允许一个进程使用的共享资源。如打印机、磁带机、表格等。
临界区:
不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。人们把在每个进程中访问临界资源的那段代码称为临界区(critical section)。
为了保证诸进程互斥地进入自己的临界区,便可实现诸进程对临界资源的互斥访问。为此每个进程在进入临界区之前,应先对欲访问的临界资源进行检查,看它是否正被访问。如果此刻该临界资源未被访问,进程便可进入临界区对该资源进行访问,并设置它正被访问的标志;如果此刻该临界资源正被某进程访问,则本进程不能进入临界区。如果此刻该临界资源正被某进程访问,则本进程不能进入临界区。相应地,在临界区后面也要加上一段称为退出区(exit section)的代码,用于将临界区正被访问的标志恢复为未被访问的标志。进程中除上述进入区、临界区及退出区之外的其它部分的代码,在这里都称为剩余区。
这样,可把一个访问临界资源的循环进程描述如下:
同步机制应遵循的规则:
为实现进程互斥地进入自已的临界区。通常会在系统中设置专门的同步机构来协调各进程间的运行。所有同步机制都应遵循下述四条准则:
- 空闲让进。当无进程处于临界区时,表明临界资源处于空闲状态,应允许一个请求进入临界区的进程立即进入自己的临界区,以有效地利用临界资源。
- 忙则等待。当已有进程进入临界区时,表明临界资源正在被访问,因而其它试图进入临界区的进程必须等待,以保证对临界资源的互斥访问。
- 有限等待。对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区,以免陷入“死等”状态。
- 让权等待。当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等”状态。