RCU

RCU基于这样一个现实,那就是不论什么架构,访问一个单一机器字是原子的,也就是说:访问一个指针变量是原子的,这是天然的,不用自旋锁保护的多核同步操作。所以RCU用来保护的资源只有一个指针,至于这个指针指向一个对象还是内存块它完全不关心。

当你要操作删除一个指针指向的资源时,你可以直接删除,不用担心系统奔溃,比如直接将指针改为NULL,但你要小心旧指针指向的资源,可能其他核正在访问,所以如何释放旧指针指向的资源是它的难点。而对于新的访问指针的核来说,它们只会看到NULL,所以不需要担心。

那么如何释放旧资源呢?这里需要保证的是,如何保证你在释放的时候,没有核正在访问你的旧资源。所以,对于RCU来说,访问资源的方式就比较特别,你需要关闭中断(关中断,访问资源,开中断)如果系统跟踪每一个RCU,记录它的访问者,在释放旧资源时参考这个记录信息,那么这不太现实。

所以,系统只会跟踪每个CPU的中断状态,比如,一个CPU经历了一次中断,那么代表着如果它有RCU访问,那么RCU访问也结束了。所以,当你发送IPI的时候,如果对方接受,那代表它经过了一次中断,如果对方有RCU的访问,那么也结束了,释放RCU的工作会被注册成一个任务,这个任务关联到一个时间点,凡是这个时间之后,所有的CPU经历过一次中断,那么代表这个旧资源是没有任何人访问,如果有的新访问操作,也只会看到RCU的新资源,就是NULL,当你注册释放工作这个时间点之后,如果所有的CPU经过一次中断,就可以安全释放旧资源了,这就是RCU的核心,所以每当CPU经历一次中断,都会记录下来。就跟流水线上一样,以批次释放。
 

猜你喜欢

转载自blog.csdn.net/qq_27212673/article/details/84714955
RCU