操作系统(9) (并发-----原子性/互斥临界区/生产者消费者问题/临界区问题三条件/互斥性/进展性/公平性)
目录
1. 并发(Concurrency)的定义
2. 原子性(Atomicity)
3. 互斥(Mutual Exclusion)
4. 生产者-消费者问题(Producer-Consumer Problem)
5. 临界区Critical Section
6. 临界区问题(Critical Section Problem)及其解决方案三个条件:
\
1. 并发(Concurrency)的定义
- 并发是指多个指令序列(multiple instruction sequences)同时执行(at the same time)。这可以通过多进程(multiple processes)或者多线程(multiple threads)来实现。
- 这种情况通常出现在操作系统中,当有多个进程/线程运行时,它们可能会并行运行(parallel execution)或者并发执行(concurrent execution)。
- 进程/线程(Processes/Threads)通过共享内存(shared memory)或消息传递(message passing)进行通信,也可以共享资源,如设备(devices)、变量(variables)和数据结构(data structures)等。
2. 原子性(Atomicity)
- 原子性指的是一段操作必须是不可分割的,不能在中途被其他操作打断或看到其中间状态。这段代码要么完全执行,要么完全不执行,没有部分完成的状态。
- 举例:如果一个操作是原子的,那么即使多个进程或线程并发执行,这段代码也不会被其他进程或线程“看见”部分执行的结果。比如硬件提供的原子操作(如test_and_set)就是这样,即使在多核系统中,这种操作也是不可中断的。
3. 互斥(Mutual Exclusion)
- 互斥是针对临界区的,它确保在同一时间只能有一个进程或线程进入临界区(critical section),其他进程或线程必须等待直到当前进程离开临界区。这可以防止多个线程或进程同时修改共享资源,从而避免数据不一致的问题。
- 互斥通过某种同步机制来确保只有一个线程能进入临界区,比如使用锁(mutex),或者使用Peterson's solution这种软件实现。
- 举例:在多线程程序中,若两个线程需要修改共享变量counter,互斥确保只有一个线程可以在某个时刻进入临界区并修改counter,另一个线程必须等待。
4. 生产者-消费者问题(Producer-Consumer Problem)
生产者和消费者共享一个有限大小的缓冲区,生产者负责往缓冲区中添加项,消费者则从缓冲区中取出项。这个问题的挑战在于如何保证生产者和消费者在不发生冲突的情况下操作同一个缓冲区。
主要概念:
- 有界缓冲区(Bounded Buffer):缓冲区中最多可以存放 N 个项。
- 计数器(Counter):用于记录当前缓冲区中存放的项的数量。
- 当生产者添加项时,计数器增加。
- 当消费者取出项时,计数器减少。
并发问题:
和其他并发计算一样,生产者和消费者可能会因为共享资源(缓冲区)和计数器而产生竞争条件(Race Condition)。这可能导致缓冲区溢出或消费者读取空缓冲区等问题。
代码说明:
生产者(Producer)逻辑:
while (true) { // 当缓冲区满时,生产者等待 while (counter == BUFFER_SIZE) ; /* do nothing */ // 有空间时,生产者添加新项 buffer[in] = new_item; in = (in + 1) % BUFFER_SIZE; // 环形缓冲区的实现 counter++; // 更新计数器 } |
- 等待:如果缓冲区已满(counter == BUFFER_SIZE),生产者会等待。
- 添加项:当有空间时,生产者会把新的项添加到缓冲区中,并更新缓冲区索引 in,这个索引是一个环形缓冲区的实现,防止数组越界。
- 计数器递增:生产者成功添加项后,计数器 counter 自增。
消费者(Consumer)逻辑:
while (true) { // 当缓冲区为空时,消费者等待 while (counter == 0) ; /* do nothing */ // 从缓冲区中取出项 consumed = buffer[out]; out = (out + 1) % BUFFER_SIZE; // 环形缓冲区的实现 counter--; // 更新计数器 // 消费该项 } |
- 等待:如果缓冲区为空(counter == 0),消费者会等待。
- 取出项:当有项可以消费时,消费者从缓冲区中取出项,并更新缓冲区索引 out。
- 计数器递减:消费者成功取出项后,计数器 counter 自减。
5. 临界区Critical Section
临界区定义:
- 临界区(Critical Section)是进程中一段需要访问共享资源的代码,这段代码不能与其他进程同时执行。
- 假设有 n 个进程 P0,P1,...,Pn−1P0, P1, ..., Pn-1P0,P1,...,Pn−1,每个进程都有一段代码被称为“临界区”。
- 进程在临界区中会修改共享变量、更新表格、写入文件等。当一个进程在执行临界区代码时,其他进程不能进入它们的临界区。
临界区的典型流程如下:
- 进入临界区前,检查或同步机制。
- 在临界区内执行共享资源相关操作。
- 退出临界区,允许其他进程进入。
6. 临界区问题(Critical Section Problem)及其解决方案三个条件:
1. 互斥性(Mutual Exclusion):
- 共享厨房中的某些资源(如炉灶或冰箱)一次只能被一个学生使用。如果两个学生同时尝试使用同一个资源,可能会导致混乱、冲突,甚至事故。因此,必须确保同一时间只有一个人可以使用这些资源。
- 这种情况类似于临界区中的互斥条件:当一个进程在访问共享资源时,其他进程必须被阻止,直到该进程完成操作。
2. 进展性(Progress):
- 如果厨房空闲且有学生想要使用厨房,那么那些已经准备好烹饪的学生应该能够进入厨房,开始使用资源。决定谁可以进入厨房应该基于学生的实际准备情况,而不是随机因素。
- 这对应着进展条件:当没有进程在临界区内时,进程应该能够及时进入,而不应该被其他不相关的进程或因素阻挡。
3. 公平性/有界等待(Fairness/Bounded Waiting):
- 如果有学生正在等待使用炉灶,应该有一个限制,确保这个学生不会无限期等待,直到所有其他学生完成烹饪。这样可以确保每个学生都有公平的机会,不会因为过多的等待而导致无法使用资源。
- 这与有界等待条件相似:每个进程在请求进入临界区后,应该有一个限制,确保它最终可以进入,而不会无限期等待。
相关文章:

操作系统(9) (并发-----原子性/互斥临界区/生产者消费者问题/临界区问题三条件/互斥性/进展性/公平性)
目录 1. 并发(Concurrency)的定义 2. 原子性(Atomicity) 3. 互斥(Mutual Exclusion) 4. 生产者-消费者问题(Producer-Consumer Problem) 5. 临界区Critical Section 6. 临界区问题…...

Django响应
HTTPResponse: 是由Django创造的, 他的返回格式为 HTTPResponse(content响应体,content_type响应体数据类型,status状态码), 可以修改返回的数据类型,适用于返回图片,视频,音频等二进…...

算法:图的相关算法
图的相关算法 1. 图的遍历算法1.1 深度优先搜索1.2 广度优先搜索 2. 最小生成树求解算法普里姆(Prim)算法克鲁斯卡尔(Kruskal)算法 3. 拓扑排序4. 最短路径算法 1. 图的遍历算法 图的遍历是指从某个顶点出发,沿着某条搜索路径对图中的所有顶点进行访问且只访问次的…...

django的models使用介绍。
from django.db import modelsfrom utils.models import CommonModel# Create your models here. class User(CommonModel):#用户数据模型username models.CharField(用户名,max_length32, uniqueTrue)password models.CharField(密码,max_length256)nickname models.CharFi…...

【分布式技术】分布式事务深入理解
文章目录 概述产生原因关键点 分布式事务解决方案3PC3PC的三个阶段:3PC相比于2PC的改进:3PC的缺点: TCCTCC事务的三个阶段:TCC事务的设计原则:TCC事务的适用场景:TCC事务的优缺点:如何解决TCC模…...

力扣hot100-->hash表/map
hash表/map 1. 1. 两数之和 简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 …...

基于redis实现延迟队列
Redis实现延时队列 延时队列里装的主要是延时任务,用延时队列来维护延时任务的执行时间。 1、延时队列有哪些使用情景? 1、如果请求加锁没加成功 可以将这个请求扔到延时队列里,延后处理。 2、业务中有延时任务的需要 比如说࿰…...

PHP微信小程序共享充电桩系统设计与实现计算机毕业设计源代码作品和开题报告
博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。 所有项目都配有从入门到精通的基础知识视频课程ÿ…...

【网络面试篇】TCP与UDP类
目录 一、综述 1. TCP与UDP的概念 2. 特点 3. 区别 4. 对应的使用场景 二、补充 1. 基础概念 (1)面向连接 (2)可靠的 (3)字节流 2. 相关问题 (1)TCP 和 UDP 可以同时绑定…...

Windows转Mac过渡指南
最近由于工作原因开始使用mac电脑,说实话刚拿到手的时候,window党表示真的用不惯。坚持用一下午之后,发现真的yyds,这篇文章说说mac电脑的基本入门指南。 1. 不会使用mac的触摸板,接上鼠标发现滚轮和windows是反的。 …...

LeetCode100之盛最多水的容器(11)--Java
1.问题描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量 注意 你不能倾斜容器 示例1 输入&…...

【VMware】使用笔记
一、安装 win11支持16.2以上版本,其他版本不兼容 安装参考: 二、设置 1、蓝屏设置 参考:win11打开VMware虚拟机蓝屏解决_win11vmware蓝屏-CSDN博客 2、VMwareTool配置 第一步:移除“open-vm-tools” sudo apt-get autoremo…...

<项目代码>YOLOv8 猫狗识别<目标检测>
YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…...

存储数据库的传输效率提升-ETLCloud结合HBASE
一、大数据存储数据库–HBASE HBase,作为一个开源的分布式列存储数据库,基于Google的Bigtable设计而成,专为处理大规模结构化数据而优化。使用HBase打造大数据解决方案的好处主要包括:高可扩展性,能够处理PB级的数据&…...

HO-XGBoost河马算法优化极限梯度提升树多变量回归预测(Matlab)
HO-XGBoost河马算法优化极限梯度提升树多变量回归预测(Matlab) 目录 HO-XGBoost河马算法优化极限梯度提升树多变量回归预测(Matlab)预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现HO-XGBoost多变量回归预测&…...

【Hive sql面试题】找出连续活跃3天及以上的用户
表数据如下: 要求:求出连续活跃三天及以上的用户 建表语句和插入数据如下: create table t_useractive(uid string,dt string );insert into t_useractive values(A,2023-10-01 10:10:20),(A,2023-10-02 10:10:20),(A,2023-10-03 10:16…...

Linux curl命令下载显示时间/速度/大小
命令: curl -# -O --compressed -w "大小: %{size_download} bytes\n时间: %{time_total} seconds\n速度: %{speed_download} B/s\n" 下载URL链接。 例子: curl -# -O --compressed -w "大小: %{size_download} bytes\n时间: %{time_to…...

sklearn|机器学习:决策树(一)
文章目录 sklearn|机器学习:决策树(一)(一)概述(二)实战1. 环境配置2. sklearn 中的决策树(1)模块 sklearn.tree(2)sklearn 基本建模流…...

Rust中三种方式使用环境变量
环境变量是存储在操作系统中的一组键值对。它们用于存储系统和其他应用程序所需的配置信息。本文我们将探索如何在Rust中使用标准库以及dotenv crate来处理环境变量。 环境变量 环境变量提供了一种灵活的方式来配置应用程序,而无需直接在源代码中硬编码配置值。这…...

搭建支持国密GmSSL的Nginx环境
准备 1、服务器准备:本文搭建使用的服务器是CentOS 7.6 2、安装包准备:需要GmSSL、国密Nginx,可通过互联网下载或者从 https://download.csdn.net/download/m0_46665077/89936158 下载国密GmSSL安装包和国密Nginx安装包。 服务器安装依赖包…...

Docker部署Portainer CE结合内网穿透实现容器的可视化管理与远程访问
文章目录 前言1. 本地安装Docker2. 本地部署Portainer CE3. 公网远程访问本地Portainer-CE3.1 内网穿透工具安装3.2 创建远程连接公网地址4. 固定Portainer CE公网地址前言 本篇文章介绍如何在Ubuntu中使用docker本地部署Portainer CE可视化管理工具,并结合cpolar实现公网远程…...

不适合的学习方法
文章目录 不适合的学习方法1. 纯粹死记硬背2. 过度依赖单一资料3. 线性学习4. 被动学习5. 一次性学习6. 忽视实践7. 缺乏目标导向8. 过度依赖技术9. 忽视个人学习风格10. 过于频繁的切换 结论 以下是关于不适合的学习方法的更详细描述,包括额外的内容和相关公式&…...

在子类中调用父类的构造函数
在Java中调用父类构造函数 使用super()关键字:在子类的构造函数中,可以使用super()来调用父类的构造函数。如果父类有默认构造函数(即没有参数的构造函数),并且子类的构造函数没有显式调用super(),Java编译…...

【K8S系列】Kubernetes 中 Service 的流量不均匀问题【已解决】
在 Kubernetes 中,Service 是一种抽象,用于定义一组 Pod 的访问策略。当某些 Pod 接收的流量过多,而其他 Pod 的流量较少时,可能会导致负载不均衡。这种情况不仅影响性能,还可能导致某些 Pod 过载,影响应用…...

C-小H学生物
题意:一棵树节点编号为1具有n种不同物种的演化树上。物种i将遗传信息向下传递到物种j会产生dij的遍历。dij是一个长为l的01串。变异程度duv为u到v简单路径上的所有编译信息的异或和。基因多样性定义为 分析:计算Di的遗传信息,用dfs将遗传信息…...

什么是软件设计模式, 它们⽤于解决什么问题, 它们为什么有效
什么是设计模式 软件设计模式是指在软件设计过程中,经过验证的、可复⽤的、对特定 场景下常⻅问题的解决⽅案的⼀种描述或模板。这些模式并不是具体的 代码,⽽是⽤于指导如何组织代码、类和对象,以便更好地解决问题和 满⾜需求。 ⽤于解决的…...

LeetCode 3165.不包含相邻元素的子序列的最大和:单点修改的线段树(动态规划)
【LetMeFly】3165.不包含相邻元素的子序列的最大和:单点修改的线段树(动态规划) 力扣题目链接:https://leetcode.cn/problems/maximum-sum-of-subsequence-with-non-adjacent-elements/ 给你一个整数数组 nums 和一个二维数组 q…...

ios 快捷指令扩展(Intents Extension)简单使用 swift语言
本文介绍使用Xcode15 建立快捷指令的Extension,并描述如何修改快捷指令的IntentHandler,带参数跳转主应用;以及展示多个选项的快捷指令弹框(配置intentdefinition文件),点击选项带参数跳到主应用的方法 创建快捷指令 快捷指令是…...

虚拟化环境中的精简版 Android 操作系统 Microdroid
随着移动设备的普及和应用场景的多样化,安全性和隐私保护成为了移动操作系统的重要课题。Google推出的Microdroid,是一个专为虚拟化环境设计的精简版Android操作系统,旨在提供一个安全、隔离的执行环境。本文将详细介绍Microdroid的架构、功能…...

NFTScan Site:以蓝标认证与高级项目管理功能赋能 NFT 项目
自 NFTScan Site 上线以来,它迅速成为 NFT 市场中的一支重要力量,凭借对各类 NFT 集合、市场以及 NFTfi 项目的认证获得了广泛认可。这个平台帮助许多项目提升了曝光度和可见性,为它们在竞争激烈的 NFT 市场中创造了更大的成功机会。 在最新更…...