Chinaunix首页 | 论坛 | 博客
  • 博客访问: 481638
  • 博文数量: 93
  • 博客积分: 1431
  • 博客等级: 上尉
  • 技术积分: 1006
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-18 10:30
文章分类

全部博文(93)

文章存档

2011年(20)

2010年(2)

2009年(71)

我的朋友

分类: LINUX

2009-10-26 15:56:02

linux 设备驱动 并发控制中常用的一些手段:自旋锁(spinlock),信号量(semmaphore),完成量(completion),互斥体(MUTEX),中断屏蔽,原子操作,读-拷贝-更新 等

最常用要数自旋锁(spinlock),信号量(semmaphore)了,现比较其区别如下:
1.临界区时间 长 时用 信号量(semmaphore),
临界区时间 短 时用 自旋锁(spinlock)。

2.临界区代码里有可能引发阻塞的代码时,一定不能用自旋锁(spinlock),要用信号量(semmaphore)。
copy_from_user(),copy_to_user()和kmalloc() 等函数有可能引起阻塞。
在中断(上下文)处理函数,tasklet和内核定时器等非进程上下文中不能阻塞。
如此时用kmalloc()申请内存时应用 GFP_ATOMIC 标志申请内存(若不存在空闲页时不等待,直接返回)

3.如果被保护的共享资源要在中断或是软中断情况下使用的话,只能用自旋锁(spinlock)
如果非要用信号量的话,也只能用down_trylock()方式进行,不能获取就立即返回以避免阻塞

详情可参见:

http://www.ibm.com/developerworks/cn/linux/l-synch/part1/


阅读(1126) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~