软考征程之Pv操作

2024-05-08 04:18
文章标签 操作 软考 pv 征程

本文主要是介绍软考征程之Pv操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、概念

       1、PV操作的含义

       PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:
            P(S):①将信号量S的值减1,即S=S-1;
                           ②如果S³0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
           V(S):①将信号量S的值加1,即S=S+1;
                           ②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。

    PV操作的意义:我们用信号量及PV操作来实现进程的同步和互斥。PV操作属于进程的低级通信。

   2、进程的同步和互斥

   同步:指在并发进程之间存在一种制约关系,一个进程的执行依赖另一个进程的消息,当一个进程没有得到另一个进程的消息时应等待,直到消息到达才被唤醒。

举例:如上,盘中只能放一个苹果,只用父亲放了,儿子才能拿,此时即协作关系(同步)。

    互斥:指当有若干个进程都要使用某一共享资源时,任何时候最多只允许一个进程去使用该资源,其他要使用它的进程必须等待,直到该资源的占用者释放了该资源。

举例:学校有多台打印机,但此时只有一个打印机处于空闲状态,甲和乙同时想使用,但只能一人先用,直到甲用完,乙才能使用----(互斥)

      3、信号量的类型定义

      信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操作来改变。

二、实例

我们来看一下这张同步的图:

这张图也特别的形象具体,我们具体来看看这张图,A仓库有货物,然后我们需要把货物搬运到B仓库,由搬运工甲和搬运工乙来完成这个过程;那么他们的目标就只有一个,就是把货物从A搬到B去,共同奔着这个方向去发展,所以我们说这是一个同步的问题。

PV操作:解决互斥和同步的问题。PV操作是分开来看的(甲跟乙拥有各自的Pv操作,同时用各自的信号量):

     首先看乙:

           P(乙)操作:使S(乙)=S(乙)-1,若S(乙)>=0,则该进程继续执行,否则该进程排入等待队列(乙)。

           V(乙)操作:使S(甲)=S(甲)+1,若S(甲)>0,唤醒等待队列(甲)中的一个进程。

 

     然后看甲:

           P(甲)操作:使S(甲)=S(甲)-1,若S(甲)>=0,则该进程继续执行,否则该进程排入等待队列(甲)。

           V(甲)操作:使S(乙)=S(乙)+1,若S(乙)>0,唤醒等待队列(乙)中的一个进程。

三、讨论

信号量是否可为零

       首先,我们知道信号量的正负表示资源能用或者不能用,当不用资源即谈不上能用还是不能用时,也可以把这时的信号量看作0。但是实际工作的时候是不为0的,即资源要么可以用,要么不可以用。

       举个例子来说,我们去买火车票,要么有票,要么没票,不会出现其他情况。

四、总结

     1、原子性。

      PV操作是一组操作,不可分割。

     2、P自己,V别人。

      P操作是让自己的信号量减少,V操作是增加对方的信号量

     3、普遍性。

      每个进程都可以进行PV操作(甲和乙都可以)

         4、解耦合

      PV操作的目的就是解耦,使甲和乙的操作可以同步进行,互不影响

 

 

 

 

 

 

 

 

 

 

 

 

 

这篇关于软考征程之Pv操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/969280

相关文章

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Python 中的 with open文件操作的最佳实践

《Python中的withopen文件操作的最佳实践》在Python中,withopen()提供了一个简洁而安全的方式来处理文件操作,它不仅能确保文件在操作完成后自动关闭,还能处理文件操作中的异... 目录什么是 with open()?为什么使用 with open()?使用 with open() 进行

Linux ls命令操作详解

《Linuxls命令操作详解》通过ls命令,我们可以查看指定目录下的文件和子目录,并结合不同的选项获取详细的文件信息,如权限、大小、修改时间等,:本文主要介绍Linuxls命令详解,需要的朋友可... 目录1. 命令简介2. 命令的基本语法和用法2.1 语法格式2.2 使用示例2.2.1 列出当前目录下的文

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Redis中管道操作pipeline的实现

《Redis中管道操作pipeline的实现》RedisPipeline是一种优化客户端与服务器通信的技术,通过批量发送和接收命令减少网络往返次数,提高命令执行效率,本文就来介绍一下Redis中管道操... 目录什么是pipeline场景一:我要向Redis新增大批量的数据分批处理事务( MULTI/EXE