并发、竞态、互斥锁、自旋锁、信号量都是什么鬼?

stm32f4 hal 4位数码管_「正点原子NANO STM32开发板资料连载」第四章 STM32F4 基础入门... 1)实验平台:ALIENTEK NANO STM32F411 V1开发板2)摘自《正点原子STM32F4 开发指南(HAL 库版》关注官方微信号公众号,获取更多资料:正点原子第四章 STM32F4 开发基础知识入门这一章,我们将着重 STM32 开发的一些基础知识,让大家对 STM32 开发有一个初步的了解,为后面 STM32 的学习做一个铺垫,方便后面的学习。这一章的内容大家第一次看的时候可以只... 阅读详情

1. 锁的由来?

学习linux的时候,肯定会遇到各种和锁相关的知识,有时候自己学好了一点,感觉半桶水的自己已经可以华山论剑了,又突然冒出一个新的知识点,我看到新知识点的时候,有时间也是一脸的懵逼,在大学开始写单片机的跑裸机代码,完全不懂这个锁在操作系统里面是什么鬼,从单片机到嵌入式Linux,还有一个多任务系统,不懂的同学建议百度看看。

2. 什么是并发和竞态?

在早期的Linux内核中,并发源相对较少。内核不支持对称多处理器(SMP)系统,唯一导致并发问题的原因是中断。
随着处理器的CPU核越来越多,这要求系统对事件迅速做出响应。为适应现代硬件和应用的需求,Linux内核已经发展到可以同时进行更多事情的地步。这种演变带来了更大的可伸缩性。但是,这也大大复杂化了内核编程的任务。设备驱动程序员现在必须从一开始就将并发性考虑到他们的设中,而且他们需要深刻的理解并发问题,并利用内核提供的工具处理这类问题。

Spinlocks and Atomic Context

Imagine for a moment that your driver acquires a spinlockand goes
about its business within its critical section. Somewhere in the
middle, your driver loses the processor.Perhaps it has called a
function (copy_from_user, say) that puts the process to sleep. Or,
perhaps, kernel preemption kicks in, and a higher-priority process
pushes your code aside. Your code is now holding a lockthat it will
not release any time in the foreseeable future. If some other thread
tries to obtain the same lock, it will, in the best case, wait
(spinning in the processor) for a very long time. In the worst
case,the system could deadlock entirely. Most readers would agree that
this scenario is best avoided. Therefore, the core rule that applies
to spinlocks is that any code must, while holding a spinlock, be
atomic.It cannot sleep; in fact, it cannot relinquish the processor
for any reason except toservice interrupts (and sometimes not even
then).

2.1 并发与竞态概念

上面扯淡完了进入正题
什么是并发: 并发是指多个执行任务同时、并行被执行。
什么是竞态: 字面意思是竞争,并发的执行单元对共享资源(硬件资源和软件上的全局变量,静态变量等)的访问容易发生竞态。
举例一个字符设备的缺陷: 对于一个虚拟的字符设备驱动,假设一个执行单元A对其写入300个字符‘a’,而另一个执行单元B对其写入300个字符‘b’,第三个执行单元读取所有字符。如果A、B被顺序串行执行那么C读出的则不会出错,但如果A、B并发执行,那结果则是我们不可料想的。
竞态发生的情况
对称多处理器(SMP)的多个CPU: SMP是一种紧耦合、共享存储的系统模型,它的特点是多个CPU使用共同的系统总线,因此可以访问共同的外设和存储器。
单CPU内进程与抢占它的进程: Linux 2.6的内核支持抢占调度,一个进程在内核执行的时候可能被另一高优先级进程打断。
中断(硬中断、软中断、tasklet、低半部)与进程之间:中断可以打断正在执行的进程,处理中断的程序和被打断的进程间也可能发生竞态。
竞态的解决办法
解决竞态问题的途径是保证对共享资源的互斥访问。访问共享资源的代码区域称为临界区,临界区要互斥机制保护。Linux设备驱动中常见的互斥机制有以下方式:中断屏蔽、原子操作、自旋锁和信号量等。

Most readers would agree that this scenario is best avoided.
Therefore, the core rule that applies to spinlocks is that any code
must, while holding a spinlock, be atomic.It cannot sleep; in fact, it
cannot relinquish the processor for any reason except toservice
interrupts (and sometimes not even then).

对上面死锁理解不够深入的,可以细细评味这段英文。

3. 讨论下死锁

死锁的问题是开发中稍不小心就可能遇到的,在SMP系统里面,如果有一个CPU被死锁了,还有其他CPU可以继续运行,就像一个车子,有一个轮子爆胎了,理论上还是可以跑的,就是开不快,或者开快的话就会容易挂逼。

3.1 多进程调度导致死锁

之前的文章https://mp.weixin.qq.com/s/au-ZXnTgpOO3mYRyKir01w
出现以下四种情况会产生死锁:
  1,相互排斥。一个线程或进程永远占有共享资源,比如,独占该资源。
  2,循环等待。例如,进程A在等待进程B,进程B在等待进程C,而进程C又在等待进程A。
  3,部分分配。资源被部分分配,例如,进程A和B都需要访问一个文件,同时需要用到打印机,进程A得到了这个文件资源,进程B得到了打印机资源,但两个进程都不能获得全部的资源了。
  4,缺少优先权。一个进程获得了该资源但是一直不释放该资源,即使该进程处于阻塞状态。
具体使用的场景会更加复杂,要需要按实际分析,对号入座~

3.2 单线程导致死锁

单线程导致死锁的情况一般是由于调用了引起阻塞的函数,比如(copy_from_user()、copy_to_ser()、和kmalloc()),阻塞后进行系统调度,调度的过程中有可能又调用了之前获取锁的函数,这样必然导致死锁。
还有一种就是自旋锁函数在没有释放锁马上又进行申请同一个自旋锁,这样的低级问题也是会导致自旋锁。

4. 互斥锁和自旋锁、信号量的区别?

互斥锁和互斥量 在我的理解里没啥区别,不同叫法。广义上讲可以值所有实现互斥作用的同步机制。狭义上讲指的就是mutex这种特定的二元锁机制。互斥锁的作用就是互斥,mutual exclusive,是用来保护临界区(critical section)的 。所谓临界区就是代码的一个区间,如果两个线程同时执行就有可能出问题,所以需要互斥锁来保护。

信号量(semaphore) 是一种更高级的同步机制,mutex(互斥锁) 可以说是 semaphore(信号量) 在仅取值0/1时的特例。Semaphore可以有更多的取值空间,用来实现更加复杂的同步,而不单单是线程间互斥。
自旋锁 是一种 互斥锁 的实现方式而已,相比一般的互斥锁会在等待期间放弃cpu,自旋锁(spinlock) 则是不断循环并测试锁的状态,这样就一直占着cpu。所以相比于自旋锁和信号量,在申请锁失败的话,自旋锁会不断的查询,申请线程不会进入休眠,信号量和互斥锁如果申请锁失败的话线程进入休眠,如果申请锁被释放后会唤醒休眠的线程。
同步锁 好像没啥特殊说法,你可以理解为能实现同步作用的都可以叫同步锁,比如信号量。最后,不要钻这些名词的牛角尖,更重要的是理解这些东西背后的原理,叫什么名字并没有什么好说的。这些东西在不同的语言和平台上又有可能会有不同的叫法,其实本质上就这么回事。

5. 如何解决竞态引起的问题?

上面我们已经分析了竞态产生的原因、发生的情况以及解决办法,下面我们对常见的解决办法一一分析。

1. 中断屏蔽

1.基本概念:在单CPU中避免竞态的一种简单方法是在进入临界区之前屏蔽系统的中断。由于linux的异步I/O、进程调度等很多内容都依靠中断,所以我们应该尽快的执行完临界区的代码,换句话就是临界区代码应该尽量少。

2.具体操作: linux内核提供了下面具体方法

Local_irq_disable();//屏蔽中断
Local_irq_enable();//打开中断
Local_irq_save(flags);//禁止中断并保存当前cpu的中断位信息 

2.原子操作

1.基本概念:原子操作指在执行过程中不会被别的代码中断的操作。

2.具体操作:linux内核提供了一系列的函数来实现内核中的原子操作,这些操作分为两类,一类是整型原子操作,另一类是位原子操作,其都依赖底层CPU的原子操作实现,所以这些函数与CPU架构有密切关系。

1) 整型原子操作

  • a)设置原子变量的值
