• 幕客老师召集小伙伴
  • 运维高手36项修炼
  • python自动化运维项目实战
  • nginx从入门到实战
  • 阿里云与Centos7实战

操作系统 信号量与PV操作

在操作系统中,进程之间经常会存在互斥(都需要共享独占性资源时) 和同步(完成异步的两个进程的协作)两种关系.为了有效的处理这两种情况,狄克斯特拉(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.该值表示可以允许多少个进程进入,当该值<0时,其绝对值就是等待使用临界资源的进程数,也就是等待队列中的进程数.而当一个进程从临界区出来时,就会将整型值加1,如果等待队列中还有进程,则调入新的进程进入(唤醒).

(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操作

Pingbacks已打开。

引用地址

暂无评论

发表评论