0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用PV操作可实现并发进程的互斥

嵌入式应用开发 来源:嵌入式应用开发 作者:嵌入式应用开发 2022-05-23 08:55 次阅读

最近在准备软考的时候看到关于PV操作的相关指示点,这里就做个记录,希望对大家有一定的帮助。最开始我很好奇这个PV名字来源,问了好多大佬都不是很清楚,上网一查还觉得挺好玩,它是由老外提出来的狄克斯特拉用荷兰文定义的,因为在荷兰文中,通过叫passeren,释放叫vrijgeven,PV操作因此得名。

为了在单处理机的情况下确定进程(process)能否占有处理机,狄克斯特拉将每个进程分为“就绪”(ready)、“运行”(running)和“阻塞”(blocking)三个工作状态。由于在任一时刻最多只有一个进程可以使用处理机,正占用着处理机的进程称为“运行”进程。当某进程已具备了使用处理机的条件,而当前又没有处理机供其使用,则使该进程处于“就绪”状态。当运行进程由于某种原因无法继续运行下去时,就停止其占用处理机,使之进入“阻塞”状态,待造成其退出运行的条件解除,再进入“就绪”状态。而对系统中所有同时运行的进程之间所存在的相互制约的同步(synchronization,指为了避免错误,在一个进程访问共享数据时,另一个进程不访问该数据)和互斥(mutually-exclusive,指两个进程不能同时在一个临界区中使用同一个可重复使用的资源,诸如读写缓冲区)两个关系,狄克斯特拉巧妙地利用火车运行控制系统中的“信号灯”(semaphore,或叫“信号量”)概念加以解决。

用PV操作来管理共享资源时,首先要确保PV操作自身执行的正确性。由于P(S)和V(S)都是在同一个信号量S上操作,为了使得它们在执行时不发生因交叉访问信号量S而可能出现的错误,约定P(S)和V(S)必须是两个不可被中断的过程,即让它们在屏蔽中断下执行。把不可被中断的过程称为原语。于是,P操作和V操作实际上应该是P操作原语和V操作原语。

P操作的主要动作是:

①S减1;

②若S减1后仍大于或等于0,则进程继续执行;

③若S减1后小于0,则该进程被阻塞后放入等待该信号量的等待队列中,然后转进程调度。

V操作的主要动作是:

①S加1;

②若相加后结果大于0,则进程继续执行;

③若相加后结果小于或等于0,则从该信号的等待队列中释放一个等待进程,然后再返回原进程继续执行或转进程调度。

PV操作对于每一个进程来说,都只能进行一次,而且必须成对使用。在PV原语执行期间不允许有中断发生。原语不能被中断执行,因为原语对变量的操作过程如果被打断,可能会去运行另一个对同一变量的操作过程,从而出现临界段问题。如果能够找到一种解决临界段问题的元方法,就可以实现对共享变量操作的原子性。

事实上,PV操作不仅是实现进程互斥的有效工具,而且还是一个简单而方便的同步工具。用一个信号量与一个消息联系起来,信号量的值为0表示期望的消息尚未产生;信号量的值为非0表示期望的消息已经存在。假定用信号量S表示某个消息,现在来看看怎样用PV操作达到进程同步的目的。

(1)调用P操作测试消息是否到达

任何进程调用P操作可测试到自己所期望的消息是否已经到达。若消息尚未产生,则S=0,调用P(s)后,P(S)一定让调用者成为等待信号量S的状态,即调用者此时必定等待直到消息到达;若消息已经存在,则S≠0,调用P(S)后,进程不会成为等待状态而可继续执行,即进程测试到自己期望的消息已经存在。

(2)调用V操作发送消息

任何进程要向其他进程发送消息时可调用V操作。若调用V操作之前S=0,表示消息尚未产生且无等待消息的进程,则调用V(S)后,V(s)执行S:=S+1使S≠0,即意味着消息已存在;若调用V操作之前S<0,表示消息未产生前已有进程在等待消息,则调用V(S)后将释放一个等待消息者,即表示该进程等待的消息已经到达,可以继续执行。 [1] 

在用PV操作实现同步时,一定要根据具体的问题来定义信号量和调用P操作或V操作。一个信号量与一个消息联系在一起,当有多个消息时必须定义多个信号量;测试不同的消息是否到达或发送不同的消息时,应对不同的信号量调用P操作或V操作。

实现进程互斥

用PV操作可实现并发进程的互斥,其步骤如下:

