当前位置:首页 > 电源 > 数字电源
[导读]一、自旋锁 自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,即在标志寄存器中关闭/打开中断标志位,不需要自

一、自旋锁

自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,即在标志寄存器中关闭/打开中断标志位,不需要自旋锁)。

自旋就是自己连续的循环等待。如果你有抱着你的爱人旋转的经历,那么你应该知道一件事情,为了安全,你不能旋转太久,你的爱人如果头昏,也想你早日释放。是的,自旋的缺点,就是它频繁的循环直到等待锁的释放,将它用于可以快速完成的代码中才好。

自旋不能抢占,但能中断。
 
相关话题:SMP和cpu。多个cpu和单个cpu。很多书说自旋锁只能在多处理机中使用,这是不正确的。

首先定义
Spinlock_t lock;
对不起,我只能找到arm平台的锁了
/*
 * ARMv6 Spin-locking.
 *
 * We (exclusively) read the old value, and decrement it.  If it
 * hits zero, we may have won the lock, so we try (exclusively)
 * storing it.
 *
 * Unlocked value: 0
 * Locked value: 1
 */
typedef struct {
 volatile unsigned int lock;
#ifdef CONFIG_PREEMPT
 unsigned int break_lock;
#endif
} spinlock_t;
补上x86平台
#define SPINLOCK_MAGIC 0x1D244B3C
typedef struct {
 unsigned long magic;
 volatile unsigned long lock;
 volatile unsigned int babble;
 const char *module;    // 所属模块
 char *owner;
 int oline;
} spinlock_t;
Lock为0时可以用,1是等待。0像锁孔,当没有钥匙插进去时,它才可以插进去


怎么初始化呢?
#define spin_lock_init(x)
 do {
  (x)->magic = SPINLOCK_MAGIC;
  (x)->lock = 0;                ;0初始化,表示可用
  (x)->babble = 5;
  (x)->module = __FILE__;      
  (x)->owner = NULL;
  (x)->oline = 0;
 } while (0)
定义一个自旋锁的方法很有意思,
Spinlock_t lock=?????

可以通过spin_lock
Spin_lock_irqsave 来调用自旋锁,后者不允许中断。前者有可能在上锁中发生中断。
还有spin_trylock 这是一个绝不妥协的函数,它不等待。


恢复为spin_unlock
Spin_unlock_irqrestore

考查下面代码
#define spin_lock_irqsave(lock, flags) _spin_lock_irqsave(lock, flags)
#define _spin_lock_irqsave(lock, flags)
do { 
 local_irq_save(flags);       保存中断请求标志
 preempt_disable();          不允许抢占
 _raw_spin_lock(lock);
 __acquire(lock);
} while (0)

二、自旋锁综合使用
下面是一个使用的例子,你可以使用source insight查到它
/* never called when PTRS_PER_PMD > 1 */
void pgd_dtor(void *pgd, kmem_cache_t *cache, unsigned long unused)
{
 unsigned long flags; /* can be called from interrupt context */

 spin_lock_irqsave(&pgd_lock, flags);  枷锁
 pgd_list_del(pgd);
 spin_unlock_irqrestore(&pgd_lock, flags); 释放
}

中断枷锁
#define spin_lock_irqsave(lock, flags) _spin_lock_irqsave(lock, flags)
分析
unsigned long __lockfunc _spin_lock_irqsave(spinlock_t *lock)
{
 unsigned long flags;

 local_irq_save(flags); 将寄存器存入flags,并关中断
 preempt_disable();   抢占锁
 _raw_spin_lock_flags(lock, flags);  枷锁
 return flags;
}
EXPORT_SYMBOL(_spin_lock_irqsave);[!--empirenews.page--]

继续
/* For spinlocks etc */
#define local_irq_save(x) __asm__ __volatile__("pushfl ; popl %0 ; cli":"=g" (x): /* no input */ :"memory")
将标志寄存器的内容放在内存x中。请查看gcc汇编

继续
static inline void _raw_spin_lock_flags (spinlock_t *lock, unsigned long flags)
{
#ifdef CONFIG_DEBUG_SPINLOCK
 if (unlikely(lock->magic != SPINLOCK_MAGIC)) {
  printk("eip: %p ", __builtin_return_address(0));
  BUG();
 }
#endif
 __asm__ __volatile__(
  spin_lock_string_flags
  :"=m" (lock->slock) : "r" (flags) : "memory");
}
继续
#define spin_lock_string_flags
 " 1: "
 "lock ; decb %0 "    ;lock总线锁住,原子操作
 "jns 4f "
 "2: "
 "testl $0x200, %1 "
 "jz 3f "
 "sti "
 "3: "
 "rep;nop "
 "cmpb $0, %0 "
 "jle 3b "
 "cli "
 "jmp 1b "
 "4: "
理解一下大概意思,就可以了。当lock-1后大于等于0就可以关中断继续执行了,否则nop空操作。Nop期间,cpu可以执行其他任务的代码。

解锁
#define spin_unlock_irqrestore(lock, flags) _spin_unlock_irqrestore(lock, flags)
void __lockfunc _spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)
{
 _raw_spin_unlock(lock);
 local_irq_restore(flags);
 preempt_enable();
}

static inline void _raw_spin_unlock(spinlock_t *lock)
{
#ifdef CONFIG_DEBUG_SPINLOCK
 BUG_ON(lock->magic != SPINLOCK_MAGIC);
 BUG_ON(!spin_is_locked(lock));
#endif
 __asm__ __volatile__(
  spin_unlock_string
 );
}
Raw赤裸的解锁,表示最低沉的解锁原理。
#define spin_unlock_string
 "xchgb %b0, %1"
  :"=q" (oldval), "=m" (lock->slock)
  :"0" (oldval) : "memory"
加1.解锁

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

成都2022年10月19日 /美通社/ -- 近期,平安养老险积极筹备个人养老金的产品设计和系统开发工作,发展多样化的养老金融产品,推动商业养老保险、个人养老金、专属商业养老保险等产品供给。 搭养老政策东风 ...

关键字: 温度 BSP 东风 大众

广东佛山2022年10月19日 /美通社/ -- 空间是人居生活的基础单元,承载着生存与活动的最基本功能。而对于理想空间的解构意义却在物理性容器之外,体现出人们对于空间和生活深层关系的思考,同时也塑造着人与空间的新型连接...

关键字: 温度 BSP 智能化 进程

上海2022年10月19日 /美通社/ -- 10月17日晚间,安集科技披露业绩预告。今年前三季度,公司预计实现营业收入7.54亿元至8.33亿元,同比增长60.24%至77.03%;归母净利润预计为1.73亿...

关键字: 电子 安集科技 BSP EPS

北京2022年10月19日 /美通社/ -- 10月18日,北京市经济和信息化局发布2022年度第一批北京市市级企业技术中心创建名单的通知,诺诚健华正式获得"北京市企业技术中心"认定。 北京市企业技...

关键字: BSP ARMA COM 代码

北京2022年10月18日 /美通社/ -- 10月14日,国际数据公司(IDC)发布《2022Q2中国软件定义存储及超融合市场研究报告》,报告显示:2022年上半年浪潮超融合销售额同比增长59.4%,近5倍于...

关键字: IDC BSP 数字化 数据中心

上海2022年10月18日 /美通社/ -- 2022年9月5日,是首都银行集团成立60周年的纪念日。趁着首都银行集团成立60周年与首都银行(中国)在华深耕经营12年的“大日子”,围绕作为外资金融机构对在华战略的构想和业...

关键字: 数字化 BSP 供应链 控制

东京2022年10月18日  /美通社/ -- NIPPON EXPRESS HOLDINGS株式会社(NIPPON EXPRESS HOLDINGS, INC.)旗下集团公司上海通运国际物流有限公司(Nipp...

关键字: 温控 精密仪器 半导体制造 BSP

广州2022年10月18日 /美通社/ -- 10月15日,第 132 届中国进出口商品交易会("广交会")于"云端"开幕。本届广交会上高新技术企业云集,展出的智能产品超过140,...

关键字: 中国智造 BSP 手机 CAN

要问机器人公司哪家强,波士顿动力绝对是其中的佼佼者。近来年该公司在机器人研发方面获得的一些成果令人印象深刻,比如其开发的机器人会后空翻,自主爬楼梯等。这不,波士顿动力又发布了其机器人组团跳男团舞的新视频,表演的机器人包括...

关键字: 机器人 BSP 工业机器人 现代汽车

南京2022年10月17日 /美通社/ -- 日前《2022第三届中国高端家电品牌G50峰会》于浙江宁波落幕,来自两百余名行业大咖、专家学者共同探讨了在形势依然严峻的当下,如何以科技创新、高端化转型等手段,帮助...

关键字: LINK AI BSP 智能家电

数字电源

15504 篇文章

关注

发布文章

编辑精选

技术子站

关闭