免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1078 | 回复: 0
打印 上一主题 下一主题

spin_lock详解 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-05 11:55 |只看该作者 |倒序浏览
与UP和SMP无关的定义:
typedef struct {
volatile unsigned int lock;
} spinlock_t;
#define SPIN_LOCK_UNLOCKED  (spinlock_t){ 0 }
#define local_irq_save(x) __asm__ __volatile__(\"pushfl ; popl %0 ;
cli\":\"=g\" (x): /* no input */ :\"memory\")
spin_lock()在UP和SMP的不同:
UP下:
#define spin_lock(x) (void)lock
#define spin_unlock(x) do {} while(0)
可见,spin_lock(x)和spin_unlock(x)在UP环境下什么都不做。
SMP下:
void spin_lock(spinlock_t *plock)的执行过程如下:如果plock->lock=1,说明已被锁住,则 CPU 就不能去使用它所保护的资料结构;如果plock->lock=1,说明已被锁住,则可以从spin_lock()传回,接下去使用它所保护的资料。
spin_lock_irqsave()在UP和SMP的不同:
#define spin_lock_irqsave(lock,flags)
do { local_irq_save(flags);
spin_lock(lock); } while (0)
可见在UP和SMP下,spin_lock_irqsave()的代码是一样的,但是由于“在UP和SMP下,spin_lock(lock)函数的实现不同”,导致了“在UP和SMP下,spin_lock_irqsave()函数的实现不同”。
local_irq_save(flags) 做的事就是将 CPU 的 flag 值先储存到 flags 变数里,然后将 CPU 的中断 diable 掉。这里将
CPU 的中断 disable 是指将执行这段 code 的 CPU,并不是指全部的 CPU。 也就是说它只会 disable local CPU 的中断。local_irq_save(flags)保证了本地cpu(执行这段code的cpu)不会打断临界区代码的执行;spin_lock()则保证了其他的cpu不会打断临界代码的执行。
举例:
spinlock t xxx lock = SPIN_LOCK_UNLOCKED;
unsigned long flags;
spin
lock irqsave (&xxx lock, flags)
...critical section...
spin unlock
irqrestore (&xxx lock, flags)
在UP下的实现:
spinlock_t xxx_lock = SPIN_LOCK_UNLOCKED;
unsigned long flags;
local_save_flags(flags);
... critical section ...
local_restore_flags(flags);
具体请查看:http://www.yuanma.org/data/2007/0123/article_2168.htm
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/73067/showart_2046163.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP