欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

有关信号量和PV操作的易(粗)懂(浅)理解

程序员文章站 2022-07-05 07:57:58
...

大概只有操作系统老师布置的作业(要交)能让我认真学习吧……

  • 信号量Semaphore

1.有关信号量的一些说明:
信号量S是一个整数,S大于等于零时代表可供并发进程使用的资源实体数,但S小于零时则表示正在等待使用共享资源的进程数。
在多进程环境下,进程在进入一个临界代码段之前,进程必须获取一个信号量;一旦临界代码段完成了,释放一个信号量。其他想进入临界代码段的进程必须等待直到那个进程释放信号量。
用信号量实现进程互斥的算法如下:

 semaphore S=1;
 Parbegin
    Process1:Begin 
           Repeate
                 while S<=0  do  no-ops;
                 S=S-1;
                 Critical section;//两个进程的临界区是互斥的
                 S=S+1;
            Until false;
            End
   Process2:Begin
          Repeate
                 while S<=0  do  no-ops;
                 S=S-1;
                 Critical section;
                 S=S+1;
            Until false;
            End
  Parend.

2.Windows下信号量包含的几个操作原语:
CreateSemaphore() 创建一个信号量

OpenSemaphore() 打开一个信号量

ReleaseSemaphore() 释放信号量

WaitForSingleObject() 等待信号量
具体操作看大神的文章https://blog.csdn.net/blues1021/article/details/44548115

  • PV操作

1.PV操作的一些概念:

由来:PV操作是由荷兰人狄克斯特拉用荷兰文定义的,因为在荷兰文中,通过叫passeren,释放叫vrijgeven,PV操作因此得名。

作用:实现进程同步与互斥。P操作表示申请一个资源,V操作表示释放一个资源。

定义:
P操作:S=S-1,若S>=0,则执行P操作的进程继续执行;若S<0,则置该进程为阻塞状态,并将其插入阻塞队列。

Wait(S):    while S<=0  do  no-ops;
                 S=S-1;

V操作:S=S+1,若S>0,则执行V操作的进程继续执行,此时不唤醒其他进程;若S<0,则从阻塞状态唤醒一个进程,并将其插入就绪队列。

Signal(S): S=S+1;

有关PV操作的一些问题看大神的解答https://blog.csdn.net/qq_26434675/article/details/51043342
还有一个形象的解释https://blog.csdn.net/u010843114/article/details/44924231

用PV操作实现进程的互斥算法——在临界区的前后加上Wait(P操作)和Signal(V操作)函数即可:

Repeate
       Wait(S);
       Critical Section;
       Signal(S);
Until false;

2.PV操作的特点(一组PV操作对应于一个进程 ):
原子性,P和V操作不可分!
连续性,P和V操作是不间断的。
P自己,V对方:P的是自己的信号量减1,V的是对方的信号量加1.