Linux 2.6内核中新的锁机制--RCU

源自:
Linux源码中附带的Document
http://www.ibm.com/developerworks/cn/linux/l-rcu

摘要:
RCU(Read-Copy Update)。对于被RCU保护的共享数据结构,读者不需要获得任何锁就可以访问它,但写者在访问它时首先拷贝一个副本,然后对副本进行修改,最后使用一个回调(callback)机制在适当的时机把指向原来数据的指针重新指向新的被修改的数据,这个时机就是所有引用该数据的CPU都退出对共享数据的操作。

读者在访问被RCU保护的共享数据期间不能被阻塞。

写者在访问被RCU保护的共享数据时不需要和读者竞争任何锁,只有在有多于一个写者的情况下需要获得某种锁以与其他写者同步。写者修改数据前首先拷贝一个被修改元素的副本,然后在副本上进行修改,修改完毕后它向垃圾回收器注册一个回调函数以便在适当的时机执行真正的修改操作。等待适当时机的这一时期称为grace period,而CPU发生了上下文切换称为经历一个quiescent state,grace period就是所有CPU都经历一次quiescent state所需要的等待的时间。垃圾收集器就是在grace period之后调用写者注册的回调函数来完成真正的数据修改或数据释放操作的。

函数摘要:
/*读者在读取由RCU保护的共享数据时使用该函数标记它进入读端临界区。*/
rcu_read_lock()


/*
该函数与rcu_read_lock配对使用,用以标记读者退出读端临界区。夹在这两个函数之间的代码区称为"读端临界区"(read-side critical section)。读端临界区可以嵌套,如图3,临界区2被嵌套在临界区1内。
*/
rcu_read_unlock()


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


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

/*
写端调用,把一个指针p赋为指针v。
*/
rcu_assign_pointer()
typeof(p) rcu_assign_pointer(p, typeof(p) v);

/*
获得指针p的解引用值
*/
rcu_dereference()
typeof(p) rcu_assign_pointer(p, typeof(p) v);


你可能感兴趣的:(数据结构,linux,IBM)