zoukankan      html  css  js  c++  java
  • (考研)PV操作和信号量

    就绪:除了CPU其他都行了

    进程的阻塞:进程因等待某事件(如等待I/O设备,等待临街资源)而暂时不能运行的状态,此时即使处理机空闲,进程也无法使用。

    **************************************************************************************************************

    引起进程阻塞的事件(阻塞只能是由运行而来)

    1:向系统申请资源时失败。如一个进程(A)申请打印机但是此时打印机被其他进程(B)正在使用,此时A进程则处于阻塞状态。

    2:等待某种操作:进程A启动了某I/O设备,如果只有完成了指定的I/o任务后进程A才能执行,则进程A启动了I/O设备后会自动进入阻塞。

    3:新数据尚未到达:对于相互合作的进程,如果一个进程需要先获得另一个进程的数据后才能对该数据进行处理,只要数据尚未到达其便会进入阻塞状态。比如资源信号量和互斥信号量

    4:等待新任务的到达:每当这种进程完成自己的任务便把自己阻塞起来,等待新任务到达,才将其唤醒。

    进程阻塞的过程:

    **************************************************************************************************************

    正在执行的进程,如果遇到上面阻塞的事件后,进程便调用阻塞原语block将自己阻塞,(阻塞是进程自身的一种主动行为,调度是考CPU进行的)并将正在运行的进程立即停止运行,并把PCB(数据结构)中进程状态信息改为阻塞,并将PCB插入阻塞队列,如果系统设置了不同阻塞原因的队列,则应将其插入到对应原因引起的阻塞队列中。

    进程唤醒的过程:

    当被阻塞进程所期待的事件发生时则有关的进程会调用唤醒原语(wakeup),将等待的进程唤醒(比如那些等待进入进入的车子),首先把阻塞的进程从阻塞队列中移除,将其PCB插入就绪队列中

     **************************************************************************************************************

    信号量(Saphore)信号量的值表示相应资源的使用情况。信号量S>=0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个资源,因此S的值减1;当S<0时,表示已经没有可用资源,S的绝对值表示当前等待该资源的进程数。请求者必须等待其他进程释放该类资源,才能继续运行。而执行一个V操作意味着释放一个资源,因此S的值加1;若S<0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。

    注意,信号量的值只能由PV操作来改变。

      

    网上搜索了一下,感觉对理解信号量挺有帮助的:
    以一个停车场的运作为例。简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆直接进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入外面的一辆进去,如果又离开两辆,则又可以放入两辆,如此往复。
    在这个停车场系统中,车位是公共资源(临界资源,每辆车好比一个线程,看门人起的就是信号量的作用。
    抽象的来讲,信号量的特性如下:信号量是一个非负整数(车位数),所有通过它的线程/进程(车辆)都会将该整数减一(通过它当然是为了使用资源),当该整数值为零时,所有试图通过它的线程都将处于阻塞状态。在信号量上我们定义两种操作: Wait(等待)(P操作) 和 Release(释放)(V操作)。当一个线程调用Wait操作时,它要么得到资源然后将信号量减一要么一直等下去(指放入阻塞队列)(比如:缓冲区n个都满了,生产者进程拿到了这个互斥控制权,然后再p(empty),执行到这一步将会被阻塞),直到信号量大于等于一时。Release(释放)实际上是在信号量上执行加操作,对应于车辆离开停车场,该操作之所以叫做“释放”是因为释放了由信号量守护的资源

    要特别注意对信号量的p操作



    关于PV操作容易产生的一些疑问:

     1,S大于0那就表示有临界资源可供使用,为什么不唤醒进程?

    S大于0的确表示有临界资源可供使用,也就是说这个时候没有进程被阻塞在这个资源上,所以不需要唤醒。

    2,S小于0应该是说没有临界资源可供使用,为什么还要唤醒进程?

    V原语操作的本质在于:一个进程使用完临界资源后,释放临界资源,使S加1,以通知其它的进程,这个时候如果S<0,表明有进程阻塞在该类资源上,(S>=0没有被阻塞的进程)因此要从阻塞队列里唤醒一个进程来“转手”该类资源。比如,有两个某类资源,四个进程A、B、C、D要用该类资源,最开始S=2,当A进入,S=1,当B进入S=0,表明该类资源刚好用完, 当C进入时S=-1,表明有一个进程被阻塞了,D进入,S=-2。当A用完该类资源时,进行V操作,S=-1,释放该类资源,因为S<0,表明有进程阻塞在该类资源上,于是唤醒一个。

    (我的理解:一个进程使用完临界资源后,当要释放临界资源的时候若S<0则唤醒一个进程进入就绪状态,S加1,即阻塞进程减1)

    3,如果是互斥信号量的话,应该设置信号量S=1,但是当有5个进程都访问的话,最后在该信号量的链表里会有4个在等待,也是说S=-4,那么第一个进程执行了V操作使S加1,释放了资源,下一个应该能够执行,但唤醒的这个进程在执行P操作时因S<0,也还是执行不了,这是怎么回事呢?(好解释)(信号量就是个变量>0的时候才可执行p操作,V操作就随便了

    当一个进程阻塞了的时候,它已经执行过了P操作,并卡在临界区那个地方。当唤醒它时就立即进入它自己的临界区,并不需要执行P操作了,当执行完了临界区的程序后,就执行V操作。(好解释)

    4,S的绝对值表示等待的进程数,同时又表示临界资源,这到底是怎么回事?

    当信号量S小于0时,其绝对值表示系统中因请求该类资源而被阻塞的进程数目.S大于0时表示可用的临界资源数。注意在不同情况下所表达的含义不一样。当等于0时,表示临街资源刚好用完或者阻塞队列进程数位0

  • 相关阅读:
    在 Spring 中使用 Quartz
    Quartz 快速进阶
    任务调度概述
    Spring Boot 2.x 整合 Mybatis 3.x
    pwd函数实现
    07-图4 哈利·波特的考试 (25 分)
    06-图3 六度空间 (30 分)
    linux中的目录
    Linux中的文件
    06-图2 Saving James Bond
  • 原文地址:https://www.cnblogs.com/cs-lcy/p/7103904.html
Copyright © 2011-2022 走看看