2014-04-13 22:11:50 u010929604 阅读数 1927
  • spring3.2入门到大神(备java基础、jsp、servlet,...

    框架介绍,IoC思想、DI依赖注入、Bean的实例方式、Bean种类、Bean作用域范围、Bean生命周期管理、依赖注入、注解装配Bean、整合Junit测试、WEB开发集成spring、AOP思想、AOP原理解剖、spring 传统aop开发、JdbcTemplate模板使用、C3P0数据源配置、声明式事务管理、注解事务管理。SSH xml整合、SSH注解整合。

    21440 人正在学习 去看看 任亮

         大家在学习操作系统的时候,肯定会被各种调度算法搞得焦头烂额,什么处理器调度,什么磁盘引臂调度算法,什么页面置换算法等等,但是我从一开始接触操作系统时,对这些调度算法并不感冒,反而对PV操作比较欠缺,也许是没有好好听课,又或许是没好好看书,总之再一次遭遇PV操作,我觉得不能就这么算了,得给它点color see see!

         首先要搞清楚的问题是:什么是信号量?什么是PV操作?

         信号量与PV操作是由荷兰著名学者E.W.Dijkstra于1965年提出来的,是最早的也是最成功的进程同步机制。这种同步机制包括一种称为信号量类型的变量以及对于此种变量所能进行的两个操作,即P(荷兰语Proberen)操作和V(荷兰语Vehogen)操作。由于荷兰语不够流行,在有些书中将P操作称为Down操作,将V操作称为Up操作。

         关于信号量即P原语V原语的内部结构,就不给大家介绍了,不利于初学者理解,我们的目标是会做操作系统的PV操作题。

         PV操作能够实现对临界区的管理。其具体定义如下:

         P操作P(S):将信号量S减去1,若结果小于0,则把调用P(S)的进程置成等待信号量S的状态。

         V操作V(S):将信号量S加1,若结果不大于0,则释放一个等待信号量S的进程。

         我们规定信号量S的初值为0或者1或者其他整数,它应在系统初始化时确定。

         下面给出一个PV操作的经典例子:生产者—消费者问题

         begin

                   Buffer:integer;

                   SP,SG:semaphore;

                   SP:=1;SG:=0;

         Cobegin

                   Processproducer

                   Begin

                            L1:producea product;

                               P(SP);

                               Buffer:=product;

                               V(SG);

                               Go to L1

                   End;

                   Processconsumer

                   Begin

                            L2:P(SG);

                               Take a product;

                               V(SP);

                               Consume;

                               Go to L2

                   End;

         Coend;

         End;

对于Buffer我们可以理解为一个容器,用来存放生产者生产的产品,并且一次只能放一个,那么信号量SP就表示容器中是否有产品,初值为1代表容器为空,可以放1个产品,而信号量SG表示容器中产品的个数,初值为0代表容器中没有产品。

对于生产者来说,生产一个产品后调用P(SP)来查看容器是否为空,如果为空则把产品放进去,否则将信号量减1,将进程置为等待状态,当放进去一个产品后,生产者要调用V(SG)来通知消费者,告知消费者容器中有1个产品,可以去取出来了,然后消费者调用P(SG)判断容器中是否有产品,如果有则取出来,否则将信号量减1,并且等待,当消费者把产品取出来之后,要调用V(SP)来通知生产者,容器已经空了,可以将生产出来的产品放进去了,然后就是循环了,如此往复,两个进程就可以同步执行了。

PV操作
2013-10-11 11:51:07 lypf19900912 阅读数 1228
  • spring3.2入门到大神(备java基础、jsp、servlet,...

    框架介绍,IoC思想、DI依赖注入、Bean的实例方式、Bean种类、Bean作用域范围、Bean生命周期管理、依赖注入、注解装配Bean、整合Junit测试、WEB开发集成spring、AOP思想、AOP原理解剖、spring 传统aop开发、JdbcTemplate模板使用、C3P0数据源配置、声明式事务管理、注解事务管理。SSH xml整合、SSH注解整合。

    21440 人正在学习 去看看 任亮

1. 概念    

  1.同步

              合作进程间的直接制约关系

 

生产者和消费者是两个进程,他们之间需要合作才能够完成一次交易,缺少任何一个进程都不可以!

同步就是进程之间的合作关系!

 2.互斥

          申请临界资源进程间的间接制约关系

      独木桥一次只能够让一个人通过,在过桥的时候一个人再过的时候其他人只能够等待

3.临界区

         进程中对临界资源实施操作的那段程序

4.临界资源

        各进程可以共享各类资源,但有些资源一次只能供一个进程使用

      比如车上有n个座位,临界资源就是N,那么临界区就是是占有这个座位的过程;

       反应到程序中就是访问临界资源的代码

5.信号量

      信号量S的物理意义:S>=0表示某资源的可用数,若S<0,则其绝对值表示阻塞队列中等待该资源的进程数

       公有信号量:实现进程间的互斥;初值为1或资源的数目

              私有信号量:实现进程间的同步;初值为0或者某个正整数

       比如信号量就是一个交通指示灯外;需要看对应的信号量的状态才确定执行还是等待.

 2.PV原语

      1. P操作  

 Begin

S:=S-1;

If S<0 then R(S)   (执行P操作的进程插入等待队伍)

End;

       2.V操作 

 Begin

S:=S+1;

If S<0 then R(S)   (从阻塞的队列中唤醒一个进程)

End;

  P操作减一,V操作加一

3. PV操作实现互斥

         令信号量mutex的初值为1,当进入临界区执行P操作,退出临界区时执行V操作

P(mutex)

临界区

V(mutex)

1.互斥的信号量

        临界资源的数量

初值一般设置最大的临界资源数量

2.互斥的P操作:查看是否有临界资源

      在进程需要访问临界区的时候,执行一个P操作来确定是否能够进入临界区(就好像过马路要先看指示灯)

      P操作会查看资源的剩余量;假设进程进入那么资源数就会减一,减一之后查看资源的剩余量来确定进程是否可以      访问临界区

3.互斥的V操作:将临界区的资源释放掉

        对应到程序中就是对信号量执行一个V操作之后退出临界区

        V操作就是:增加资源的剩余量;假设进程退出那么资源就会加一,然后进程退出临界区

2. PV操作实现同步

单缓冲区的生产者消费者是一个进程之间的同步

        

1.同步的信号量

资源的数量—进程的状态

S1:生产者能否放入缓冲区

S2:消费者能否消费

   初值的设置

     各个进程的初始状态;这个的设置不局限于一种。

      生产者可以放,初值为1;消费者开始不能消费,初值为0

       生产者不可以放,初值为0.;消费者开始不能消费,初值为0

2.同步的P操作

是否执行进程

P(S1)代表生产者是否可以放入产品, P(S2)代表消费者是否可以消费产品

3.同步的V操作

是否唤醒进程

V(S1)代表消费者消费完,唤醒生产者, V(S2)代表生产者放入了产品,唤醒消费者


2015-10-08 21:45:34 wuhuikun 阅读数 710
  • spring3.2入门到大神(备java基础、jsp、servlet,...

    框架介绍,IoC思想、DI依赖注入、Bean的实例方式、Bean种类、Bean作用域范围、Bean生命周期管理、依赖注入、注解装配Bean、整合Junit测试、WEB开发集成spring、AOP思想、AOP原理解剖、spring 传统aop开发、JdbcTemplate模板使用、C3P0数据源配置、声明式事务管理、注解事务管理。SSH xml整合、SSH注解整合。

    21440 人正在学习 去看看 任亮

为了更加巩固一下pv操作系统,我拿一道题出来解答一下,以便巩固知识。

2011年11月考试的一道题,题目如下:

进程P1、P2、P3、P4和P5的前趋图如下:

若用PV操作控制进程P1~P5并发执行过程,则需要设置5个信号量S1、S2、S3、S4和S5,进程间同步所使用的信号量标注在上图中的边上,且信号量S1~S5的初始值都等于零,初始状态下从进程P1开始执行。下图中a、b和c处应分别填写(1);d和e处应分别填写(2),f和g处应分别填写(3)。

(1)A. V(S1)V(S2)、P(S1)和V(S3) V(S4)
B. P(S1)V(S2)、P(S1)和P(S2) V(S1)
C. V(S1)V(S2)、P(S1)和P(S3) P(S4)
D. P(S1)P(S2)、V(S1)和P(S3) V(S2)
(2)A. P(S1) 和V(S5)
B. V(S1) 和P(S5)
C. P(S2) 和V(S5)
D. V(S2) 和P(S5)
(3)A. P(S3)和V(S4) V(S5)
B. P(S3)和P(S4) P(S5)
C. V(S3)和V(S4) V(S5)
D. V(S3)和P(S4) P(S5)


好吧,废话少说,开始解题。

该题目拿到入口点就是在前趋图,前趋图的每一个箭头可以看做是一个信号量,进的箭头可以看做是 P操作,而出的箭头可以看做是V操作。

首选看P1的箭头。P1有两个出的箭头,说明P1进行了两次 的V操作,分别是V(S1)和V(S2),所以a处应该是 V(S1)和V(S2)。

接着看 P2的箭头。P2 有一个进的箭头,以及两个出的箭头,所以,P2的操作应该分别是 P(S1)、V(S3)和V(S4)。


如此类推,所以答案应该是 (1)A、 (2)C 、(3)D


2019-01-19 13:29:17 jffyuhgv 阅读数 155
  • spring3.2入门到大神(备java基础、jsp、servlet,...

    框架介绍,IoC思想、DI依赖注入、Bean的实例方式、Bean种类、Bean作用域范围、Bean生命周期管理、依赖注入、注解装配Bean、整合Junit测试、WEB开发集成spring、AOP思想、AOP原理解剖、spring 传统aop开发、JdbcTemplate模板使用、C3P0数据源配置、声明式事务管理、注解事务管理。SSH xml整合、SSH注解整合。

    21440 人正在学习 去看看 任亮
                操作系统中PV操作的几个例子


题1:面包师有很多面包,由n个销售人员推销。每个顾客进店后取一个号,并且等待叫号,当一个销售人员空闲下来时,就叫下一个号。试设计一个使销售人员和顾客同步的算法。


思路:顾客进店后按序取号,并等待叫号,销售人员空闲之后也是按序叫号,并销售面包。因此同步算法只要对顾客取号和销售人员叫号进行合理的同步即可。我们使用两个变量i和j分别记录当前的取号值和叫号值,并各自使用一个互斥信号用于对i和j的访问和修改


代码:
int i=0,j=0;semaphore mutex_i=1,mutex_j=1;Consumer(){ //进入面包店 p(mutex_i); //取号i i++; v(mutex_i); //等待叫号i并购买面包}Seller(){ while(1) {  p(mutex_j);  if(j<i) //号j已有顾客取走并等待  {   //叫号j   j++;   v(mutex_j);   //销售面包  }  else  {   v(mutex_j);   //休息片刻  } }}





题2:三个合作进程P1,P2,P3,它们都需要通过同一设备输入各自的数据a,b,c,该输入设备必须互斥地使用,而且其第一个数据必须有P1进程读取,第二个数据必须由P2进程读取,第三个数据必须由P3进程读取。然后三个进程分别对输入数据进行下列计算:
P1:x=a+b;
P2:y=a*b;
P3:z=y+c-a;
最后P1进程通过所连的打印机将结果x,y,z的值打印出来,请用信号量实现他们同步。


思路:为了控制三个进程依次使用输入设备进行输入,需分别设置三个信号量S1,S2,S3,其中S1初值为1,S2和S3初值为0.使用上述信号量后,三个进程不会同时使用输入设备,故不必再为输入设备设置互斥信号量。另外,还需要设置信号量Sb,Sy,Sz来表示数据b是否已经输入,以及y,z是否已经计算完成,他们的初值均为0。


代码:
P1(){ P(S1); //从输入设备输入数据a V(S2); P(Sb); x=a+b; P(Sy); P(Sz); //使用打印机打印出x,y,z的结果}P2(){ P(S2); //从输入设备输入数据b V(S3); V(Sb); y=a*b; V(Sy); V(Sy);}P3(){ P(S3); //从输入设备输入数据c P(Sy); z=y+c-a; V(Sz);}







题3:在读者写者问题中,允许多个读者同时读数据,但不允许写者与其他写者进程同时访问数据。另外要保证:一旦有写者等待,新到达的读者必须等待,知道该写者完成数据访问为止,用PV操作实现。


思路:这是一个“写优先”的读者-写者问题,在经典的“读优先”的读者-写者文章的PV操作中,只要再添加一个信号量w=1,用以在写进程到达时封锁后续进程,即可实现“写优先”


代码:
int count=1;//记录当前读者数量semaphore mutex=1;//保护更新count变量时的互斥semaphore rw=1;//保证读者和写者互斥地访问文件semaphore w=1;//实现“写优先”writer(){ while(1) {  P(w);  P(rw);  //writing  V(rw);  V(w); }}reader(){ while(1) {  P(w);  P(mutex);  if(count==0)  {   P(rw);  }  count++;  V(mutex);  V(w);  //reading  P(mutex);  count--;  if(count==0)  {   V(rw);  }  V(mutex); }}







题4:有桥如图,车流方向如箭头所示,假设该桥上不允许两车交会,但允许同方向多个车一次通过(桥上可有多个同方向行驶的车),试用信号量PV实现




代码:
int countSN=0;//表示从南到北的汽车数量int countNS=0;//表示从北到南的汽车数量semaphore mutexSN=1;//保护countSNsemaphore mutexNS=1;//保护countNSsemaphore bridge=1;//互斥访问桥StoN(){ p(mutexSN); if(countSN==0) {  p(bridge); } countSN++; v(mutexSN); //过桥 p(mutexSN); countSN--; if(countSN==0) {  v(bridge); } v(mutexSN);}NtoS(){ p(mutexNS); if(countNS==0) {  p(bridge); } countNS++; v(mutexNS); //过桥 p(mutexNS); countNS--; if(countNS==0) {  v(bridge); } v(mutexNS); }


           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

2019-11-03 17:28:58 JunSIrhl 阅读数 313
  • spring3.2入门到大神(备java基础、jsp、servlet,...

    框架介绍,IoC思想、DI依赖注入、Bean的实例方式、Bean种类、Bean作用域范围、Bean生命周期管理、依赖注入、注解装配Bean、整合Junit测试、WEB开发集成spring、AOP思想、AOP原理解剖、spring 传统aop开发、JdbcTemplate模板使用、C3P0数据源配置、声明式事务管理、注解事务管理。SSH xml整合、SSH注解整合。

    21440 人正在学习 去看看 任亮

操作系统-PV操作

WHAT?

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

并发进程

  1. 无交互并发进程:每个进程独立,无需PV操作
  2. 有交互并发进程:多个进程共享资源,需控制进程次序,防止进程因资源被占用而阻塞

临界区

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

P操作

申请资源

V操作

释放资源

信号量S

用来记录资源数量,作为判断是否满足P操作的条件

如S=1,表示可用资源数量为1

HOW?

来看一道题目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kBa0Dc5t-1572773085053)(C:\Users\JunSIr\AppData\Roaming\Typora\typora-user-images\image-20191103112912579.png)]

破题

  • S1-S4初始值都为0

  • 将信号量看作互斥量,如果想要某个结点停止运行,对之结点进行P操作,S就会减少相应数量,一旦S小于0(记住S初值=0),进程被压入阻塞队列

  • 如果完成了某个结点的任务,把它连向的结点进行V操作释放资源,等效于激活了下一个其他结点的工作

  • 前驱图:想要执行P2,必须先执行P1 / 想要执行P3,必须先执行P1P2

  • 解题过程:一个进程A引出某些信号量,则在进程A末尾对这些信号量做释放(V

    ​ 信号量指向某进程B,则在B进程开-始位置对这些信号量进行申请(P)

具体解题细节

  1. P1结点入度0(无指向它的边)—>为了此结点后续结点能运行,通过此结点的必然是V释放操作---->AB选项排除,P1操作完毕—>P1入阻塞队列—>后续执行P申请操作–>选C

  2. 发现执行完P2之后有个V(S3)操作,故P2指出的边S肯定为S3

  3. 四定三则第四条边带的信号量可推—>S4

  4. 分类讨论

    • 情况1:P1指向P2的边信号量为S1,P1指向P3的边的信号量为S2

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VWsxyDCU-1572773085054)(C:\Users\JunSIr\AppData\Roaming\Typora\typora-user-images\image-20191103172234024.png)]

      ​ 推导:

      ​ 执行P3之前,操作应该为P(S3)P(S2)—>选项BD确定+执行P4前肯定要申请P(S4)---->B确定

    • 情况2:P1指向P2的边信号量为S2,P1指向P3的边的信号量为S2

      - ​		[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xpEFbAp4-1572773085056)(C:\Users\JunSIr\AppData\Roaming\Typora\typora-user-images\image-20191103172304903.png)]

      ​ 推导:

      执行P3前,操作应该为P(S1)P(S3)无此选项—>故为情况1

博文 来自: qq_36294146

操作系统PV操作

阅读数 62

博文 来自: weixin_43981811
没有更多推荐了,返回首页