atomic_t v = ATOMIC_INIT(0);//定义原子变量v并初始化为0
void atomic_set(atomic_t *v, int i);//设置原子变量值为i 
  • b)获取原子变量的值
atomic_read(atomic_t *v);//返回原子变量v的值 
  • c)原子变量加、减操作
void atomic_add(int i, atomic_t *v);//原子变量v增加i
void atomic_sub(int I, atomic_t *v);//原子变量v减少i 
  • d)原子变量自增、自减
void atomic_inc(atomic_t *v);//原子变量v自增1
void atomic_dec(atomic_t *v);//原子变量v自减1 
  • e)操作并测试
int atomic_inc_and_test(atomic_t *v);
int atomic_dec_and_test(atomic_t *v);  
int atomic_sub_and_test(int i,atomic_t *v);

/*上述三个函数对原子变量v自增、自减和减操作(没有加)后测试其是否为0,如果为0返回true,否则返回false*/ 
  • f) 操作并返回
int atomic_add_return(int i,atomic_t *v);
int atomic_sub_return(int i,atomic_t *v);  
int atomic_inc_return(atomic_t *v);
int atomic_dec_return(atomic_t *v);

/*上述函数对原子变量v进行自增、自减、加、减操作,并返回新的值*/ 

2) 位原子操作

  • a)设置位
