信号量 与 PV操作含义

什么是信号量
信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操作来改变。
一般来说,信号量S>=0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S的值加1;若S<0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。

PV操作
PV操作是典型的同步机制之一, PV操作与信号量的处理相关,P表示通过的意思,V表示释放的意思。PV操作即可实现同步,也可以实现互斥。

P操作意味着请求分配一个资源 : 也称为down()/wait()操作,使S=S-1,若S<0,进程暂停执行,放入信号量的等待队列.

V操作意味着释放一个资源 : 也称为up()/signal()操作,使S=S+1,若S<=0,唤醒等待队列中的一个进程.

关于抢占和非抢占

抢占式: v释放资源 资源数<=0 唤醒对队列中的进程,转到唤醒的进程
非抢占式: v释放资源 资源数<=0 唤醒对队列中的进程,继续执行当前进程
 

 

什么是互斥
互斥是进程(线程)之间的间接制约关系。当一个进程(线程)进入临界区使用临界资源时,另一个进程(线程)必须等待。只有当使用临界资源的进程退出临界区后,这个进程才会解除阻塞状态。简单的来说,就是某一资源同一时间只能由一个进程(线程)访问。

类似的场景:

比如进程B需要访问打印机,但此时进程A占有了打印机,进程B会被阻塞,直到进程A释放了打印机资源,进程B才可以继续执行
比如某一个共享代码片段,同一个时间,只能由一个线程执行,当有一个线程执行时,其它线程将会等待

 


什么是同步
同步是进程(线程)之间直接的制约关系,是为完成某种任务而建立的两个或多个线程,这个线程需要在某些位置上协调他们的工作次序而等待、传递信息所产生的制约关系,进程(线程)间的直接制约关系来源于他们之间的合作关系(依赖关系)。所以同步是一种更为复杂的互斥。简单的来说,就是进程(线程)的运行必须严格按照某种先后次序来运行,从而完成的特定的任务。


类似的场景:

比如线程A、B同时允许某计算任务,线程A的计算任务在某一时刻的依赖于线程B任务产生的数据,这时候如果线程B 还未产生相应的数据,线程A只好等待线程B,只有线程B计算出相应的结果后线程A在接着往下运行。
比如进程A需要从缓冲区读取进程B产生的信息,当缓冲区为空时,进程A因为读取不到信息而被阻塞。而当进程B产生信息放入缓冲区时,进程A才会被唤醒。
使用PV操作实现同步操作
用一个信号量S与一个消息(或者资源)联系起来,当信号量的值为0时,表示期望的消息尚未产生(或者资源不可用);当信号量的值S>0时,表示期望的消息已经存在(有资源可用)。用P V操作实现进程同步时,调用P操作测试消息是否到达(是否有资源可用),调用V操作发送消息(添加资源)。

 

使用PV操作实现进程(线程)同步时应该注意的是:

分析进程(线程)间的制约关系,确定信号量种类。在保持进程(线程)间有正确的同步关系情况下,哪个进程先执行,哪些进程后执行,彼此间通过什么资源(信号量)进行协调,从而明确要设置哪些信号量。
信号量的初值与相应资源的数量有关,也与P、V操作在程序代码中出现的位置有关。
同一信号量的P、V操作一般必须要成对出现,但它们分别在不同的进程(线程)代码中。
使用PV操作实现互斥操作
使用PV操作实现进程互斥时应该注意的是:

同一信号量的P、V操作必须要成对出现,且出现在同一的进程(线程)代码中。
每个互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性, 否则会造成死锁。
P、V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。
互斥信号量的初值一般为1

非抢占式: v释放资源 资源数<=0 唤醒对队列中的进程,继续执行当前进程

posted @ 2020-04-21 13:26  devhg  阅读(3476)  评论(0编辑  收藏  举报