在讲解PV操作之前,需要先明白PV操作用来解决什么问题?

PV操作用以解决进程间的互斥问题

eg:火车售票问题 。以下就会出现BUG,假设当 x = 1时,如果
p1 , p2 , 同时执行,那么相当于票数为1的这张票售卖两次,这显然是不能出现的错误。

cobegin     // 表示p1 , p2 同时执行
int x = 7 ; // 假设 x 为北京到上海的机票,还剩下7张
void p1(){if(x>0) x = x - 1 ; cout << "买票成功" << endl ;else                cout << "票已售完" << endl ;
}
void p2(){if(x>0) x = x - 1 ; cout << "买票成功" << endl ;else                cout << "票已售完" << endl ;
}
coend

那么如何解决???

其实很简单,只需要让p1执行的时候,p2不要执行。p2执行的时候,p1不要执行。此时就需要对该程序PV操作。参考代码如下:

Semapohore s = 1 ;    // s 为信号量,用于实现互斥操作。也是对临界资源的设定。
int x = 7 ;            // 假设 x 为北京到上海的机票,还剩下7张
cobegin               // 表示p1 , p2 同时执行
void p1(){p(s) ;             // 把信号量s锁住,让p2不能执行,s -- ;如果s <= 0 , 则进入等待无法向下继续执行if(x>0) x = x - 1 ; cout << "买票成功" << endl ;else                cout << "票已售完" << endl ; v(s) ;   // 把信号量s锁住,让p1可以执行,s ++
}
void p2(){p(s) ;if(x>0) x = x - 1 ; cout << "买票成功" << endl ;else                cout << "票已售完" << endl ; v(s) ;
}
coend

经典进程问题:生产者 消费者问题

1:一个生产者与一个消费者共同使用一个缓冲区 且只能放进一件产品

Semaphore s = 1 ;  // 代表缓冲区能否放进产品
Semaphore t = 0 ;  // 代表缓冲区能否取出产品
cobegin
void prudece(){p(s) ;       // 把缓冲区锁住,无法放进产品生产产品并且放进缓冲区v(t) ;        // 缓冲区中可以取出产品
}
void consumer(){p(t) ; 从缓冲区取出产品v(s) ;  // 释放缓冲区。
}

2:一个生产者与一个消费者共同使用一个缓冲区 且能放进n件产品(n>1);
(与第一个不同的是,缓冲区中不止一件产品)

Semaphore s = 1 ;  // 代表缓冲区能否放进产品 , s = 1 表示能放进
Semaphore t = 0 ;  // 代表缓冲区能否取出产品 , t = 0 表示无法取出
int b[n] ;         // 缓冲区的每一个位置是否有产品存放
int w1 = 0 , w2 = 0 ; // 代表产品以及存放到的位置 和 产品应该要取出来的位置。
cobegin
void prudece(){p(s) ;       // 把缓冲区锁住,无法放进产品生产产品并且放进缓冲区b[w1] = 1 ; // 表示 w1 这个位置  已经放进产品w1 = (w1 + 1) % n ; // 下次放进产品则需要在下一个位置v(t) ;        // 缓冲区中可以取出产品
}
void consumer(){p(t) ; 从缓冲区w2取出产品w2 = (w2 + 1) % n ; v(s) ;  // 释放缓冲区。
}

3:多个生产者与多个消费者共同使用一个缓冲区 且能放进n件产品(n>1);(与第二个不同的是,有多个生产者可以共同生产,但是不能同时放进缓冲区;有多个消费者可以共同消费,但是不能同时从缓冲区取出产品)

思路:

1 :  设置三个信号量 。(1):s = 1 , 表示缓冲区可以使用(2) :  empty = n , 表示缓冲区中空的数量(即表示可以放进产品的数量)(3) :  full = 0 ;  表示缓冲区已经放进产品的数量
2 :  设置 w1 , w2 两个值,分别表示从缓冲区w1值放进产品 , 从缓冲区w2值取出产品3 : s 作为互斥信号使用

代码如下:

Semaphore s = 1 , empty = n , full = 0 ;
int w1 = 0 , w2 = 0 ;
int b[n] ;
cobegin
void pruduct(){p(s) ;p(empty) ;b[w1] = 1 ;  // 在w1放进产品 , 用1表示(注:只是为了表示简单)w1 = (w1 + 1) % n ;v(s) ;v(full) ;
}
void consume(){p(s) ;p(full) ;b[w2] = 0 ;w2 = (w2 + 1) % n ;v(s) ; v(empty) ;
}

