很多时候我们并不能采用其他的锁,比如读写锁、互斥锁、信号量等。一方面这些锁会发生上下文切换,他的时间是不可预期的,对于一些简单的、极短的临界区完全是一种性能损耗;另一方面在中断上下文是不允许睡眠的,除了自旋锁以外的其他任何形式的锁都有可能导致睡眠或者进程切换,这是违背了中断的设计初衷,会发生不可预知...
(2)中断上下文不能睡眠 基于上面两点,就对不睡眠的spin_lock 有需求。 spin lock解决的问题 i. 内核的单核抢占:使得正在执行的进程A可以被其他进程抢占,这种抢占不是无时无刻的,存在抢占点(中断处理程序返回内核空间或用户空间)。如中断处理程序中激活高优先级线程B,则会在中断处理程序返回时执行高优先级线程B抢...
1、为什么需要自旋锁 很多时候我们并不能采用其他的锁,比如读写锁、互斥锁、信号量等。一方面这些锁会发生上下文切换,他的时间是不可预期的,对于一些简单的、极短的临界区完全是一种性能损耗; 另一方面在中断上下文是不允许睡眠的,除了自旋锁以外的其他任何形式的锁都有可能导致睡眠或者进程切换,这是违背了中断的设...
这样是否可以这么说,spin_lock为了防止内核的抢占死锁,spin_lock_irq为了防止内核和中断的抢占死锁,spin_lock_irqsave 为了防止进入自旋状态丢掉之前的中断状态。 所以如果不懂的话,直接用spin_lock_irqsave是最靠谱的,如果懂的人,就可以选择用spin_lock。 关注公众号,后台回...
2. 为何需要关闭内核抢占:假如进程A获得spin_lock->进程B抢占进程A->进程B尝试获取spin_lock->由于进程B优先级比进程A高,先于A运行,而进程B又需要A unlock才得以运行,这样死锁。所以这里需要关闭抢占。 这个原理RTOS的mutex/semaphore是否相同? a. 因为ThreadX的semaphore,假如进程B获取sema失败,会一直等待,直到A...
spin」ock():不关闭CPU中断,中断可以打断。主要用于中断上下文,防止多核 的情况下,中断临界资源被其它CPU访问。 spinJockJrqO:关闭CPU屮断,屮断和进程都不可以打断。主要用于进程上下文,防 .11:进程被1卩断和其它进程访问临界资源。 spin_lock_irqsave():保存中断标志,关闭CPU中断,中断和进程都不可以打断,解锁 ...
在Linux内核中何时使用spin_lock,何时使用spin_lock_irqsave很容易混淆。首先看一下代码是如何实现的。 spin_lock的调用关系 spin_lock | + ---> raw_spin_lock | +---> _raw_spin_lock | +---> __raw_spin_lock 1. 2. 3. 4. 5. 6
在SMP机器上,我们必须使用spin_lock_irqsave而不是来自中断上下文的spin_lock_irq。 为什么我们要保存标志(包含IF)? 是否有另一个中断例程可以中断我们? 请您参考如下方法: 我是内核的新手,但是从我从罗伯特·洛夫(Robert Love)的书“Linux Kernel Development”(Linux内核开发)中了解到的情况来看,如果在代码开始锁...
2. 为何需要关闭内核抢占:假如进程A获得spin_lock->进程B抢占进程A->进程B尝试获取spin_lock->由于进程B优先级比进程A高,先于A运行,而进程B又需要A unlock才得以运行,这样死锁。所以这里需要关闭抢占。这个原理RTOS的mutex/semaphore是否相同? a. 因为ThreadX的semaphore,假如进程B获取sema失败,会一直等待,直到A进...
在Linux内核中何时使用spin_lock,何时使用spin_lock_irqsave很容易混淆。首先看一下代码是如何实现的。 spin_lock的调用关系 spin_lock | + ---> raw_spin_lock | +---> _raw_spin_lock | +---> __raw_spin_lock [cpp]view plaincopy staticinlinevoid ...