大家可以看下我使用幕布软件画的思维导图,如果大家想使用幕布可以通过我的邀请链接注册,可免费获得一个月高级会员https://mubu.com/inv/477598
文章目录
3.1 进程同步
3.1.1 同步概念
3.1.1.1 进程同步的概念
进程同步机制的主要任务就是对多个相关进程在执行次序上进行协调,使并发执行的进程之间能按照一定的规则共享系统资源,并能很好的配合工作,从而使程序的执行具有可再现性。
3.1.1.2 制约关系
对于处于同一个系统中的多个进程,由于他们共享着系统的资源,或者为了完成同一个任务而相互合作,所以他们之间可能存在下面两种制约关系:
- 间接相互制约关系
系统中的进程难免会调用像打印机、CPU等这样的临界资源。如果想这些资源正常调用,必须保证多个进程之间互斥地访问这些资源,进而就在这些进程间形成了间接相互制约关系。
为了保证这些进程能有序的进行,对于系统中的这类资源,必须由系统实施统一分配,即用户在使用之前必须先提出申请,绝不允许用户直接使用。 - 直接相互制约关系
在系统中也会存在一些进程,他们为了完成同一个目标而相互配合合作工作,这种就是直接互相制约关系。
进程间的直接制约关系就是源于他们之间的相互合作。
3.1.1.3 临界资源
虽然多个进程可以共享系统中的各种资源,但其中许多资源一次只能为一个进程所使用,我们把一次仅允许一个进程使用的资源称为临界资源。许多物理设备都属于临界资源,如打印机等。此外,如果变量、数据等都可以被若干进程共享,也属于临界资源。
3.1.1.4 临界区
人们把在每个进程中访问临界资源的那段代码称为临界区。若能保证诸进程互斥地进入自己的临界区,便可实现诸进程对临界资源的互斥访问。
为此,每个进程在进入临界区之前,应先对要访问的临界区进程检查:如果临界区正在被访问,则进程不能进入临界区;如果临界区没有被访问,那进程就可进入临界区,并将临界区正在被访问的标志置为正被访问。
所以,我们可以将访问临界资源的线程的循环代码分为如下部分:
- 访问临界区之前用于上述判断的代码区称为进入区
- 在访问完临界区之后用于将临界区正被访问的标志恢复为未被访问的标志的代码区称为退出区
- 除了进入去、临界区、退出区代码之外的其它代码称为剩余区
while (true) {
进入区
临界区
退出区
剩余区
}
3.1.1.5 同步机制应遵循的规则
- 空闲让进:当无进程处于临界区时,表明临界资源处于空闲状态,应允许一个请求进入临界区的进程立即进入自己的临界区,以有效的利用临界资源
- 忙则等待:当已有进程进入临界区,表明临界资源正在被访问,因而其它视图进入临界区的进程必须等待,以保证对临界资源的互斥访问
- 有限等待:对要求访问临界资源的进程,应保证在有限的时间内能进入自己的临界区,以免陷入“死等”状态
- 让权等待:当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等”状态
3.1.2 同步机制
3.2.2.1 信号量机制
1. 什么是信号量
信号量的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程,值则与相应的资源的使用情况有关:
- 当他的值大于0时,表示当前可用资源的数量
- 当他的值小于0时,其绝对值表示等待使用该资源的进程个数
2. 什么是信号量机制
信号量机制即利用pv操作对信号量进行处理。而且信号量只能由pv操作进程处理。
当S>0时,S表示可用资源的数量。执行一次P操作意味着分配一个单位资源,因此S值减1;当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,他才能运行下去。而执行一个V操作以为着释放一个单位资源,因此S的值加1;当S>0,表示有某些资源正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。
3.2.2.2 PV操作
1. P操作
申请一个单位资源,进程进入临界区
wait (S) {
while (s <= 0) ;// 如果没有资源则循环等待
S--;
}
- 将信号量S的值减1,即S=S-1;
- 如果S<=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
2. V操作
释放一个单位资源,进程从临界区出来
signal (S) {
S++;
}
- 将信号量S的值加1,即S=S+1;
- 如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。
3. PV操作的意义
用PV操作来实现进程的同步和互斥
3.2.3 管程机制
尽管信号量机制很方又高效,但是每个要访问临界资源的进程都必须必备同步操作,