当前位置: 首页 > news >正文

操作系统(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++;  // 更新计数器

}

  1. 等待:如果缓冲区已满(counter == BUFFER_SIZE),生产者会等待。
  1. 添加项:当有空间时,生产者会把新的项添加到缓冲区中,并更新缓冲区索引 in,这个索引是一个环形缓冲区的实现,防止数组越界。
  2. 计数器递增:生产者成功添加项后,计数器 counter 自增。

消费者(Consumer)逻辑:

while (true) {

    // 当缓冲区为空时,消费者等待

    while (counter == 0) ; /* do nothing */

    // 从缓冲区中取出项

    consumed = buffer[out];

    out = (out + 1) % BUFFER_SIZE;  // 环形缓冲区的实现

    counter--;  // 更新计数器

    // 消费该项

}

  1. 等待:如果缓冲区为空(counter == 0),消费者会等待。
  2. 取出项:当有项可以消费时,消费者从缓冲区中取出项,并更新缓冲区索引 out。
  3. 计数器递减:消费者成功取出项后,计数器 counter 自减。

5. 临界区Critical Section

临界区定义:

  • 临界区(Critical Section)是进程中一段需要访问共享资源的代码,这段代码不能与其他进程同时执行。
  • 假设有 n 个进程 P0,P1,...,Pn−1P0, P1, ..., Pn-1P0,P1,...,Pn−1,每个进程都有一段代码被称为“临界区”。
  • 进程在临界区中会修改共享变量、更新表格、写入文件等。当一个进程在执行临界区代码时,其他进程不能进入它们的临界区。

临界区的典型流程如下:

  1. 进入临界区前,检查或同步机制。
  2. 在临界区内执行共享资源相关操作。
  3. 退出临界区,允许其他进程进入。

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. 临界区问题&#xf…...

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、业务中有延时任务的需要 比如说&#xff0…...

PHP微信小程序共享充电桩系统设计与实现计算机毕业设计源代码作品和开题报告

博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…...

【网络面试篇】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安装包。 服务器安装依赖包…...

2026届毕业生推荐的十大降重复率助手实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 人工智能技术于学术写作领域的运用愈发广泛,其助力论文撰写的本领已获实证&#…...

PPTist:重新定义在线演示文稿创作体验

PPTist:重新定义在线演示文稿创作体验 【免费下载链接】PPTist PowerPoint-ist(/pauəpɔintist/), An online presentation application that replicates most of the commonly used features of MS PowerPoint, allowing for the editing a…...

LeetCode 热题100——49.字母异位词分组

题目:给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。示例 1:输入: strs ["eat", "tea", "tan", "ate", "nat", "bat"]输出: [["bat"],["…...

抖音批量下载工具高效应用全攻略:从单视频到批量采集的完整指南

抖音批量下载工具高效应用全攻略:从单视频到批量采集的完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallb…...

告别鼠标!用Vim打造你的极速编程工作流(含常用脚本编辑配置)

用Vim打造无鼠标编程工作流:从入门到精通的完整指南 作为一名开发者,你是否厌倦了在键盘和鼠标之间来回切换的低效操作?Vim这款诞生于1991年的文本编辑器,凭借其独特的模态编辑理念和全键盘操作方式,至今仍是提升编程…...

SIM4LIFE Light保姆级教程:手把手搞定第一个人体SAR值仿真(附FDTD模块避坑指南)

SIM4LIFE Light保姆级教程:手把手搞定第一个人体SAR值仿真(附FDTD模块避坑指南) 电磁场仿真在生物医学工程领域扮演着越来越重要的角色,而SIM4LIFE Light作为一款专为人体组织电磁特性研究设计的仿真软件,凭借其内置的…...

SEO_快速见效的站内SEO优化检查清单与方法

SEO:快速见效的站内SEO优化检查清单与方法 在当今竞争激烈的互联网市场中,快速见效的站内SEO优化尤为重要。无论你是新站点的创建者,还是老站点的运营者,站内SEO优化都能帮助提升网站的搜索引擎排名,吸引更多访客。本文将带你了解…...

“AI人工智能+”政务一网通办多智能体协同建设方案:五层两体系总体架构、数据与安全体系、信创适配与实施运维

该方案是一份成熟的技术蓝图,它不仅仅是将AI简单叠加到政务系统,而是通过“多智能体协同”重构了业务组织逻辑。方案详细定义了从语料治理、模型微调、Agent协作、信创适配到安全合规的全链路工程细节,具有极强的实操性与前瞻性,适…...

5步构建专业视频工作流:OBS虚拟摄像头在macOS上的全面应用

5步构建专业视频工作流:OBS虚拟摄像头在macOS上的全面应用 【免费下载链接】obs-mac-virtualcam ARCHIVED! This plugin is officially a part of OBS as of version 26.1. See note below for info on upgrading. 🎉🎉🎉Creates …...

解决Swagger2集成中v2/api-docs接口404问题的关键:正确配置Docket分组

1. 为什么访问v2/api-docs会返回404? 这个问题困扰过不少开发者。当你兴冲冲地集成完Swagger2,打开swagger-ui.html页面,却发现页面一片空白,控制台报错显示v2/api-docs接口返回404。更让人抓狂的是,单独访问这个接口时…...