进程通信方式之 信号量与PV操作

时间:2021-10-29 14:45:06

 

    本文出自:http://blog.csdn.net/sunlovefly2012/article/details/9396201


  在操作系统中,进程之间经常会存在互斥(都需要共享独占性资源时) 和同步(完成异步的两个进程的协作)两种关系.为了有效的处理这两种情况,狄克斯特拉(W.Dijkstra)在1965年提出信号量 (semaphore)和PV操作.

    信号量:

    信号量是一种特殊的变量,实际上就是用来控制进程状态的一个代表某一资源的存储单元表现形式是一个整型S和一个队列.

    PV操作:

    P操作和V操作是执行时不被打断的两个操作系统原语。执行P操作P(S)时信号量S的值减1,若结果不为负则P(S)执行完毕,否则执行P操作的进程暂停以等待释放。执行V操作V(S)时,S的值加1,若结果不大于0则释放一个因执行P(S)而等待的进程.

    P操作:也称为down()/wait()操作,使S=S-1,若S<0,进程暂停执行,放入信号量的等待队列.

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

(1)完成互斥控制:

    为了保护共享资源,不让多个进程同时访问这个共享资源,换句话说,就是阻止多个进程同时进入访问这些资源的代码段,这个代码段称为临界区(也称为管程),这种一次只允许一个进程访问的资源称为临界资源.为了实现进程互斥地进入自己的临界区,代码可以如下所示:

P(信号量S)

    ......

    临界区(访问临界资源的代码段)

    ......

V(信号量S)

    由于只允许一个进程进入,因此信号量中整型值的初始应设为1.初始信号量S表示可以允许多少个进程进入,当该值<0时,其绝对值就是等待使用临界资源的进程数,也就是等待队列中的进程数.而当一个进程从临界区出来时,就会将整型值加1,如果等待队列中还有进程,则调入新的进程进入(唤醒).


执行P操作以后,S的值绝对不可能大于初始信号量S!

执行V操作以后,S的绝对值绝对不可能大于或者等于初始信号量S!



(2)完成同步操作

    最简单的同步形式是:进程A在另一个进程B到达L2以前,不该不该前进到超过L1,这样就可以使用以下程序表示:

进程A                                                    进程B

......                                                         ......

L1:P(信号量S)                                      L2:V(信号量S)

......                                                        ......

    因此,要确保进程B执行V操作之前,不让进程A的运行超过L1,因此信号量的初值就应该为0.这样,如果进程A先执行到L1,那么执行P操作后,信号量的整型值就会小于1,也就停止执行.直到进程B执行到L2时,将信号量的整型值加1,并唤醒它以继续执行.


备注:中国读者常常不明白这一同步机制为什么叫PV操作,原来这是狄克斯特拉荷兰文定义的,因为在荷兰文中,通过叫passeren,释放叫vrijgeven,PV操作因此得名。这是在计算机术语中不是用英语表达的极少数的例子之一。