void set_bit(nr,void *addr);//设置addr地址的第nr位,即向该位写入1。 
  • b)清除位
void clear_bit(nr,void *addr);//清除addr地址的第nr位,即向该位写入0。 
  • c)改变位
void change_bit(nr,void *addr);//对addr地址的第nr取反 
  • d)测试位
int test_bit(nr,void *addr);//返回addr地址的第nr位 
  • e) 测试并操作位
int test_and_set_bit(nr,void *addr);
int test_and_clear_bit(nr,void *addr); 
int test_and_change_bit(nr,void *addr);
/*上述函数等同于执行test_bit后,再执行xxx_bit函数*/ 

3. 自旋锁

1.基本概念: 自旋锁是一种对临界资源进行互斥访问的手段。
2.工作原理: 为获得自旋锁,在某CPU上运行的代码需先执行一个原子操作,该操作测试并设置某个内存变量,由于其为原子操作,所以在该操作完成之前其他执行单元不可能访问这个内存变量,如果测试结果表明已经空闲,则程序获得这个自旋锁并继续执行,如果测试结果表明该锁仍被占用,程序将在一个小的循环内重复这个“测试并设置”操作,即进行所谓的“自旋”,通俗的说就是在“原地打转”。
3.具体操作: linux内核中与自旋锁相关的操作主要有:

  • 1)定义自旋锁
spinlock_t lock; 
  • 2)初始自旋锁
spin_lock_init(lock); 
  • 3)获得自旋锁
spin_lock(lock);//获得自旋锁lock
spin_trylock(lock);//尝试获取lock如果不能获得锁,返回假值,不在原地打转。 
  • 4)释放自旋锁
spin_unlock(lock);//释放自旋锁  

为保证我们执行临界区代码的时候不被中断等影响我们的自旋锁又衍生了下面的内容

  • 5)自旋锁衍生
