信号量及PV原语

操作系统中进程互斥和同步的实现的一个最基本的方方是使用信号量和PV原语。

信号量S的物理意义:当S≥0的时候表示,某个资源可以使用的数量,当S<0的时候,其绝对值表示等待某个资源的进程数。

一般实现进程间的互斥操作的时候S的初始值为1或资源的数目,实现进程间同步的时候S的初始值为0或某个正整数

P操作表示进程申请一个资源,其定义如下:

S=S-1,如果S≥0,那么执行P操作的进程继续执行,否则执行P操作的进程转换成阻塞状态。

V操作表示进程释放一个资源,其定义如下:

S=S+1,如果S≤0,那么从阻塞状态中唤醒一个进程,插入到就绪队列中,执行V操作的进程继续执行,否则执行V操作的进程继续执行,其他进程无影响。

关于PV操作的理解,首先P进程是申请一个资源,那么只需要管自己是否有执行的机会对其他进程没啥影响,如果资源满足执行P操作进程执行的话就执行,否则就阻塞,而V操作是释放一个资源,那么释放完资源,不管现在资源怎样对执行V进程的进程都没有影响,所以执行完V操作之后,该进程总是继续执行,同时V操作可能会对其他进程有所影响,如果执行V操作之后所释放的资源刚好有其他进程在等待,那么就可以从那些等待的进程中唤醒一个插入到就绪队列中了。如果执行P操作后S≥0,那么显然执行P操作(请求资源)之前S>0(有资源可用),所以P进程就可以执行啦,否则就是执行P之前S≤0(没资源可用),所以P进程就被阻塞了。V操作也是一样,如果执行V操作之后S≤0,那么说明执行V之前是S<0(有进程等着用该资源)的,而V操作正好要释放一个这样的资源,所以需要在等待的进程中唤醒一个插入到就绪队列中。这里经常搞混的地方是S=0的时候,按照上述分析如果P操作后S=0,那么P之前S=1,所以有资源可用,。。。如果V操作之后S=0,那么V之前,S=-1,有一个进程在等待,。。。

互斥操作:A、B两个进程对S资源互斥就是他们不能同时使用S资源

S初值为设为1

A:                                          B:

P(S)                                      P(S)

使用S资源                              使用S资源

V(S)                                      V(S)

同步操作:进程B需要从进程A获得消息后才执行,而这消息,要在A产生消息之后才提供

S初始值设为0

A:                                         B:

产生消息                                P(S)

V(S)                                     获得消息

时间: 2024-07-30 20:13:59

信号量及PV原语的相关文章

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

本文介绍操作系统进程管理的两个核心概念: 信号量 PV操作 一.信号量介绍 1.1 信号量引入 信号量(Semaphore)1965年由Dijkstra引入的.信号量一般由一个值是一个变量,其值有可能是0,或者一个正数,或者是负数: 0表示没有资源可以使用 大于0,标识可用资源的数量 小于0,其绝对值表示等待这个资源的进程的个数 针对信号量,Dijkstra提出了两个操作: P操作 V操作 信号量的值只有通过PV操作来完成. 1.2 PV原语操作(atomic action) PV操作里面会有一

信号量与PV操作

在操作系统中进程之间经常会存在互斥和同步两种关系.为了有效处理这种情况,W.Dijskra在1965年提出信号量和PV操作的概念(1)信号量:一种特殊的变量,表现形式是一个整型S和一个队列(2)P操作:也成为"down()和wait()操作",使S=S-1,若S<0,进程暂停执行并放入信号量的等待队列.(3)V操作,也称为"up()和signal()操作",使S=S+1,若S<=0,唤醒等待队列中的一个进程. PV操作属于进程的低级通信. 利用信号量和P

用信号量及其PV操作处理实际问题

1.书上课后练习P187-43 semaphore mutex , sweat , water ,orange ; semaphore empty; process Supply(){ while(1){ P(empty) ; 产生一个0-2的随机数 ; if(s==0) V(sweat) ; else if( s==1) V(water); else V(orange) ; } } process P1(){ while(1){ P(orange) ; P(mutex) ; V(mutex)

Operating System-进程/线程内部通信-信号量、PV操作的实现和应用(解决哲学家进餐和生产者消费者问题)

本文主要内容: 信号量的实现 利用信号量解决哲学家用餐问题 利用信号量解决生产者消费者问题 一.信号量的实现 1.1 信号量结构 typedef struct { int value; struct process * list } semaphore; value代表当前信号量可以使用的数量,list代表当前信号量上所等待的进程. 1.2 P操作实现 P(semaphore * s) { s.value--; if(s.value < 0) { add current process to s

整型信号量和PV操作(计算机操作系统)

在整型信号量机制中,信号量被定义为一个整形变量.除初始化外,仅能通过两个标准的原子操作Wait(S)和Signal(S)来访问.其通常分别被称为P.V操作. 描述如下: P操作:S=S-1:如果S小于0,则进程进入等待状态,否则继续执行. V操作:S=S+1:如果S>=0,则唤醒等待队列中的一个等待进程. 信号量有其自身的物理含义:当S>0时,其值表示要管理的某类资源的数量:当S<0时,它的绝对值表示在相关队列中等待的进程个数. 进程的同步 一般来说,一个进程相对与另一个进程的运行速度是

信号量基础和两个经典例子

信号量基础和两个经典例子 信号量(semaphore) 用于进程中传递信号的一个整数值. 三个操作: 1.一个信号量可以初始化为非负值 2.semWait操作可以使信号量减1,若信号量的值为负,则执行semWait的进程被阻塞.否则进程继续执行. 3.semSignal操作使信号量加1.若信号量的值小于等于0,则被semWait操作阻塞的进程讲被接触阻塞. ps: semWait对应P原语,semSignal对应V原语. 信号量以及PV原语的C语言定义如下 struct semaphore {

为什么Dijkstra算法不适用边长为负数的情况

原文地址:http://lixing123.com/?p=280 Dijkstra算法(这个荷兰词真难读...不过Dijkstra是一位非常NB的计算机科学家,goto有害论.信号量和PV原语.哲学家聚餐问题.银行家算法等等,都是这位大牛搞出来的),是有向/无向加权图(就是每条边都有长度)中,计算两个点之间最短距离的有效方法,在使用堆排序的情况下,它的时间复杂度为O(Nlog(N+M)),(这里N代表节点数,M代表边数)很接近线性了,还是非常好的. 不过,Dijkstra算法有一个限制,就是它只

.NET中异常处理的最佳实践(转)

原文地址:http://www.cnblogs.com/xiaozhi_5638/p/4259115.html 目录 介绍 做最坏的打算 提前检查 不要信任外部数据 可信任的设备:摄像头.鼠标以及键盘 “写操作”同样可能失效 安全编程 不要抛出“new Exception()” 不要将重要的异常信息存储在Message属性中 每个线程要包含一个try/catch块 捕获异常后要记录下来 不要只记录Exception.Message的值,还需要记录Exception.ToString() 要捕获具

dijkstra算法求最短路

艾兹格·W·迪科斯彻 (Edsger Wybe Dijkstra,1930年5月11日~2002年8月6日)荷兰人. 计算机科学家,毕业就职于荷兰Leiden大学,早年钻研物理及数学,而后转为计算学.曾在1972年获得过素有计算机科学界的诺贝尔奖之称的图灵奖,之 后,他还获得过1974年 AFIPS Harry Goode Memorial Award.1989年ACM SIGCSE计算机科学教育教学杰出贡献奖.以及2002年ACM PODC最具影响力论文奖. 艾兹格·W·迪科斯彻(Edsger