操作系统-PV

🧠 背景:为什么会有 PV?

类比:内存(生产者) 和 CPU(消费者)

  • 内存 / IO / 磁盘 / 网络下载 → 不断“生产数据”

    • 例如:读取文件、下载视频、从数据库加载信息

  • CPU → 负责“消费数据”

    • 例如:处理数据、解码、渲染画面、计算结果

👉 由于生产和消费速度可能存在差异(如内存大、CPU处理慢),需要一个缓冲区(如缓存、队列)进行协调。

🔧 三个基本模板

1. 信号量

  • 定义:表示当前可用资源的个数。

2. 同步:控制先后顺序

  • 核心:信号量初始设为 0;V 操作释放信号量,进程 B 才能有资源继续执行。

  • 问题:如果信号量初始值为 0,进程 A 和进程 B 都会被阻塞吗?

    • 回答:是的,这样可以保证进程 A 和 B 的先后顺序。

3. 互斥:保证一个进程对资源的访问

  • 核心:使用 PV 操作夹住临界区(临界资源存放点)。

进程A;                 mutex=1
P(互斥信号量);        mutex--;   0;
临界区;                
V(互斥信号量)          mutex++;   1;进程B;               
P(互斥信号量);      
临界区;                
V(互斥信号量)       

🏭 生产者-消费者模型

full 是什么意思?

  • 定义:在生产者-消费者模型中,full 是一个信号量,用来表示当前缓冲区中“已经存了多少个产品”,也可以理解为“可供消费者消费的数据数量”。

mutex 是什么?

  • 定义mutex 是 mutual exclusion(互斥)的缩写,表示一次只允许一个线程/进程访问共享资源。用于保护临界区。

🔄 同步与互斥关系

同步关系

  1. 生产者先生产出一个产品V(full),消费者才能消费一个产品 → P(full)

  2. 消费者从缓冲区取来产品V(empty),释放一个空位,生产者才能继续生产 → P(empty)

互斥关系

  • 使用 P(mutex) 加锁缓冲区,V(mutex) 释放缓冲区,确保缓冲区的互斥访问。

❓ 常见问题解答

问题:缓冲区初始为空,empty = n(如 10 个空位),为什么还需要等待消费者“消费”后产生空位?不是一开始就很多空位了吗?

  • 答案

    • ✅ 一开始当然不需要等消费者,可以直接放数据进去!

    • 🛑 但如果生产得太快,把缓冲区塞满了(empty == 0),就必须等消费者先消费一个产品(释放一个空位)才能继续生产。

🧑‍💻 生产者代码解释

  1. 生产:在自己线程内处理好数据(不影响别人)。

  2. P(empty):检查是否有空位(资源控制)。

  3. P(mutex):进入缓冲区前加锁(互斥控制)。

  4. 放入缓冲区

  5. V(mutex):解锁。

  6. V(full):通知消费者“有东西可以用了”。

👩‍💻 消费者代码解释

  1. P(full):等待是否有产品可取。

  2. P(mutex):加锁,准备访问缓冲区。

  3. 取产品:真正的“消费”动作。

  4. V(mutex):解锁。

  5. V(empty):通知生产者释放了一个空位。

  6. 消费:转到自己的线程输出数据。

读者-写者(互斥)

📖 读者-写者问题(互斥)

问题:为什么 mutex 需要夹住 count,不是允许多个读者同时读吗?

  • 回答:是的,多个读者可以同时读,但是 count 是一个“全局变量”,多个线程同时修改它会出问题,所以必须用 mutex 来保护它!

🔄 同步与互斥关系

同步关系

  • 读者读完后,解锁并将 count--。当 count 为 0 时,表示最后一个读者离开,此时写者可以开始写。

  • 简单来说:第一个读者来关写者的门,最后一个读者来开写者的门。

互斥关系:

互斥关系

  • count 的初始值为 0,表示没有读者在读。

  • 如果有写者正在写,rw = 0,读者会被阻塞,等待写者写完。

  • 如果没有写者写,rw = 1,第一个读者执行 P(rw),然后继续执行。

❓ 常见问题解答

问题:如果第一个读者还没执行到 V(mutex),第二个读者就进来了,会怎么样?第二个还能继续吗?

  • 答案

    • ❌ 第二个读者进不来,它会被阻塞在 P(mutex) 这里,直到第一个读者执行 V(mutex),它才能继续往下执行。

    • ❗ 虽然读者可以“同时读”,但它们更新计数器 count 时一定是串行的、有序的、安全的!

相对写优先(有限)

设置P(w)V(w):

