主页
文章
分类
系列
标签
简历
【同步机制】rwlock和seqlock
发布于: 2022-3-22   更新于: 2022-3-22   收录于: Linux Kernel
文章字数: 65   阅读时间: 1 分钟   阅读量:

被淘汰的rwlock

rwlock和普通的spinlock区分了read和write,如果当前没有write,那么多个reader可以同时获取,如果当前没有reader,那么一个write可以获取这个rwlock

那为什么会被淘汰呢?原因在于如果多个reader在使用某个rwlock时,那么writer需要等待所有的reader都释放了rwlock,才可以获取,这会造成writer被饿死

seqlock

比起rwlock,seqlock解除了reader和writer之间的互斥。只保留了writer之间的互斥。 那么显而易见的问题,如果保证在reader读取期间,如果writer对变量进行了修改,如果保证读取数据的一致性呢?

seqlock基于spinlock添加了seqcount来保证一致性

1
2
3
4
typedef struct {
	struct seqcount seqcount;
	spinlock_t lock ;
}seqlock_t;

写入操作

每当writer持有seqlock时,sequence number加1

1
2
3
4
5
static inline void write_seqlock(seqlock_t *sl)
{    
	spin_lock(&sl->lock);    
	s->sequence++;
}

写入之后,准备释放锁之前 ,sequence number会再次加1

1
2
3
4
5
static inline void write_sequnlock(seqlock_t *sl)
{    
	s->sequence++;    
	spin_unlock(&sl->lock);
}

sequence number的初始值是一个偶数(even),因而当writer持有spinlock时,sequence number的值将是一个奇数(odd),释放后则又变成偶数。

读取操作

reader在读取一个共享变量之前,需要先读取一下sequence number的值,如果为奇数,说明现在有writer正在修改这个变量,需要等待,直到sequence number变为偶数,才可以开始读取变量。

读取变量之后,reader需要再次读取一下sequence number的值,并和读取之前的sequence number的值进行比较,看是否相等,相等则说明在此期间没有writer的操作。