免费注册 查看新帖 |

Chinaunix

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

同步机制--自旋量 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-17 13:25 |只看该作者 |倒序浏览


文件:
内核同步机制v1.rar
大小:
10KB
下载:
下载
下载

第一章 自旋锁... 1
第二章 自旋锁综合使用... 3


1           关于本博客
本博客中的文章不会涉及linux的操作层次,我只会一步一步去深入内核。错别字在所难免,瑕不掩瑜。
需要多久的时间才能精通linux内核,网上说需要三年的全职工作,我不对其结论。
但有一点很清楚,如果你决定去学linux,那么你应该把她当作一种宗教信仰,否则难以学会。
本系列至少会出100篇linux内核的文章,由点到线再到面的学习方法,希望能减轻你的学习痛苦。你将在阅读中体会到幽默和乐趣。
一个月,两个月几乎不可以学好,可能要一年。就如本博客名一样“郑钱多多”,如果你学好,年薪会在20万以上。

本博客地址:
http://qianduoduo.cublog.cn
钱多多cublog
讨论邮箱:
loveher147@qq.com
两年内讨论有效。现在时间2009年6月15日
2           传播许可
任何人都可以用鲜红色,四号黑体字修改本文档,以区别原始文档,并且你应该发一份到邮箱
loveher147@qq.com
,以便作者进一步完善。当然你可以加上你的名字和联系方式,让更多的读者了解你的能力。

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

自旋不能抢占,但能中断。

相关话题: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,并关中断
%3

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP