临界区的并发控制

FreeRTOS临界区与开关中断:解决STM32串口数据丢失的并发控制实战 在实时操作系统(RTOS)中,多任务并发访问共享资源(如全局变量、缓冲区)会引发资源竞争问题,导致数据不一致或丢失。临界区通过开关中断实现原子操作,确保关键代码段不被任务切换或中断打断,是保障数据一致性的核心技术。其原理在于关闭系统节拍定时器中断和上下文切换中断,从而阻止调度器工作。这项技术的核心价值在于为嵌入式系统提供轻量级、高效的并发控制手段,尤其适用于中断服务程序(ISR)与任务间的数据交换、简单共享变量的原子操作等场景。例如,在STM32的串口通信中,DMA接收中断与数据解析任务共享环形缓冲区时,必 阅读详情
一、并发与竞态
      并发指多个执行单元同时、并行被执行,而并发的执行单元对共享资源(全局变量,静态变量)的访问则容易导致竞态。
     几种情景:1、对称多处理器(SMP)的多个CPU
     2、单个CPU进程与抢占它的进程
 3、中断与进程之间
   访问共享资源区的代码区域称为临界区(critical sections).对临界区的保护方法:中断屏蔽,原子操作,自旋锁和信号量等途径。

二、中断屏蔽
    对单个CPU可采用的一种简单方法。
      local_irq_disable(); //关中断
      。。。。。
     critical sections //临界区
      。。。。。
     local_irq_enable();//开中断

三、原子操作

    Linux内核提供了一系列的函数来实现内核中的原子操作,分为针对位和整型变量进行原子操作,都依赖底层CPU的原子操作来实现。

四、自旋锁
   spin lock是一种对临界区进行互斥访问的典型手段。为获得一个自旋锁,在某CPU上运行的代码需先执行一个原子操作,该操作测试并设置某个内存变量,由于它是原子操作,所以在该操作完成之前其他执行单元无法访问该内存变量。如果测试结果表明锁已经空闲,程序则获得这个自旋锁并继续执行;否则,程序将在一个小的循环内重复这个‘测试并设置’的操作,即”自旋“。
    //定义一个自旋锁
   spinlock_t     lock;
   spin_lock_init(&lock); //初始化
  .....
   spin_lock(&lock);   //获取自旋锁
  .......//临界区
  spin_unlock(&lock);

  1、较长时间地占用锁,会降低系统的性能。
  2、自旋锁可能会导致系统死锁。常见情况为递归使用一个自旋锁。

读写自旋锁
      读写自旋锁是一种不自旋锁粒度更小的锁机制,只能有一个写进程,同时可以有几个读执行单元,但读写不能同时进行。
     基本操作有:定义和初始化读写自旋锁,读锁定,读解锁,写锁定,写解锁。
     在对共享资源进行读取之前,应该先进行读锁定,完成之后进行读解锁。
      在对共享资源进行写之前,应该先调用写锁定函数,完成之后调用写解锁函数。
    读写自旋锁一般使用:
rwlock_t   lock;
        relock_init(&lock); //定义初始化

//读
read_lock(&lock);
.....  //临界资源
read_unlock(&lock);

//写
write_lock_irqsave(&lock);
....... //临界资源
write_unlock_irqrestore(&lock,flags);

五、信号量
semaphore是用于保护临界区的一种常用方法,与自旋锁类似。区别在于为获得信号量时,进程不会原地打转,而是进入休眠等待状态。
        semaphore相关的操作:
         //定义信号量
struct semaphore sem;

//初始化信号量
void sema_init(struct semaphore *sem,int  val);

void init_MUTEX("struct semaphore  *sem");// 初始化一个用于互斥的信号量,sem设为1
void init_MUTEX_LOCKED(struct semaphore *sem);//初始化一个信号量,sem设为0

//获得信号量
void down(struct semaphore *sem);//会导致睡眠,不能在中断上下文使用
int  down_interruptible(struct  semaphore *sem);//因该函数进入睡眠状态的进程可被信号打断,信号也会导致该函数返回,这是返回值非0
int down_trylock(struct semaphore *sem);//如获得信号量,返回0;否则返回非0,不会导致调用者睡眠。

//释放信号量
void up(struct semaphore *sem);//释放信号量,唤醒等待者

信号量一般的使用方式:
DECLARE_MUTEX(sem);//定义互斥锁
down(&sem); //获得信号量,释放临界区
..... //临界区
up(&sem); //释放信号量

操作系统实验临界区的互斥访问 详细步骤,有界面提示,当多个线程访问一个独占性共享资源时,可以使用“临界区”对象。任一时刻只有一个线程可以拥有临界区对象,拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将被挂起等待,直到拥有临界区的线程放弃临界区时为止,这样就保证了不会在同一时刻出现多个线程访问共享资源。 CCriticalSection类的用法非常简单,步骤如下: 立即下载