(1)设立一个互斥信号量S,表示临界区,其取值为1,0,-1,…其中,S=1表示无并发进程进入S临界区;S=0表示已有一个并发进程进入了S临界区;S等于负数表示已有一个并发进程进入S临界区,且有|S|个进程等待进入S临界区,S的初值为1。

(2)用PV操作表示对S临界区的申请和释放。在进入临界区之前,通过P操作进行申请,在退出临界区之后,通过V操作释放。

pYYBAGKKD_WALqNMAAPvs0AKxYU358.png

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 操作
    +关注

    关注

    0

    文章

    43

    浏览量

    18796
  • 处理机
    +关注

    关注

    0

    文章

    12

    浏览量

    7810
  • 信号量
    +关注

    关注

    0

    文章

    53

    浏览量

    8257
收藏 人收藏

    评论

    相关推荐

    Linux Shell多进程并发以及并发数控制

    linux后台并发执行,365个后台任务,系统承受不住哦!既然不能一次性把365个任务放到linux后台执行,那么,能不能实现自动地每次将N个任务放到后台并发执行呢?当然是可以的啦。
    发表于 08-28 15:53

    信号量、互斥锁、自旋锁

    区)信号量:是用来解决进程/线程之间的同步和互斥问题的一种通信机制,是用来保证两个或多个关键代码不被并发调用。信号量(Saphore)由一个值和一个指针组成,指针指向等待该信号量的进程
    发表于 08-29 09:48

    进程和线程的区别和联系介绍

    的好处 (1)易于调度。 (2)提高并发性。通过线程方便有效地实现并发性。进程创建多个线程来
    发表于 07-04 00:18

    进程同步机制应遵循的规则与信号量的应用

    一次只允许一个进程使用的共享资源称为临界资源,如打印机,绘图机,变量,数据等,各进程间采取互斥方式实现对这种临界资源的共享,从而实现
    发表于 08-05 08:05

    进程互斥与同步介绍

      程之间互相竞争某一个资源,这种关系就称为进程互斥,也就是说对于某个系统资源,如果一个进程正在使用,其他的进程就必须等待其用完,不能同时使用。
    发表于 08-06 08:28

    操作系统的进程同步

    互相协作的进程之间有共享的数据,于是这里就有一个并发情况下,如何确保有序操作这些数据、维护一致性的问题,即进程同步。
    发表于 08-07 06:35

    操作系统 : 进程与线程

    本文为《现代操作系统》的读书笔记目录程序顺序执行与并发执行进程的定义进程的状态转换进程控制块进程
    发表于 07-01 10:49

    进程管理的同步与互斥有何区别以及联系

    进程管理的同步与互斥有何区别?进程管理的同步与互斥有何联系?
    发表于 12-23 06:15

    Linux线程实现与线程控制步骤简析

    广泛用于进程或线程间的同步与互斥,它本质上是一个非负的整数计数器。PV 原语是对整数计数器信号量 sem 的操作。一次 P 操作使 sem
    发表于 04-25 09:29

    操作系统讲解(操作系统课件)

    操作系统讲解(操作系统课件) 第五章 文件管理.doc第六章 设备管理(部分).doc第二章 进程管理.doc第3章 并发控制——互斥与同
    发表于 05-16 18:06 0次下载

    Linux 多线程互斥互斥

    的。如果操作是原子操作,那么天然的具有互斥同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同
    发表于 04-02 14:47 201次阅读

    软、硬件方法解决进程互斥问题

    1.临界资源(critical resource):系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源(或互斥资源)。
    的头像 发表于 05-10 15:11 1105次阅读
    软、硬件方法解决<b class='flag-5'>进程</b><b class='flag-5'>互斥</b>问题

    使用Linux互斥实现互斥点灯

    互斥访问是指一次只有一个线程可以访问共享资源,不能递归申请互斥体。使用互斥体时要注意如下几点。
    的头像 发表于 04-13 15:13 666次阅读
    使用Linux<b class='flag-5'>互斥</b>体<b class='flag-5'>实现</b><b class='flag-5'>互斥</b>点灯

    shell脚本实现并发进程

    在Shell脚本中实现并发进程可以使用以下方法: 使用符号来将其放入后台执行,从而实现并发进程
    的头像 发表于 11-08 10:20 461次阅读

    互斥锁和自旋锁的区别 自旋锁临界区可以被中断吗?

    互斥锁和自旋锁的区别 自旋锁临界区可以被中断吗? 互斥锁和自旋锁是在多线程编程中常用的锁机制,它们用于保护共享资源的并发访问,但在实现和使用方式上存在一些区别。
    的头像 发表于 11-22 17:41 404次阅读