Operating System-进程/线程内部通信-信号量和PV操作

本文介绍操作系统进程管理的两个核心概念:

  • 信号量
  • PV操作

一、信号量介绍

1.1 信号量引入

信号量(Semaphore)1965年由Dijkstra引入的。信号量一般由一个值是一个变量,其值有可能是0,或者一个正数,或者是负数:

  • 0表示没有资源可以使用
  • 大于0,标识可用资源的数量
  • 小于0,其绝对值表示等待这个资源的进程的个数

针对信号量,Dijkstra提出了两个操作:

  • P操作
  • V操作

信号量的值只有通过PV操作来完成。

1.2 PV原语操作(atomic action)

PV操作里面会有一些列步骤,这些步骤是一个原语操作(atomic action),类似于数据库的事务,要么同时成功,要么同时失败。

二、P操作

P操作流程

Operating System-进程/线程内部通信-信号量和PV操作_第1张图片

P操作核心:如果有资源(信号量大于0),则继续执行,否则阻塞自己(处于睡眠等待信号量的状态)

三、V操作

V操作流程

Operating System-进程/线程内部通信-信号量和PV操作_第2张图片

四、关键点

 

  • P/V操作必须成对出现,这样就不会出现死循环
  • 信号量大于0的确表示有临界资源可供使用,而且这个时候没有进程被阻塞在这个资源上,也就是说没有进程因为得不到这类资源而阻塞,所以没有被阻塞的进程,自然不需要唤醒。

  • 原语操作的本质在于:一个进程使用完临界资源后,释放临界资源,使信号量加1,以通知其它的进程,这个时候如果信号量<=0,表明有进程阻塞在该类资源上,因此要从阻塞队列里唤醒一个进程来“转手”该类资源。比如,有2个某类资源,三个进程A、B、C、D要用该类资源,最开始信号量=2,当A进入,信号量=1,当B进入信号量=0,表明该类资源刚好用完,当C进入时信号量=-1,表明有一个进程被阻塞了(C会被阻塞),D进入,信号量=-2(D继续阻塞)。当A用完该类资源时,进行V操作,信号量=-1,释放该类资源,而这时信号量<0,表明有进程阻塞在该类资源上,于是唤醒一个。

  •  当一个进程阻塞了的时候,它已经执行过了P操作,并卡在临界区那个地方。当唤醒它时就立即进入它自己的临界区,并不需要执行P操作了,当执行完了临界区的程序后,就执行V操作。

  • 当信号量信号量小于0时,其绝对值表示系统中因请求该类资源而被阻塞的进程数目。S大于0时表示可用的临界资源数。注意在不同情况下所表达的含义不一样。当等于0时,表示刚好用完。

你可能感兴趣的:(Operating System-进程/线程内部通信-信号量和PV操作)