RCU锁

本文深入探讨了RCU(Read-Copy Update)机制在并发编程中的应用,包括RCU的三种类型:传统RCU锁、可抢占RCU锁和树形RCU锁。详细解释了RCU如何通过读端和写端的锁机制实现高效并发,以及如何通过`synchronize_rcu`和`call_rcu`函数管理读写操作。同时,文章还对比了不同类型的RCU锁在并发控制上的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

rcu

critical sesction 临界区

read-side 读端
write-side 写端

rcu_read_lock()
rcu_read_unlock()

RCU read-side critical sesctions are delimited by rcu_read_lock() and rcu_read_unlock() and may be nested.
rcu 读端临界区由rcu_read_lock() 和 rcu_read_unlock()决定,并且有可能是嵌套的。

synchronize_rcu()
该函数由RCU写端调用,它将阻塞写者,直到经过grace period后,即所有的读者已经完成读端临界区,写者才可以继续下一步操作。如果有多个RCU写端调用该函数,他们将在一个grace period之后全部被唤醒。多个写着之间需要加锁保护数据。

void fastcall call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu))
函数 call_rcu 也由 RCU 写端调用,它不会使写者阻塞,因而可以在中断上下文或 softirq 使用,而 synchronize_rcu、synchronize_kernel 和synchronize_shced 只能在进程上下文使用。该函数将把函数 func 挂接到 RCU回调函数链上,然后立即返回。一旦所有的 CPU 都已经完成端临界区操作,该函数将被调用来释放删除的将绝不在被应用的数据。参数 head 用于记录回调函数 func,一般该结构会作为被 RCU 保护的数据结构的一个字段,以便省去单独为该结构分配内存的操作。需要指出的是,函数 synchronize_rcu 的实现实际上使用函数call_rcu。


传统rcu锁
可抢占rcu锁
树形rcu锁

传统rcu锁,依赖进程切换,在临界区的时候组织进程抢占,推出临界区后只有当进程抢占才标记quiescent state,当所有cpu都就经过了一个quiescent state后,就可以调用回调函数进行处理了。
可抢占rcu锁,已经于进程切换无关了,在读端临界区内也可以发生抢占,rcu根据lock和unlock进行统计,当前阶段所有的cpu都解锁后,就可以调用回调函数了。
树形rcu锁,假设有很多cpu,把cpu分组2个一组,组内进行竞争,当组内所有cpu都完成竞争后,这时候在组与组竞争,完成最后的竞争后,就可以调用回调函数了。这个模式很像,两两分组pk,每一级都进行分组,直到最后冠军诞生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值