spin_lock_irq() = spin_lock() + local_irq_disable()
spin_unlock_irq() = spin_unlock() + local_irq_enable()
spin_lock_irqsave() = spin_lock() + local_irq_save() 
spin_unlock_irqrestore() = spin_unlock() + local_irq_restore()
spin_lock_bh() = spin_lock() + local_bh_disable()
spin_unlock_bh() = spin_unlock() + local_bh_disable() 

4.使用注意事项:

  • 1)自旋锁实质是忙等锁,因此在占用锁时间极短的情况下,使用锁才是合理的,反之则会影响系统性能。
  • 2)自旋锁可能导致系统死锁。
  • 3)自旋锁锁定期间不能调用可能引起进程调度的函数。

4.读写自旋锁

1.基本概念: 为解决自旋锁中不能允许多个单元并发读的操作,衍生出了读写自旋锁,其不允许写操作并发,但允许读操作并发。

2.具体操作: linux内核中与读写自旋锁相关的操作主要有:

  • 1)定义和初始化读写自旋锁
rwlock_t my_rwlock = RW_LOCK_UNLOCKED;//静态初始化
rwlock_t my_rwlock;
rwlock_init(&my_rwlock);//动态初始化 
  • 2)读锁定
read_lock();
read_lock_irqsave();
read_lock_irq();
read_lock_bh(); 
  • 3)读解锁
read_unlock();
read_unlock_irqrestore();
read_unlock_irq();
read_unlock_bh(); 
  • 4)写锁定
write_lock();
write_lock_irqsave();
write_lock_irq();
write_lock_bh();
write_trylock(); 
  • 5)写解锁
write_unlock();
write_unlock_irqrestore();
write_unlock_irq();
write_unlock_bh(); 

5.顺序锁

1.基本概念: 顺序锁是对读写锁的一种优化,如果使用顺序锁,读执行单元在写执行单元对被顺序锁保护的共享资源进行写操作时仍然可以继续读,不必等待写执行单元的完成,写执行单元也不需等待读执行单元完成在进行写操作。
2.注意事项: 顺序锁保护的共享资源不含有指针,因为在写执行单元可能使得指针失效,但读执行单元如果此时访问该指针,将导致oops。
3.具体操作: linux内核中与顺序锁相关的操作主要有:

  • 1)写执行单元获得顺序锁
write_seqlock();
write_tryseqlock();
write_seqlock_irqsave();
write_seqlock_irq();
write_seqlock_bh(); 
  • 2)写执行单元释放顺序锁
write_sequnlock();
write_sequnlock_irqrestore();
write_sequnlock_irq();
write_sequnlock_bh(); 
  • 3)读执行单元开始
read_seqbegin();
read_seqbegin_irqsave();//local_irq_save + read_seqbegin 

4)读执行单元重读

read_seqretry ();
read_seqretry_irqrestore (); 

6. RCU(读-拷贝-更新)

1.基本概念: RCU可以看做是读写锁的高性能版本,相比读写锁,RCU的优点在于即允许多个读执行单元同时访问被保护数据,又允许多个读执行单元和多个写执行单元同时访问被保护的数据。
2.注意事项: RCU不能代替读写锁。
3.具体操作: linux内核中与RCU相关的操作主要有:

  • 1)读锁定
rcu_read_lock ();
rcu_read_lock_bh (); 
  • 2)读解锁
rcu_read_unlock ();
rcu_read_unlock_bh (); 
  • 3)同步RCU
synchronize_rcu ();//由RCU写执行单元调用
synchronize_sched();//可以保证中断处理函数处理完毕,不能保证软中断处理结束 
  • 4)挂接回调
call_rcu ();
call_rcu_bh (); 

有关RCU的操作还有很多,大家可以参考网络。

7. 信号量

1.基本概念: 信号量用于保护临界区的常用方法与自旋锁类似,但不同的是当获取不到信号量时,进程不会原地打转而是进入休眠等待状态。
2.具体操作: linux内核中与信号量相关的操作主要有:

  • 1)定义信号量
Struct semaphore sem; 
  • 2)初始化信号量