1:当读进程先来时候,执行P(W),W=0,写进程堵塞,只有当读进程释放了,写进程才能进来。

2:当写进程先来时候,执行P(W),W=0,读进程堵塞,只有当写进程释放了,读进程才能进来。

哲学家用餐(都会有几率导致死锁)

限制n-1哲学家就餐

使用信号量(semaphore count=4)限制同时就餐的哲学家数量为4个,理论上想避免所有5个哲学家同时拿筷子。但如果4个哲学家分别拿了一根筷子(例如,0号拿0筷子,1号拿1筷子,依此类推),第5个哲学家无法进入就餐,而已进入的4个哲学家仍在等待另一根筷子,依然会死锁。

仅当左右筷子可用时候,才会吃饭。

使用mutex紧紧夹住拿筷子的动作

每个哲学家都先试图拿左筷子(P(chopsticks[i])),再拿右筷子(P(chopsticks[(i+1)%5]))。如果所有哲学家同时拿左筷子,就会形成循环等待(每个人都拿着一根筷子,等待另一根),导致死锁。

奇数号先拿左筷子。偶数号拿右筷子

哲学家编号为:1 ~ 5,筷子编号也为 1 ~ 5

每位哲学家要吃饭,必须拿 左手边和右手边的筷子

  • 哲学家 i 的左手筷子编号:i

  • 哲学家 i 的右手筷子编号: (i % 5) + 1

这里试图通过让一个哲学家(if(i%2==0))先拿左筷子,其他人先拿右筷子来打破对称性。但如果所有哲学家同时进入循环,依然可能出现循环等待。例如,编号为偶数的哲学家拿左筷子,编号为奇数的拿右筷子,最终还是会形成死锁。

ChatGPT链接:https://chatgpt.com/share/680274c9-faec-800c-8a90-253e36512386

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工厂方法模式详解及在自动驾驶场景代码示例(c++代码实现)

模式定义 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,通过定义抽象工厂接口将对象创建过程延迟到子类实现,实现对象创建与使用的解耦。该模式特别适合需要动态扩展产品类型的场景。 自动驾驶感知场景分析 自动驾…

基于 S2SH 架构的企业车辆管理系统:设计、实现与应用

在企业运营中,车辆管理是一项重要工作。随着企业规模的扩大,车辆数量增多,传统管理方式效率低下,难以满足企业需求。本文介绍的基于 S2SH 的企业车辆管理系统,借助现代化计算机技术,实现车辆、驾驶员和出车…

IntelliJ IDEA download JDK

IntelliJ IDEA download JDK 自动下载各个版本JDK,步骤 File - Project Structure (快捷键 Ctrl Shift Alt S) 如果下载失败,换个下载站点吧。一般选择Oracle版本,因为java被Oracle收购了 好了。 花里胡哨&#…

MCP协议在纳米材料领域的深度应用:从跨尺度协同到智能研发范式重构

MCP协议在纳米材料领域的深度应用:从跨尺度协同到智能研发范式重构 文章目录 MCP协议在纳米材料领域的深度应用:从跨尺度协同到智能研发范式重构一、MCP协议的技术演进与纳米材料研究的适配性分析1.1 MCP协议的核心架构升级1.2 纳米材料研发的核心挑战与…

OpenAI发布GPT-4.1:开发者专属模型的深度解析 [特殊字符]

最近OpenAI发布了GPT-4.1模型,却让不少人感到困惑。今天我们就来深入剖析这个新模型的关键信息! 重要前提:API专属模型 💻 首先需要明确的是,GPT-4.1仅通过API提供,不会出现在聊天界面中。这是因为该模型主…

DemoGen:用于数据高效视觉运动策略学习的合成演示生成

25年2月来自清华、上海姚期智研究院和上海AI实验室的论文“DemoGen: Synthetic Demonstration Generation for Data-Efficient Visuomotor Policy Learning”。 视觉运动策略在机器人操控中展现出巨大潜力,但通常需要大量人工采集的数据才能有效执行。驱动高数据需…

界面控件DevExpress WPF v25.1新功能预览 - 文档处理类功能升级

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

Muduo网络库实现 [十六] - HttpServer模块

目录 设计思路 类的设计 模块的实现 公有接口 私有接口 疑问点 设计思路 本模块就是设计一个HttpServer模块,提供便携的搭建http协议的服务器的方法。那么这个模块需要如何设计呢? 这还需要从Http请求说起。 首先从http请求的请求行开始分析&…

多模态记忆融合:基于LSTM的连续场景生成——突破AI视频生成长度限制