PV操作(操作系统) 详解 消费者 生产者问题相关推荐

  1. [Python从零到壹] 八.数据库之MySQL和Sqlite基础知识及操作万字详解

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  2. 通过串口来控制网管型交换机的操作步骤详解

    之前我们对网管型交换机的三种管理方式简单的给大家介绍了一下,一.通过串口管理:二.通过web管理:三.通过网管软件管理.今天,飞畅科技的小编来为大家详细介绍下通过串口终端配置是如何对网管交换机进行控制 ...

  3. kubernetes系列11—PV和PVC详解

    kubernetes系列11-PV和PVC详解 原文:kubernetes系列11-PV和PVC详解 本文收录在容器技术学习系列文章总目录 1.认识PV/PVC/StorageClass 1.1 介绍 ...

  4. 从文本界面安装RHEL5操作系统详解

     从文本界面安装RHEL5操作系统详解 译: -从图形化界面安装系统,按回车键      -从文本界面安装系统,输入linux text 回车      -使用功能键列出下面更多的信息 [F1-主界面 ...

  5. 简述python文件操作_Python 文件操作的详解及实例

    Python 文件操作的详解及实例 一.文件操作 1.对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下: 昨夜寒蛩不住鸣. 惊回千里梦,已三更. ...

  6. 史上最全最详细多种手机主流操作系统详解

    史上最全最详细多种主流操作系统详解(经典,值得收藏) 2017-06-09 18:07 操作系统 一.手机操作系统 1 Android 谷歌安卓 这里写图片描述(https://img-blog.cs ...

  7. 【SEUSE】操作系统实验:消费者-生产者问题

    操作系统实验:消费者-生产者问题 README 一.实验目的 二.实验内容 三.实验步骤 四.主要数据结构及其说明 五.程序运行时的初值和运行结果 六.实验体会 七.源程序 README 本实验报告仅 ...

  8. 红帽学习之RHEL8.7操作系统安装详解

    红帽操作系统安装详解: RHEL8.7镜像下载: 官方网站:https://www.redhat.com/zh 产品页面:https://www.redhat.com/zh/technologies/ ...

  9. 【转】用VB操作Excel详解

    用VB操作Excel详解 一. VB读写EXCEL表: VB本身提自动化功能可以读写EXCEL表,其方法如下: 1.在工程中引用MicrosoftExcel 类型库: 从"工程"菜 ...

最新文章

  1. 查询name和age当name相同时选择age最大的
  2. AAAI2020 | SNERL:抛开mention级别的监督,实体链接、关系抽取我都行
  3. zabbix—安装agent客户端(linux版)
  4. 每个人都有自己的人生节奏
  5. 监督学习无监督学习_无监督学习简介
  6. 集成电路史上著名的十个人,有几个中国人?
  7. react jquery_2019年React简介(面向仅了解jQuery的人们)
  8. Solaris上的开发环境安装及设置
  9. 用Canvas创造一个太阳系
  10. kettle 调用存储过程_Mysql存储过程
  11. 别再把比特币和区块链划等号了,求求你们了!
  12. 新学期,对同学们的要求和期望
  13. STL迭代器iterator
  14. jQuery 属性操作 - addClass() 和 removeClass() 方法
  15. 使用reflector反编译exe文件和dll文件
  16. Dom4j报错之java.lang.NoClassDefFoundError: org/jaxen/JaxenException的解决方案
  17. 装修报价不担心被骗 避免家装陷阱报价揭密
  18. 强化学习环境学习-gym[atari]-paper中的相关设置
  19. 维基百科著名程序员列表大全
  20. Linux 查看服务器cpu信息常用命令大全

热门文章

  1. FAST-LIO: A Fast, Robust LiDAR-inertial Odometry Package by Tightly-Coupled Iterated Kalman Filter
  2. MDG页面隐藏掉不需要的CRTYPE
  3. 有限元FEM求解一维电磁场问题 Rits法 Galerkin法
  4. 一起进阶学习JAVA:MySQL海量数据存储与优化
  5. 利用requests爬取各个城市的麦当劳餐厅位置
  6. 含有铍青铜的高强度合金钢
  7. 存储控制器(SDRAM操作)
  8. 玩转【斗鱼直播APP】系列之请求展示推荐数据
  9. 安装部署vcenter
  10. python企业发放的奖金_你公司的年终奖发了吗?