原文链接:https://blog.csdn.net/qq_40760732/article/details/89513663
仅为学习记录
PV操作的特点:

原子性,P和V操作不可分!
连续性,P和V操作是不间断的。
P自己,V对方:P的是自己的信号量减1,V的是对方的信号量加1.

文章开头,先来一段要背的内容

接下来,先给两个网上的案例热热身
案例一:

import threading,time
lock_1 = threading.Semaphore(1)     #检查售票员是否关门
lock_2 = threading.Semaphore(0)     #检查司机是否停车
def 司机():for i in range(3):lock_1.acquire()print('司机开车')time.sleep(1)print('驾驶')print('到站停车')lock_2.release()
def 售票员():for i in range(3):lock_2.acquire()time.sleep(1)print('打开车门')print('乘客上下车')time.sleep(1)print('关上车门')lock_1.release()
if __name__=='__main__':p1 = threading.Thread(target=司机)p2 = threading.Thread(target=售票员)p1.start()p2.start()p1.join()p2.join()

解释:
1.里面的lock_1,lock_2为两个信号量;

2.lock_1.acquire()为P操作,lock_1.release()为V操作;

3.lock_1 = threading.Semaphore(1)的意思是将信号量lock_1的初值赋为1。

注意:
Semaphore管理一个内置的计数器,
每当调用acquire()时内置计数器-1;
调用release() 时内置计数器+1;
计数器不能小于0;当计数器为0时,acquire()将阻塞线程直到其他线程调用release()。

我们将lock_1的初值赋为1,lock_2的初值赋为0,则先执行司机这一线程。

案例二:

import queue,random,threading
from time import sleeps_1 = threading.Semaphore(1)  # 临界区互斥信号量
s_2 = threading.Semaphore(5)  # 判断是否有空闲缓冲区的信号量
s_3 = threading.Semaphore(0)  # 判断缓冲区里是否有产品的信号量def productor(i, q):while True:num = random.choice(['华为P30', '小米9', 'ViVo x27', 'iphone XR'])print('生产者%d生产了产品%s' % (i, num))s_2.acquire()  # 是否有空缓冲区s_1.acquire()  # 缓冲区是否被占用q.put(num)sleep(1)print('生产者%d把产品%s放入了仓库中' % (i, num))s_1.release()s_3.release()def consumer(i, q):while True:s_3.acquire()s_1.acquire()num = q.get()sleep(1)print('消费者%d购买了产品%s' % (i, num))s_1.release()s_2.release()if __name__ == '__main__':q = queue.Queue(5)  # 创建上限为5的缓冲区# 创建4个生产者for i in range(4):threading.Thread(target=productor, args=(i, q)).start()# 创建6个消费者for i in range(6):threading.Thread(target=consumer, args=(i, q)).start()

信号量:
设置三个信号量,一个信号量判断缓冲区是否被占用,一个信号量判断缓冲区是否有空,最后一个信号量判断缓冲区里是否有东西。

生产者:四个

消费者:六个

缓冲区:五个

某一时刻只能有一个线程或进程访问缓冲区,缓冲区没满时生产者可以往里面放东西,缓冲区没空时消费者可以从里面取东西。

PV操作的简单了解:
进程通常分为就绪、运行和阻塞三个工作状态。三种状态在某些条件下可以转换,三者之间的转换关系如下:

进程三个状态之间的转换就是靠PV操作来控制的。PV操作主要就是P操作、V操作和信号量。其中信号量起到了至关重要的作用。

信号量

信号量是最早出现的用来解决进程同步与互斥问题的机制。

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

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

最后来一句顺口溜笔记:

P减V加信号量
互斥信号量是1
唤醒进程跳临界
负阻正有0用完