一、技术背景与核心挑战 2025年视频生成领域面临的关键难题是长时程连贯性——传统方法在生成超过5分钟视频时会出现场景跳变、物理规则不一致等问题。本研究提出时空记忆融合架构(ST-MFA),通过LSTM记忆门控与多模态对齐技术,在R…

LabVIEW油气井井下集成监测系统

LabVIEW平台开发的油气井井下集成监测系统通过实时监控油气井的井下环境参数,如温度、压力和有害气体含量,有效提高了油气采收率并确保了作业安全。系统利用高精度传感器和强大的数据处理能力,通过综合监测和分析,实现了对油气井环…

【python画图】:从入门到精通绘制完美柱状图

目录 Python数据可视化:从入门到精通绘制完美柱状图一、基础篇:快速绘制柱状图1.1 使用Matplotlib基础绘制1.2 使用Pandas快速绘图 二、进阶篇:专业级柱状图定制2.1 多系列柱状图2.2 堆叠柱状图2.3 水平柱状图 三、专业参数速查表Matplotlib …

【 解决Cline插件无法激活及DeepSeek模型请求卡顿或者无法加载问题】

解决Cline插件无法激活及DeepSeek模型请求卡顿问题 问题描述 在VSCode中使用Cline插件时遇到以下问题: 插件长时间卡在"activating"激活状态成功激活后发起DeepSeek对话时,API请求阶段持续卡顿夜间时段问题出现频率较低 环境信息 Cline版…

聊透多线程编程-线程互斥与同步-9.C# 线程互斥实现方式

目录 1. 锁机制 (Locking Mechanisms) (1) lock 关键字 (2) Monitor 类 2. 跨进程互斥机制 3. 信号量机制 (1) Semaphore 和 SemaphoreSlim 4. 读写锁机制 (1) ReaderWriterLockSlim 5. 原子操作机制 (1) Interlocked 类 6. 自旋锁机制 (1) SpinLock 线程互斥是一种…

eNSP无法启动AR报错码40,而且按照eNSP帮助手册排查都没用,我的处理方法【自己存档版】

问题: 已经尝试过eNSP的帮助手册,发现都没用! eNSP启动AR设备报错码40且常规排查无效时,可尝试以下解决方案(按优先级排序): 1. 关闭Hyper-V和Windows沙盒(我是这个问题&#xff0…

秒杀系统解决两个核心问题的思路方法总结:1.库存超卖问题;2.用户重复抢购问题。

秒杀系统解决两个核心问题 秒杀系统解决两个核心问题:一、解决库存超卖的核心逻辑:解释:原子性保证: 二、如何避免重复抢购:使用 Redis 做唯一标识判断优点: 三、流程完整梳理:四、通过数据库建…

【集成电路版图设计学习笔记】3.基本电路元件(MOS,电容,电阻)

一、MOSFET 在版图设计中,要定义一个mosfet,最关键的层次是polysilicon(多晶硅)和active(有源区)。用有源区定义了一个矩形的区域,在这个区域内才可以形成一个有源器件,然后再用多晶…

蓝桥杯之差分题型

一维差分 问题描述 给定一个长度为 nn 的序列 aa。 再给定 mm 组操作,每次操作给定 33 个正整数 l,r,dl,r,d,表示对 al∼ral∼r​ 中的所有数增加 dd。 最终输出操作结束后的序列 aa。 Update:由于评测机过快,n,mn,m 于 2024…

深入剖析 C/S 与 B/S 架构及网络通信基础

目录 C/S 架构详解​ 概念与示例​ 优点​ B/S 架构详解​ 概念与示例​ 优势​ 缺点​ C/S 与 B/S 的区别​ 架构组成​ 使用场景​ 开发和维护​ 安全性​ 网络通信基础​ IP 地址​ MAC(物理地址)​ 端口​ 路由器​ 网关​ 子网掩…

常见免杀框架的使用(3款)---【AniYaGUI1.2.0、AV_Evasion_Tool掩日、FoxBypass_V1.0】

一、AniYaGUI1.2.0免杀框架 环境:虚拟机Win10 、云服务器 工具:Xshell、CobaltStrike 项目下载地址: https://github.com/piiperxyz/AniYa 1. 安装Go语言环境 确保Win10虚拟机安装 Golang 且环境变量中包含 go 否则⽆法编译(注…

Apache HTTPD 换行解析漏洞

漏洞介绍 CVE-2017-15715 Apache HTTPD 是一个广泛使用的 HTTP 服务器,可以通过 mod_php 模块来运行 PHP 网页。在其 2.4.0 到 2.4.29 版本中存在一个解析漏洞,当文件名以 1.php\x0A 结尾时,该文件会被按照 PHP 文件进行解析,这…