相关推荐

深入解析JESD204B Subclass 1中的SYSREF与LMFC同步机制

本文深入解析了JESD204B Subclass 1协议中的核心同步机制,重点阐述了SYSREF信号如何作为系统级参考,对齐所有设备内部的本地多帧时钟(LMFC),从而实现高速多通道数据采集系统中的确定性延迟。文章结合实战经验,详细说明了硬件设计、时序要点及软件配置流程,是解决多ADC芯片同步对齐问题的关键指南。

weixin_29271263的博客 398

Linux设备程序中的并发控制

一、并发与竞态       并发指多个执行单元同时、并行被执行,而并发的执行单元对共享资源(全局变量,静态变量)的访问则容易导致竞态。      几种情景:1、对称多处理器(SMP)的多个CPU      2、单个CPU进程与抢占它的进程  3、中断与进程之间    访问共享资源区的代码区域称为临界区(critical sections).对临界区的保护方法:中断屏蔽,原子操作,自旋锁和

jeffade的专栏 530

ArcGIS+PLUS+InVEST三件套实战:从零搞定土地利用变化与碳储量预测(附完整数据包)

本文详细介绍了如何整合ArcGIS、PLUS模型和InVEST模型,构建土地利用变化与碳储量预测的完整研究流水线。通过多情景模拟和生态系统服务评估,提供从数据准备到结果验证的实战指南,助力研究者高效完成生态评估项目。

weixin_30399821的博客 544

多线程(11)临界区

临界区,又称为临界段,是指在并发编程环境下,能够访问共享资源的那部分代码。这些共享资源可能包括共享内存、文件、数据库记录等。临界区的存在是并发程序设计中需要重点关注的问题之一,因为不当的访问控制可能会引起数据不一致、竞态条件等一系列问题。

qq_43012298的博客 1448

Python 陌生代码库阅读之道:从零起步到一周掌控 5 万行老项目的实战策略

文中特别强调"自顶向下+画图+注释"的基础阅读心法,并提供了具体的代码示例和命令行技巧。对于大型项目,建议先建立核心流程的骨架认知,再逐步填充细节,同时注重文档化和测试覆盖率的提升。 掌握这套方法后,开发者可以将陌生代码库的阅读效率提升3倍以上,在一周内建立起对5万行级别项目的整体掌控力。

铭渊老黄 507

编织数据的实时脉络——构建基于MySQL的数据编织平台,实现实时数据治理

除了上述基本设置外,我们还可以根据实际应用场景自定义一些特定的监控项目。例如,对于某些高并发读写的表,可能需要特别关注它们的锁等待时间和回滚段使用率;而对于涉及到跨库关联查询的操作,则应当着重检查网络延迟及缓存命中率等因素。-- 获取InnoDB行级锁等待情况-- 统计各表的缓存命中率这段SQL脚本不仅展示了如何查询InnoDB引擎下的锁争用状况,还介绍了计算表级别缓存命中率的方法,有助于深入理解系统的运行状态。

墨夶的博客 1789

操作系统学习记录之七:临界区

互斥与临界区 临界资源:互斥共享变量所代表的资源,即一次只能被一个进程使用的资源; 临界区指并发进程中与互斥共享变量相关的程序段; 多个并发进程访问临界资源时, 存在竞争制约关系;  如果两个进程同时停留在相关的临界区内,就会出现与时间相关的错误; 临界区的描述: 确定临界资源; 确定临界区; 两个进程的临界区有相同的临界资源,就是相关的临界区,必须互斥进入; 两个临界区不相关,进入就没...

小小柴的博客 4029

地平线J6的基础简介

地平线J6M芯片:面向中阶辅助驾驶市场的高性价比芯片

weixin_43084908的博客 4462

【Java并发编程】Java多线程(二):多线程一定好吗?线程阻塞时占用CPU吗?

1.多线程一定好吗 1.1 适用场景 阻塞等待时充分利用CPU 当程序发生阻塞的操作时候,例如IO等待,CPU将就空闲下来了。而使用多线程,当一些线程发生阻塞的时候,另一些线程则仍能利用CPU,而不至于让CPU一直空闲。 利用CPU的多核并行计算能力 现在的CPU基本上都是多核的。使用多线程,可以利用多核同时执行多个线程,而不至于单线程时一个核心满载,而其他核心空闲。 1.2 多线程弊端 线程切换是有开销的,这会导致程序运行变慢。 多线程程序必须非常小心地同步代码,否则会引起死锁。 多线程程序极难调试

