Read Copy Update /RCU
可以单个写,多个读,在内核中常用于更新链表。对比顺序锁,只能用指针访问资源,读数据无需加锁,避免多次读数据。
应用场景:
- 多个读
- 少量写
- 写相较于读具有更高优先级
rcu保持数据指针的引用,当资源发生变化时:
- 创建一份数据的拷贝
- 进行修改
- 所有reader结束后,指针更新
<linux/rcupdate.h>
rcu_read_lock()
rcu_read_lock()
synchronize_rcu()/call_rcu()
rcu_assign_pointer()
rcu_derefenrence()
kfree申请的动态内存
- 使用synchronize_rcu(),在函数后才可以安全kfree为了rcu_derefenrence为kmalloc的内存。
- 使用call_rcu(struct rcu_head* head, callback_func),在回调函数中kfree。
RCU reader的生命周期
当RCU reader进入临界区时,会调用rcu_read_lock();当退出临界区时,会调用rcu_read_unlock();