码迷,mamicode.com
首页 > 系统相关 > 详细

Linux设备驱动程序 之 顺序锁

时间:2019-10-29 19:56:42      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:而且   常用   linux   处理程序   保护   inux   get   获取   冲突   

当要保护的资源很小,很简单,会频繁的被访问而且写入访问很少的且必须快速时(即读不允许让写饥饿),就可以使用顺序锁(seqlock);从本质上讲,顺序锁会允许读取者对资源的自由访问,但需要读取者检查是否和写入者发生冲突,当这种冲突发生时,就需要重试对资源的访问;

顺序锁通常不能用于保护包含指针的数据结构,因为在写入者修改该数据结构的同时,读取这可能会追随一个无效指针;

seqlock定义在<linux/seqlock>中,通常用于初始化seqlock的方法有:

静态定义和初始化:

1 #define DEFINE_SEQLOCK(x)

动态定义和初始化:

1 seqlock_t x;
2 #define seqlock_init(x)

写锁的使用方式如下,写锁是使用自旋锁实现的:

1 write_seqlock(&x)
2 /* 写数据 */
3 write_sequnlock(&x);

读取访问通过获得一个无符号整数顺序值进入临界区,在退出时,该顺序值会合当前值进行比较,如果不相等,则必须重试读取访问;读取者代码会如下编写:

1 do {
2     seq = read_seqbegin(&the_lock);
3     /* 需要完成的工作 */
4 } while read_deqretry(&the_lock, seq);

这种类型的锁通常用于保护某种类型的简单计算,这种计算需要多个一致的值,如果计算结果时发现已经发生并发的修改,则可以简单丢弃结果并重新计算;

如内核中获取jiffies中的使用,如下:

 1 u64 get_jiffies_64(void)
 2 {
 3     unsigned long seq;
 4     u64 ret;
 5 
 6     do {
 7         seq = read_seqbegin(&jiffies_lock);
 8         ret = jiffies_64;
 9     } while (read_seqretry(&jiffies_lock, seq));
10     return ret;
11 }

 

如果在中断处理程序中使用seqlock,则应该使用IRQ安全的版本;

 

Linux设备驱动程序 之 顺序锁

标签:而且   常用   linux   处理程序   保护   inux   get   获取   冲突   

原文地址:https://www.cnblogs.com/wanpengcoder/p/11760767.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!