A minor 7141

Python爬虫实战:携程旅游攻略爬取全流程解析(动态接口+反爬破解+异步爬取)

本文介绍了携程旅游攻略的爬取全流程,涵盖静态和动态页面抓取、异步请求、高级反爬策略以及数据存储和简单分析。增加用户评论和评分抓取结合NLP分析攻略文本情感与关键词建立旅游推荐系统自动化代理IP池和验证码识别模块。

2201_76125261的博客 2039

c#仿热血江湖

Int32_1 = (int) table.Rows[i]["FLD_初级附魂"],Int32_2 = (int) table.Rows[i]["FLD_中级附魂"],Int32_3 = (int) table.Rows[i]["FLD_是否绑定"],Int32_0 = (int) table.Rows[i]["FLD_进化"],Form1.smethod_1(2, "加载百宝阁物品----没有百宝阁数据");Form1.smethod_1(2, "加载物品商店----没有物品数据");

weixin_42132177的博客 143

为什么临界区是代码而不是数据?深入理解并发控制的核心概念

概念角色关键点共享数据被操作的对象(被动)需要保护,但无法自我管理并发临界区操作行为的集合(主动)通过控制代码执行顺序,间接保护数据一致性锁/信号量协调代码执行的工具绑定的是代码逻辑,而非数据本身注互斥锁(Mutex)用于保护临界区,而信号量(Semaphore)还可用于线程间协作(如生产者-消费者问题)。

qq_22841387的博客 1160

国科大学习资料--人工智能原理与算法-2020年期末考试题解析(学长整理)

国科大学习资料–人工智能原理与算法-2020年期末考试题解析 张文生老师主讲 试卷共有6道题,题目不难,希望大家能取得好的成绩。 3.9 传教士和野人问题。三个传教士和三个野人在河的一岸,有一条能载一个人或者两个人的船。请设法使所有人都渡到河的另一岸,要求在任何地方野人数都不能多于传教士的人数。这个问题在AI领域中很有名,是因为它是第一个从分析的观点探讨问题形式化的论文的主题(Amarel,1968)。 a. 请对该问题进行详细形式化,只描述确保该问题求解所必需的特性。画出完整的状态空间图。 b. 应用合适

无名何许人的博客 4789

这些年并发控制为了解决临界区问题都做了什么?以及啥是管程?

上,这种“忙等待”纯属浪费。因为持有锁的进程根本没在运行,你自旋也等不来锁。但这个方案也很烦,因为它在“检查 (Load)”和“设置 (Store)”之间。,也就是一段只允许自己一个进程执行的代码。自然地,我们想到用“锁”来保护它。调度走了,另一个进程就会趁虚而入,导致两个进程都进入了临界区,方案失败。这就漂亮地解决了“持有锁并休眠” 导致的经典死锁问题。它把“查询”和“改变”(设置为1)变成了一个。是原子的,所以它也能像 TSL 一样保护临界区。成员,不让你“随便改”。软件没招了,就得靠硬件。

xjl_028的博客 350

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java实现临界区:经典并发控制回顾

只要有一定的内存order保证,不通过比较并交换(CAS)那些需要硬件支持的原子操作,能不能实现一个互斥的临界区?答案是:能。 计算机先驱djkstra,50多年前的这篇经典paper中就提出了解决方案。并且自这以后开启了如何通过一般编程语言实现并发控制的 研究。 这里的假设我们有N个线程,代表序号分别为1-N,一个公共变量k用于辅助指示当前占有临界区的线程。临界区是critical

luoyuyou的专栏 1445

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Windows 临界区(CRITICAL_SECTION)的使用

同步和互斥机制 基本概念 同步和互斥的概念有时候很容易混淆,可以简单地认为同步是更加宏观角度的一种说法,互斥是冲突解决的细节方法。所谓同步就是调度者让任务按照约定的合理的顺序进行,但是当任务之间出现资源竞争,也就是竞态冲突时,使用互斥的规则强制约束允许数量的任务占用资源,从而解决各个竞争状态,实现任务的合理运行。 同步和互斥密不可分,有资料说互斥是一种特殊的同步,对此我不太理解,不过实际中想明白细节就行,文字游戏没有意义。 简单来说: 同步与互斥机制是用于控制多个任务对某些特定资源的访问策略 同步

Sakuya__的博客 4284

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

ASP.NET温故而知新学习系列之ASP.NET多线程编程—.NET下的多线程编程临界区(八)

