PV操作概念:操作系统中的一种同步机制,实现对于并发进程中临界区的管理

并发进程分为两种:

无交互的并发进程:每个进程是相互独立的,谁也不影响谁,基本不会用到PV操作。

有交互的并发进程:多个进程共享资源,一个进程的运行,有可能会被外界的原因而中断,且断点不固定。进程执行的相对速度不能由进程自己来控制,于是就会导致并发进程在共享资源的时出现与时间有关的错误

临界区:并发进程中与共享变量有关的程序段都称为临界区。

P操作:申请资源操作。

V操作:释放资源操作。

信号量S:用来记录资源数量,看是否能满足申请资源的操作。例如:S=3 表示三个可用空闲资源S<0表示可用空闲资源无,进程申请要进入等待队列中。

P(S):S <—— S - 1 

          如果S >= 0,进程继续执行

          如果S < 0,进程停止执行,放入信号量等待队列中。

V(S):S <—— S +1 

           如果S > 0,进程继续执行;

           如果S <= 0,唤醒等待队列中的一个进程。

例子:银行排队取号,按号叫人,值得一提的是窗口上有个大大的LED屏,显示着有几个人在等待,一共三个窗口,这时,10个人想办理业务。(资源-窗口,人-进程,大屏幕-S,很符合了吧)

    没人在窗口办理业务,屏幕:3个窗口可以办理;

    1人在窗口办理业务,屏幕:2个窗口可以办理;

    2人在窗口办理业务,屏幕:1个窗口可以办理;

    3人在窗口办理业务,屏幕:0个窗口可以办理;

    又来一个人取号,屏幕:1人在等待;       。。。。。

   第十个人来了,屏幕:7人在等待;

以上取号都是申请资源操作 P(S),取号就相当于对屏幕上信号量减一,即 P(S) 中的 S-1 , 减成负数时就要在等待区等待。

当一个人办理完业务,将释放一个窗口,则屏幕信号量 V(S) 中的 S 加1, 1人办理完业务,屏幕:6人在等待(一人去了窗口办理业务)

用PV操作表示

申请资源P(S)中的S 操作:信号量初始值S = 3 ,一个申请 S <—— 3-1 ,S >= 0,进程继续。不阻塞。。。。。到第4个申请的时候,

S <——0-1,S < 0 ,进入阻塞队列中等待。。。。。到第10个申请的时候, S <—— -6-1,,S = -7 ,等待队列中有7个正着等着用资源。

释放资源V(S)中的S 操作:1人办理完业务,释放资源,S <—— -7+1 ,S < =0 ,唤醒等待队列中的一个。。。。7个人办理完业务,释放资源 S <—— -1 +1 ,S <=0 ,没有申请了,就空闲继续执行进程即可。全部办理完,S = 3 则有3个空闲资源可用。

关于PV操作前驱后继图的解答

重要的几点解题条件:

①信号量初值都为0

②将信号量看成一个互斥量,如果想要某个结点停止执行,那么就对它做P操作,这样信号量的值就小于0,被压入阻塞队列。如果完成了某个结点的计算,那么就把它连向的结点做V操作,这样就相当于“激活”了下一个其他的结点,继续执行程序,这样就完成了进程间的同步过程。

③前驱图可以看作是拓扑结构图,想要执行 P2 ,必须先执行 P1 后才可以 ,想要执行 P3,必须执行 P1 和 P2 后才可以。

总结就是:一个进程 A 引出某些信号量,则在 A 进程末尾对这些信号量执行 V 操作。

                 信号量指向某进程 A ,则在 A 进程开始位置有这些信号量的 P 操作。

如上图,四个信号量都为0,我们将信号量标记在图上,但不是随意乱标记,有一定的规则

【原创】PV操作 <wbr>前驱图

情况1中:P1 进程引出信号量 S1、S2 ,所以在 P1 末尾对这些信号量执行 V(S1)、V(S2);P2 进程引入 S1 信号量,则在 P2 开始的位置有 P(S1) 操作,P2 进程引出 S3 信号量,则在 P2 末尾执行 V(S3) 操作;依次类推。

情况2中:同情况1一样分析。

带入答案中会发现,只有 情况1 符合题意,所以按照 情况1 来标记信号量,做题时,尽量先按照顺序来标记,有很大的机会误打误撞标记正确。

学习资料:http://blog.sina.com.cn/s/blog_6d79d83a0101b6tp.html

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