序列计数与序列锁Seqcount / seqlock

用写入前后变化的序列值检测读写重叠,读者复制数据并在校验失败时重试。

核心约束
成功的普通 seqcount 读取需要首尾序列相同且为偶数;写侧必须串行化并满足抢占约束。
适用问题
短小、多字段、读多写少且允许重试的一致快照,例如系统时间。
边界与取舍
不能仅靠序列计数保护可被释放的指针;seqcount_t 需外部写锁,seqlock_t 自带写侧锁,latch 变体另有规则。
read seqcopy datacheck seqacceptchanged → retry
读前取得稳定序号,读后检查期间是否发生写入;写者仍须正确串行化,并满足序列计数使用约束。

常见操作#

d 为一次快照复制的数据量,r 为读取重试次数。

操作时间成本条件与说明
读取一致快照O((r+1)d)O((r+1)d)复制前后检查序列号;r 没有固定上界,写者频繁更新时读者可能长时间重试。
写入写侧锁 / 屏障 + 数据修改普通 seqcount 自身不串行化写者;seqlock 增加写锁,且必须满足不可被相应读者抢占的要求。

时间与空间#

时间成本
无冲突读取约 O(d)O(d),冲突增加重试
空间成本
序列计数 / 写锁 + 读者快照副本

适合可重试的短数据快照。单凭序列号无法保护读者解引用的指针所指对象不被释放。

工程中的应用#

1 个案例 · 附源码
基础原理参考资料

Linux 6.12 · Sequence counters and sequential locks重试协议、写者串行化、抢占条件和指针限制。

3 个概念