Python中的PV操作相关推荐

  1. python中的日志操作和发送邮件

    1.python中的日志操作 安装log模块:pip install nnlog 参数:my_log = nnlog.Logger('server_log.log',level='debug',bac ...

  2. 操作系统中的P-V操作(转)

    信号量是最早出现的用来解决进程同步与互斥问题的机制(也可实现进程通信),包括一个称为信号量的变量及对它进行的两个原语操作.信号量为一个整数,我们设这个信号量为:sem.很显然,我们规定在sem大于等于 ...

  3. python中二进制文件_Python学习基础篇 -6: Python中的文件操作

    前言:本专栏以Python为主题,并尽可能保持每星期两到三更,直到将Python的基础知识浅析和讲解完毕,同时,有一定基础的同学可以移步 Python实战专栏 . 文件有有什么用 文件可以看作一个仓库 ...

  4. Python中的字符串操作总结(Python3.6.1版本)

    Python中的字符串操作(Python3.6.1版本) (1)切片操作: str1="hello world!" str1[1:3] <=> 'el'(左闭右开:即是 ...

  5. python中文件操作中不同的文件操作有何差异_Python学习基础篇 -6: Python中的文件操作...

    前言:本专栏以Python为主题,并尽可能保持每星期两到三更,直到将Python的基础知识浅析和讲解完毕,同时,有一定基础的同学可以移步 Python实战专栏 .文件有有什么用 文件可以看作一个仓库, ...

  6. Python中的文件操作和异常

    Python中的文件操作和异常 文章目录 Python中的文件操作和异常 一.文件 01. 文件的概念 1.1 文件的概念和作用 1.2 文件的存储方式 文本文件和二进制文件 02. 文件的基本操作 ...

  7. Python中的序列操作

    Python中的序列操作 分类: python undefined 官方手册:https://docs.python.org/3.7/library/stdtypes.html#sequence-ty ...

  8. python36_第36 p,就这几个方法,Python中文件的操作

    大家好,我是杨数Tos,这是<从零基础到大神>系列课程的第X篇文章,第二阶段的课程:Python基础知识:Python中文件的操作(下篇). 学习本课程,建议先看一遍:[计算机基础知识]课 ...

  9. python中numpy矩阵运算操作大全(非常全)!

    python中numpy矩阵运算操作大全(非常全) //2019.07.10晚 python矩阵运算大全 1.矩阵的输出形式: 对于任何一个矩阵,python输出的模板是: import numpy ...

最新文章

  1. 【硅谷牛仔】当代钢铁侠-特斯拉CEO 埃隆·马斯克
  2. CentOS系统设置开机自启动
  3. AI:2020年6月22日北京智源大会演讲分享之认知神经基础专题论坛——13:40-14:20毕彦超教授《Knowledge representation in the Human brain》
  4. [蓝桥杯][2017年第八届真题]拉马车(String)
  5. arguments 类数组
  6. makefile 生成.o_要学好 C 语言 / C++ ,Makefile 可少不了
  7. [分享]iOS 5.0.1 桌面出现 四个白图标 的解决办法!AdSheet FieldTest iOS Diagnostics 设置。...
  8. Ubuntu开机慢_开机计时1分30秒_A start job is running for dev-disk-by...
  9. pytorch 查看编号_最完整的PyTorch数据科学家指南(2)
  10. 内网群PING的shell
  11. 王阳明:能攻心反侧自消
  12. 用styler更改样式后,解决数据框中数据无法保留四位小数
  13. UEBA案例分析系列之数据泄露检测
  14. BSV上的高效 zk-SNARK:技术解释
  15. 21条最佳实践,全面保障 GitHub 使用安全
  16. 区块链资产投资指南及技巧
  17. EC-PCA: 利润中心主数据维护流程
  18. Sdwan关于工业控制组网
  19. 【软件定义汽车】【其他篇】ASPICE--V模型软件开发
  20. Python入门(安装)——第一个爬虫程序(爬取山东各城市天气信息)

热门文章

  1. 天猫直通车的相关定义
  2. 创建微服务架构的步骤_如何快速搭建一个微服务架构?
  3. Spring boot集成RabbitMQ
  4. JVM 垃圾回收简介
  5. 八大排序算法--堆排序
  6. 我学会了用计算机作文,我学会了电脑作文
  7. 【bzoj3653】谈笑风生
  8. (初阶版本)扫雷游戏(C语言)娱乐教程
  9. 学习线性代数-行列式 笔记(一)
  10. linux命令tcp和tt,Linux中tcpdump命令起什么作用呢?