阅读目录   一:临界区概述   二:临界区操作   三:通过lock关键字设置临界区   四:通过Interlocked类设置临界区   五:通过Monitor类设置临界区   一:临界区概述   在某个时间段内可以有两个线程同时执行,那么两个线程访问的要都是同一个数据的话,那么这种情况下会出现一些不必要的事情,比如:我的银行账户总额有5000,某天我拿着存折去柜台取4000准备交

yw1688的专栏 1726

原子操作 临界区 关中断

信号量 临界区 关中断 共享内存 什么是临界区 临界资源 1.临界资源 临界资源是一次仅允许一个进程使用的共享资源。各进程采取互斥的方式,实现共享的资源称作临界资源。属于临界资源的硬件有,打印机,磁带机等;软件有消息队列,变量,数组,缓冲区等。诸进程间采取互斥方式,实现对这种资源的共享。 2.临界区: 每个进程中访问临界资源的那段代码称为临界区(criticalsection),每次只允许一个进程进入临界区,进入后,不允许其他进程进入。不论是硬件临界资源还是软件临界资源,多个进程必须互斥的对它进行访问。多个

dianqicyuyan的博客 638

字符设备驱动基础—并发控制

执行流:有开始有结束总体顺序执行的一段代码 又称上下文应用编程:任务上下文竞态:多任务并行执行时,如果在一个时刻同时操作同一个资源,会引起资源的错乱,这种错乱情形被称为竞态共享资源:可能会被多个任务同时使用的资源临界区:操作共享资源的代码段为了解决竞态,需要提供一种控制机制,来避免在同一时刻使用共享资源,这种机制被称为并发控制机制。

hhltaishuai的博客 913

[OS复习]进程互斥与同步1

进程互斥与同步 1.引言:多道程序设计存在的问题? 采用多道程序设计技术的操作系统,允许多个进程同时驻留内存并发执行。思考: A.如何协调多个进程对系统资源,如内存空间、外部设备等的竞争和共享? B.如何解决多个进程因为竞争资源而出现执行结果异常,甚至导致系统不稳定、失效等问题? 例如,多个进程同时申请文件打印,如何有效分配打印机?  1.1 临界资源访问实例1: 银行的联网储蓄

沈春旭的博客 2767

并发控制&互斥锁

并发控制的解决办法是保证对共享资源的互斥访问,所谓的互斥访问是指一个执行单元在访问共享资源的时候,其他的执行单元被禁止访问。 访问共享资源的代码区域称为临界区,临界区需要被以某种互斥机制加以保护。 互斥机制: 中断屏蔽 原子操作 自旋锁 信号量 互斥体都是Linux设备驱动中采用的互斥途径 中断屏蔽 只能解决本CPU,无法解决SMP多CPU引发的竞态 原子操作 定...

林深的小创作 383

临界区 互斥 事件 信标的区别

临界区 临界区解决了多个线程对同一全局资源改写时的单一访问。 互斥 互斥的特点是能跨进程的控制线程的运行 事件 事件的特点是能手动控制通知信号发 还是不发 信标 信标的特点是能控制多个线程的同时并发 临界区的效率是最高的,因为它不用进到内核里面去。根据各自的特点,程序需要什么功能,选择合适的对象。 ...

qq_41490873的博客 239

操作系统读者-写者问题中算是允许多个进程进入临界区吗

在做题的时候做到临界区最多允许几个进程进入,临界区的定义是最多只允许一个进程进入的代码段,那么读者-写者问题中多个读者可以同时进入临界区,这个怎么解释呢?有没有学霸知道的求解答!...

2023年最新地推相关信息 321

临界区 互斥量 信号量 事件

1、临界区 公用资源,某一时刻只能被一个多线程访问,有线程进入后,其他线程必须等待 2、互斥量和临界区很相似,只有拥有互斥对象的线程才能访问资源,互斥对象只有一个,所以某一刻只有一个线程可以访问    互斥量比临界区复杂,因为使用互斥可以在同一应用不同线程间访问,也可以在不同应用之间访问        创建  打开  释放  等待     3、允许同一时刻多个线程进行共享资源

化茧成蝶007 321

同步互斥

一. 背景 并发进程可能出现间歇性发生的错误,随着外界环境的变化可能会发生错误。 并发示例:理想情况下,进程执行工作是将next_pid写给寄存器,读寄存器赋值给new_pid,然后寄存器加1赋值给next_pid。两个进程先后执行,不会中间中断。 四条语句中可能出现切换 并发执行时要保证一些是原子操作,否则会引发一些问题。 前两个方案都是只看最后结果的话,有面包和没有面包有便签时...

weixin_43864534的博客 343
上一篇: s3c2410时钟信号:FCLK、HCLK和PCLK;clk_get_rate()
下一篇: 看块设备驱动部分的笔记
xp_super
博客等级 码龄14年 10粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值