RCU就是读-复制-修改(Read-Copy-Update)的意思,它是一种高性能的锁机制,具有很好的扩展性。但是这种锁机制的使用范围比较窄,只适用于读多写少的情况。RCU的原理是对于被RCU保护的共享数据结构,读者不需要获得任何锁就可以访问它,但写者在访问它时需要先复制一个副本,然后对副本进行修改,最后调用一个回调(callback)函数在适当的时机把指向原来数据的指针指向新的被修改的数据。这个时机就是所有引用该数据的任务都退出对共享数据的操作。
RCU读者最基本的函数组合如下:
#definercu_read_lock()preempt_disable()//进入读操作临界区标记
#definercu_read_unlock()preempt_enable()//退出读操作临界区
RCU写者一般先对副本进行操作,然后将副本设定为新正本,最后同步或者异步地释放旧的正本。call_rcu函数为异步机制;synchronize_rcu函数为同步机制。函数原型如下:
call_rcu函数调用后,直接返回,RCU软中断会调用回调函数释放旧数据指针。synchronize_rcu函数则会原地等待,它被唤醒时,即可释放旧数据指针。
例3.2 RCU实例
代码见\samples\3synchronous\3-2rcu。核心代码如下:
应用层核心代码如下:
本例运行结果如下:(www.xing528.com)
[root@urbetter drivers]#insmod rcu.ko
[root@urbetter drivers]#mknod/dev/fgj c 2240
[root@urbetter drivers]#./test
open/dev/fgj successfullyoldprisNULL
read successfully:fgj
[root@urbetter drivers]#./test
open/dev/fgj successfullycallback_functionkfree
read successfully:fgj
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。