2.3 进程同步与互斥
2.3.1 进程同步与互斥
1. 进程同步
进程同步是进程之间直接的制约关系,是为完成某种任务而建立的两个或多个线程,这个线程需要在某些位置上协调他们的工作次序而等待、传递信息所产生的制约关系。进程间的直接制约关系来源于他们之间的合作。
具体说,一个进程运行到某一点时要求另一个进程为它提供消息,在未获得消息之前,该进程处于等待状态,获得消息后被唤醒进入就绪态。
2. 进程互斥
进程互斥是进程之间的间接制约关系。当一个进程进入临界区使用临界资源时,另一个进程必须等待。只有当使用临界资源的进程退出临界区后,另一个进程才能去访问临界资源。
比如进程B需要访问打印机,但此时进程A占有了打印机,进程B会被阻塞,直到进程A释放了打印机资源,进程B才可以继续执行。
为了实现临界资源的互斥访问,同时保证系统整体性能,需要遵循以下原则:
- 空闲让进。临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区;
- 忙则等待。当已有进程进入临界区时,其他试图进入临界区的进程必须等待;
- 有限等待。对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿)
- 让权等待。当进程不能进入临界区时,应立即释放处理机,防止进程忙等待。
临界资源
一个时间段内只允许一个进程使用的资源称为临界资源(互斥资源或共享变量)。许多物理设备(摄像头、打印机)、许多变量、数据、内存缓冲区都属于临界资源。
在每个进程中,访问临界资源的程序段叫临界区。
对临界资源的互斥访问,在逻辑上分为四个部分:
2.3.2 实现临界区进程互斥的软件实现方法
1.单标志法
算法思想:两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予。
思考一下这个方法存在的问题:
如果此时允许进入临界区的进程是P0,而P0一直不访问临界区,那么虽然此时临界区空闲,但是不允许P1访问。
因此,单标志法存在的主要问题是:违背“空闲让进”原则
2.双标志先检查
算法思想:设置一个布尔型数组 flag[],数组中各个元素用来标记各进程想进入临界区的意愿,比如:“flag[0]= ture” 意味着0号进程 P0 现在想要进入临界区。每个进程在进入临界区之前先检查当前有没有别的进程想进入临界区,如果没有,则把自身对应的标志 flag[i] 设为 true,之后开始访问临界区。
3.双标志后检查
4.Peterson算法
总结:
2.3.3 实现临界区进程互斥的硬件实现方法
1.中断隐藏方法
2.TestAndSet指令
3.Swap指令
2.3.4 互斥锁
特性:
2.3.5 信号量机制
2.3.5.1 什么是信号量
- 用户进程可以通过使用操作系统提供的
一对原语来对信号量进行操作,从而很方便的实现了进程互斥、进程同步。 信号量其实就是一个变量(可以是一个整数,也可以是更复杂的记录型变量), 可以用一个信号量来表示系统中某种资源的数量,比如:系统中只有一台打印机,就可以设置一个初值为1的信号量。
原语是一种特殊的程序段,其
执行只能一气呵成,不可被中断。原语是由关中断/开中断指令实现的。
一对原语:wait(S)原语和signal(S)原语,可以把原语理解为我们自己写的函数,函数名分别为 wait和 signal,括号里的信号量s其实就是函数调用时传入的一个参数。- wait、signal原语常
简称为P、V操作(来自荷兰语proberen和 verhogen)。因此,做题的时候常把wait(S)、 signal(S)两个操作分别写为P(S)、V(S)。
2.3.5.2 整型信号量
用一个整数型的变量作为信号量,用来表示系统中某种资源的数量。(与普通整数变量的区别:对信号量的操作只有三种:初始化、P操作、V操作)
2.3.5.3 记录型信号量
整型信号量的缺陷是存在“忙等”问题,因此人们又提出了“记录型信号量”,即用记录型数据结构表示的信号量。
我们来看看这个例子:假如有4个进程同时来申请使用打印机
把打印机资源分配给了两个进程,刚好分配完
当资源分配完时,后面申请资源的进程会被阻塞,被挂到等待队列里,直到别的进程释放资源,此时队列里的进程会从阻塞状态变为就绪状态,把释放的资源分配给这个进程。
执行完毕
总结:
wait(S)、signal(S) 也可以记为 P(S)、V(S),这对原语可用于
实现系统资源的“申请”和“释放。
s.value 的初值表示系统中某种资源的数目。对信号量 S 的
一次 P 操作意味着进程请求一个单位的该类资源,因此需要执行 s.value--,表示资源数减1,当s.value<0 时表示该类资源已分配完毕,因此进程应调用 block 原语进行自我阻塞(当前运行的进程从运行态>阻塞态),主动放弃处理机,并插入该类资源的等待队列 S.L 中。可见,该机制遵循了“让权等待”原则,不会出现“忙等”现象。
2.3.6 信号量机制实现进程的互斥、同步与前驱关系
1.信号量机制实现进程互斥
- 分析并发进程的关键活动,划定临界区(如:对临界资源打印机的访问就应放在临界区)
- 设置
互斥信号量mutex(表示进入临界区的名额),初值为1 - 在进入区 P(mutex)--
申请资源 - 在退出区V(mutex)--
释放资源
/* 记录型信号量的定义 */
typedef struct{
int value; //剩余资源数
struct process *L; //等待队列
}semaphore
信号量的定义可以简写成
semaphore mutex=1//初始化信号量
注意!!!