void sema_init(struct semaphore *sem, int val);//初始化sem为val,当然还有系统定义的其他宏初始化,这里不列举 
  • 3)获得信号量
void down(struct semaphore *sem);//获得信号量sem,其会导致睡眠,并不能被信号打断 
int down_interruptible(struct semaphore *sem);//进入睡眠可以被信号打断 
int down_trylock(struct semaphore *sem);//不会睡眠 
  • 4)释放信号量
void up(struct semaphore *sem);//释放信号量,唤醒等待进程 

注:当信号量被初始为0时,其可以用于同步。

8.Completion用于同步

1.基本概念: linux中的同步机制。

2.具体操作: linux内核中与Completion相关的操作主要有:

  • 1)定义Completion
struct completion *my_completion; 
  • 2)初始化Completion
void init_completion(struct completion *x); 
  • 3)等待Completion
void wait_for_completion(struct completion *); 
  • 4)唤醒Completion
void complete(struct completion *);//唤醒一个 
void complete_all(struct completion *);//唤醒该Completion的所有执行单元 

9.读写信号量

1.基本概念: 与自旋锁和读写自旋锁的关系类似
2.具体操作: linux内核中与读写信号量相关的操作主要有:

  • 1)定义和初始化读写自旋锁
struct rw_semaphore sem; 
init_rwsem(&sem); 
  • 2)读信号量获取
down_read ();
down_read_trylock(); 
  • 3)读信号量释放
up_read (); 
  • 4)写信号量获取
down_write ();
down_write_trylock (); 
  • 5)写信号量释放
 up_write(); 

10.互斥体

1.基本概念: 用来实现互斥操作

2.具体操作: linux内核中与互斥体相关的操作主要有:

  • 1)定义和初始化互斥体
struct mutex lock;
mutex_init(&lock); 
  • 2)获取互斥体
void mutex_lock(struct mutex *lock);
int mutex_lock_interruptible(struct mutex *lock); 
int mutex_lock_killable(struct mutex *lock); 
  • 3)释放互斥体
void mutex_unlock(struct mutex *lock); 

内核的竞态控制 何谓竞态?用一句话描述就是:并行执行的多个程序,同时访问共享资源,或执行同一段代码,若这些行为是有害的则称此为竞态1.解决机制 现代soc大多是对称多处理器机制(SMP),每个核可以有自己的中断,自己的进程(宏观和微观都是并行)。如下 可以认为,SMP是竞态最复杂的情况了,单核竞态的复杂度真包含于SMP。由于驱动程序需要保证稳定性与普适性,所以最好一律按照SMP的情况来进行竞态 阅读详情

相关推荐

漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼?

