Linux 内核实战课(同步篇):RCU
-
RCU 解决了什么
-
RCU 例子
-
RCU 原理
-
Grace Period
-
Quiescent Status
-
Linux 同步方式的总结
RCU 解决了什么
RCU 是读写锁的高性能版本,它的核心理念是读者访问的同时,写者可以更新访问对象的副本,但写者需要等待所有读者完成访问之后,才能删除老对象。读者没有任何同步开销,而写者的同步开销则取决于使用的写者间同步机制。
RCU 适用于需要频繁的读取数据,而相应修改数据并不多的情景,例如在文件系统中,经常需要查找定位目录,而对目录的修改相对来说并不多,这就是 RCU 发挥作用的最佳场景。
RCU 例子
RCU 常用的接口如下图所示:
API | 说明 |
---|---|
rcu_read_lock | 标记读者进入读端临界区 |
rcu_read_unlock | 标记读者退出临界区 |
synchronize_rcu | 同步RCU,即所有的读者已经完成读端临界区,写者才可以继续下一步操作。由于该函数将阻塞写者,只能在进程上下文中使用 |
call_rcu | 把回调函数 func 注册到RCU回调函数链上,然后立即返回 |
rcu_assign_pointer | 用于RCU指针赋值 |
rcu_dereference | 用于RCU指针取值 |
list_add_rcu | 向RCU注册一个链表结构 |
list_del_rcu | 从RCU移除一个链表结构 |
为了更好的理解,在剖析 RCU 之前先看一个例子: