(招聘备战)操作系统之进程同步详解

大家好,之前的博文讲解了进程互斥(进程与进程间的竞争来争夺对资源的使用),这篇文章给大家讲讲进程同步。
所谓进程同步(synchronization):指系统中多个进程中发生的事件存在某种时序关系,需要相互合作,共同完成一项任务。
具体的说,有多个进程,其中一个进程执行到某一个位置,需要另外一个进程给其提供消息,在没有获得该消息的时候,前一个进程进入阻塞态,一旦获得消息就被唤醒进入就绪态。
举一个典型例子,生产者消费者问题,该图引用自MOOC网 北大陈向群教授操作系统的课件
(招聘备战)操作系统之进程同步详解
该图所描绘的场景是,生产者进程生产某种数据类型放入缓冲区后,消费者进程才可以取走,不允许生产者和消费者同时对缓冲区进行操作。
很显然上图是一个典型的进程同步问题,如何解决这个问题呢?我们接下来引入一种经典的进程同步机制-信号量及P、V操作(既能解决互斥问题,又能解决同步问题)
信号量:一种特殊变量,由一个整数值(进程间传递信息的一个整数值)和一个队列组成(进程排序所用)
数据结构为
struc semaphore{
int count;
queueType queue;
}
信号量声明 semaphore s;
对信号量只能实施三种操作:初始化、P和V
(招聘备战)操作系统之进程同步详解
其中P操作是实现使进程进入阻塞态,并且将进程放入s.queue末尾,重新调度
Q操作是唤醒s.queue等待队列中的一个等待进程,改变其为就绪态并且将其插入就绪队列。

注意:P、V都是原语操作,在操作过程中不允许被中断
信号量上的操作主要是初始化(非负数)、P操作、V操作

下面介绍一下同步中具体的PV操作实例(进程的互斥为一种特殊的同步),既能解决进程的同步问题,又能解决进程的互斥问题。
(招聘备战)操作系统之进程同步详解
假设有三个进程P1、P2、P3,对同一个临界资源进程操作,设置信号量mutex=1,如果P1先进入CPU,进行P操作,mutex=0,P1进程进入临界区,如果此时P1进入临界区后被中断了,此时P2如果要进入临界区,那么P2执行P操作,mutex=-1,而由我们上面的定义可知,P2进程就等在s.queue队列里面了,同理如果P3也想进入临界区,此时mutex=-2,P3进程也进入队列中,等在P2后面,然后如果此时P1再次进入CPU,那么其进入临界区完成后执行V操作,mutex加1变为mutex=-1,此时V操作把P2从等待队列里送入就绪队列。P3同理。