操作系统(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安装包。 服务器安装依赖包…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
