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/
阅读(1152) | 评论(0) | 转发(0) |