锁的由来? 在各种书籍和面试中,我们看到很多关于互斥锁,自旋锁,信号量的东西,但是为什么有这个东西出来呢? 在《linux设备驱动程序》书籍里面有这样一个例子,给出了下面的一小段代码 if (!dptr->data[s_pos]) { dptr-&

嵌入式Linux 4882

什么是竞态 什么是竞态分析

什么是竞态 什么是竞态分析

云满笔记 848

STM32的串口变量的原子操作问题

串口方式:用串口接收中断方式接收,不是DMA. 遇到的问题:串口数据有帧丢失。 原因描述:在串口接收中断中接收到字节时变量size++。在main循环中解析一帧数据时size--,导致的size值不对,从而导致解析错误,导致数据帧丢失的情况。实际的原因是对size的操作不是原子操作的,具体更改见文档。有相关程序和具体的分析。

在并发编程中我们常说的“竞态”是什么?

1 何谓“竞态” 之前在学习一篇文章的时候,就看到“竞态”,但是不知道什么意思,文章中也没有对“竞态”做更多的解释,后来经过一番的探索,终于弄的差不多明白了,今天写点总结。 首先,我们要明白“竞态”是什么。先说我的结论吧,“竞态”就是在多线程的编程中,你在同一段代码里输入了相同的条件,但是会输出不确定的结果的情况。我不知道这个解释是不是够清楚,我们接着往下看,下面我们用一段代码来解释一下啊。 出现...

RAYFUXK的专栏 1510

SFF-8654接口引脚定义全解析:从SAS到U.2的高速硬件连接核心

在高速数据存储与传输领域,接口标准是连接主机与存储设备、确保信号完整性与协议互通性的物理基础。其核心原理在于通过精确定义的物理引脚和电气特性,承载不同的高速串行通信协议,如SAS和PCIe。这类高密度连接器的技术价值在于以紧凑的形态支持多协议兼容与高速率传输,满足了企业级存储、高性能计算对带宽和可靠性的苛刻要求。典型的应用场景包括服务器硬盘背板连接、NVMe U.2固态硬盘直连以及外部存储扩展。本文聚焦于SFF-8654(亦称Mini SAS HD)这一关键接口,深入剖析其引脚定义、信号分区(如高速数据通道

weixin_29188043的博客 705

向量乘法器设计

同样基于Wallace树乘法器,我们来构造向量乘法器。 在一些矩阵运算中经常用到向量的相乘运算,本例以4维向量为例子介绍向量乘法器的verilog HDL设计。 设向量a = (a1, a2, a3, a4), b = (b1, b2, b3, b4)。 则a 与 b的点乘为:a * b = a1 b1 + a2 b2 + a3 b3 + a4 b4, 即向量对应位置的值相乘,再相加...

Reborn Lee 2967

多线程之竞态

准备知识点:1.竞态:指多线程情况下计算的正确性依赖于相对时间顺序或线程的交错;2.状态变量:类的实例变量、静态变量;3.共享变量:能够被多个线程共同访问的变量,状态变量也属于共享变量;4.竞态产生模式:有两种    a) 读-改-写    b) 检查-行动    在下面的程序中直接演示了这两种情况5.局部变量的使用不会产生竞态;6.原子性:意思是不可分割,就好比去饮料机买饮料,我只负责选择然后取...

weixin_42164137的博客 1729

半导体领域知识 - 初级入门

半导体领域知识 - 初级入门 知识问答 1. 一个晶圆上根据芯片的大小,可以生产几百、几千、几万个芯片。如下图: 2. 8寸晶圆指的是什么?5nm工艺指的是什么? 8寸晶圆指的是直径为175mm(17.5cm)的晶圆,下面是6/812/18寸晶圆的尺寸以及相关发展历程。目前拥有12寸线的厂商只有5家,一个12寸晶圆厂的成本需要上百亿美金。 5nm工艺指的是在一个具体的芯片上,有很多微型结构(千万、亿级别的晶体管),这些核心基本单元MOS管的栅极宽度尺寸来衡量工艺的精细程度,如果是5nm就被称为5nm工艺

Hello World! 2万+

优快云日报190226——漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼?

漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼? 作者:码农-嵌入式Linux 学习Linux的时候,肯定会遇到各种和锁相关的知识,有时候自己学好了一点,感觉半桶水的自己已经可以华山论剑了,又突然冒出一个新的知识点,我看到新知识点的时候,有时间也是一脸的懵逼。在大学开始写单片机的跑裸机代码,完全不懂这个锁在操作系统里面是什么鬼,从单片机到嵌入式Linux,还有一个多任务系统,不...

优快云 官方博客 4493

LM Studio Bionic:本地AI智能体从部署到实战完整指南

AI智能体作为能够自主规划、执行多步任务的人工智能系统,其核心原理在于结合大语言模型的推理能力与工具调用机制。通过状态保持和任务分解算法,智能体实现了从单次问答到持续协作的技术跃迁。在工程实践中,这种架构显著降低了复杂任务自动化的门槛,特别适用于数据敏感场景和定制化需求。以Tesla V100等专业硬件为例,本地部署能充分发挥其大显存优势,支持更高精度的模型量化格式。在实际应用层面,智能体可无缝集成到代码审查、文档生成等开发工作流中,而LM Studio Bionic通过统一界面整合了模型服务、任务规划器等

weixin_29053695的博客 646

psasp和matlab,PSASP与Matlab/SimPowerSystems联合仿真接口方法研究

[1]李亚楼,吴中习.Matlab模型接入PSASP暂态稳定计算模块的方法[J].电网技术,2008,32(19):31-36.Li Yalou,Wu Zhongxi.An Approach to Interface Matlab Model with PSASP Transient Stability Module [J].Power System Technology,2008,32(19):...

weixin_39636245的博客 1081

linux 信号量_漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼?

1. 锁的由来?学习linux的时候,肯定会遇到各种和锁相关的知识,有时候自己学好了一点,感觉半桶水的自己已经可以华山论剑了,又突然冒出一个新的知识点,我看到新知识点的时候,有时间也是一脸的懵逼,在大学开始写单片机的跑裸机代码,完全不懂这个锁在操作系统里面是什么鬼,从单片机到嵌入式Linux,还有一个多任务系统,不懂的同学建议百度看看。2. 什么是并发和竞态?在早期的Linux内核中,并...

weixin_39845461的博客 72

从零到多智能体:Google Agent开发套件(ADK)入门指南

ADK促进自定义工具生产的能力是其优势之一。本质上,工具只是一个带有描述性文档字符串的Python函数。

独立开发,substack顶级编辑 2488

windows临界区和互斥量效率_漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼?...

1. 锁的由来?学习linux的时候,肯定会遇到各种和锁相关的知识,有时候自己学好了一点,感觉半桶水的自己已经可以华山论剑了,又突然冒出一个新的知识点,我看到新知识点的时候,有时间也是一脸的懵逼,在大学开始写单片机的跑裸机代码,完全不懂这个锁在操作系统里面是什么鬼,从单片机到嵌入式Linux,还有一个多任务系统,不懂的同学建议百度看看。2. 什么是并发和竞态?在早期的Linux内核中,并发源相对较...

weixin_39957461的博客 267

华为OD最新机试真题-池化资源共享

摘要:该问题要求管理n台设备的资源池,处理资源申请和释放操作。申请操作需返回满足条件且剩余资源最少的设备ID,释放操作需将指定申请的资源归还。采用线段树数据结构维护各设备当前最大可用资源值,支持快速查询和更新。线段树实现了单点修改、区间最大值查询以及查找最左满足条件的节点功能。算法时间复杂度为O((n+m)logn),空间复杂度O(n),适用于大规模操作。提供了C++、Java和Python三种实现方案。

面试高手的博客 324

C#量化交易的市场数据采集与分析:从0到1构建你的‘数据雷达’——对比5大神器,代码实战全解析!

数据是量化交易的‘氧气’,而好的数据采集与分析是你的‘呼吸机’!本文5大神器+代码实战,总有一款适合你!(本文代码均经过测试,但请根据实际需求调整!

java专栏 727

add python3.7 to path是什么意思_漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼?...

1. 锁的由来?学习linux的时候,肯定会遇到各种和锁相关的知识,有时候自己学好了一点,感觉半桶水的自己已经可以华山论剑了,又突然冒出一个新的知识点,我看到新知识点的时候,有时间也是一脸的懵逼,在大学开始写单片机的跑裸机代码,完全不懂这个锁在操作系统里面是什么鬼,从单片机到嵌入式Linux,还有一个多任务系统,不懂的同学建议百度看看。2. 什么是并发和竞态?在早期的Linux内核中,并发源相对较...

weixin_35878217的博客 412

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

c++ linux 线程等待与唤醒_漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼?...

1. 锁的由来?学习linux的时候,肯定会遇到各种和锁相关的知识,有时候自己学好了一点,感觉半桶水的自己已经可以华山论剑了,又突然冒出一个新的知识点,我看到新知识点的时候,有时间也是一脸的懵逼,在大学开始写单片机的跑裸机代码,完全不懂这个锁在操作系统里面是什么鬼,从单片机到嵌入式Linux,还有一个多任务系统,不懂的同学建议百度看看。2. 什么是并发和竞态?在早期的Linux内核中,并...

weixin_33702545的博客 136

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

一文看懂临界区、互斥锁、同步锁、临界区、信号量、自旋锁等名词!

点击上方“业余草”,选择“置顶公众号” 第一时间获取技术干货和业界资讯! 关于线程安全的专有名词有一大堆。你们突然之间问我这个名词是什么意思,那个名词是什么意思我还真不一定能给你准确的回答。这还别说一门语言一堆名词。其实有些名词叫法不同,实际上就是一个意思。 A 语言有这个名词,B 语言就起另外一个名词。不能大胆的雷同,所以就改变一个叫法,其本质还是一样的。 为了减少大家在...

xmt1139057136的专栏 5793

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

漫画Linux 并发、竞态、互斥锁、自旋锁、信号量

1. 锁的由来? 学习linux的时候,肯定会遇到各种和锁相关的知识,有时候自己学好了一点,感觉半桶水的自己已经可以华山论剑了,又突然冒出一个新的知识点,我看到新知识点的时候,有时间也是一脸的懵逼,在大学开始写单片机的跑裸机代码,完全不懂这个锁在操作系统里面是什么鬼,从单片机到嵌入式Linux,还有一个多任务系统,不懂的同学建议百度看看。 2. 什么是并发和竞态? 在早期的Linux内核中,并发源相对较少。内核不支持对称多处理器(SMP)系统,唯一导致并发问题的原因是中断。 随着处理器的C

Android系统攻城狮 548

漫画 | Linux 并发和竞态问题究竟是什么?

作者 |写代码的篮球球痴责编| 郭芮学习Linux的时候,肯定会遇到各种和锁相关的知识,有时候自己学好了一点,感觉半桶水的自己已经可以华山论剑了,又突然冒出一个新的知...

优快云资讯 3480

内核的并发和竞态(信号量、completion、自旋锁)

1、并发和并行 (1)并行:在同一时刻有多个线程一起运行; (2)并发:在同一时刻只有一个线程在运行,但是在一个时间段内有多个线程运行; 总结:并发是宏观的并行。因为CPU运行特别快,虽然CPU不断在切换运行的线程,但是对于人来说,根本感知不到CPU的切换过程,就好像荧光灯在不停的闪烁, 但是频率只要够快,人们就感觉不到在闪烁。 2、并发产生的原因 (1)正在运行的多个用户进程以无法预知的方式访问驱动程序代码 (2)外部设备的中断异步的发生,导致正在运行的进程或者驱动代码被中断 (3)linux的软件

weixin_42031299的博客 797

并发与竞态

信号量则可以是非负整数,在保证互斥的前提下,可以用于执行单元之间的资源信息同步,使得资源被有序合理占有。读执行单元不会被写执行单元阻塞,写执行单元也不会被读执行单元阻塞。读操作只是简单增加对共享数据的引用,而写操作需要拷贝副本,对副本进行更改,等到所有读引用都结束之后,再将原数据指向新的数据。互斥体时进程级的,处于进程上下文之中,而自旋锁则是更底层的实现,本质上互斥体需要使用自旋锁。1.当某些执行单元提供临界区的资源,而另一些执行单元消费临界区资源的时候,使用信号量。

weixin_44178960的博客 889

【同步与并发】信号量、互斥锁、自旋锁相关问题

什么是同步?什么是互斥? 什么是异步执行?为什么需要代码异步执行? 什么是信号量?什么是互斥锁?什么是自旋锁? 互斥锁和信号量的区别是什么?互斥锁和自旋锁的区别是什么?

诸葛一帆丶的博客 2677
上一篇: 直观理解导函数(直接画出导函数的图像)
下一篇: CPU:一个故事看懂DMA
嵌入式逍遥
嵌入式逍遥 领域专家: 嵌入式与硬件开发技术领域 领域专家: 嵌入式与硬件开发技术领域
博客等级 码龄9年 7万+粉丝 237原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值