请教RCU干吗用CPU宽限期 而不是用资源引用计数方式?
RCU旧资源的释放使用了CPU宽限期的概念,按我的理解就是通过让各个CPU core 经过一个静止期然后再释放资源。实现方式也是把各个CPU core表示成位图里的一位。
当是我很疑惑,为什么不用简单的资源引用计数的方式来释放资源?
即设立一个资源引用计数,当没有人再读旧资源时,计数减为零,然后再RCU写过程里被释放。
总之,不明白 RCU 旧资源释放为什么用这么复杂的“CPU静止期计算”的方式? 有什么设计上的考虑或限制?
望请各位大拿解惑。
谢谢! 好处之一是:
rcu的读临界区可以做到无额外开销。
引用计数需要原子操作,在内核的性能敏感区也是无法忍受原子操作带来的开销。 回复 2# kmindg
感谢kmindg的回复,handshake.
但是CPU宽限期的实现也是用到了锁,也涉及到原子操作,我的理解是 linux 维护一个位图cpumask,每个 CPU core 都对应其中的一个bit,每个core在经历过一个宽限期后都要锁这个位图并把相应位写0,全为0时,写进程就可以释放旧资源了,最新的linux虽然不用位图实现,改用树实现,但是锁肯定是用的,这难免也用到原子操作。 这样维护的代价也不小。。。
实在是迷惑。。。
回复 3# zhaoyantemp
但是你说的这些操作,都不是在读临界区的吧
我也只是了解一点,我说的并不一定是最大因素。 kmindg 发表于 2014-11-25 18:55 static/image/common/back.gif
回复 3# zhaoyantemp
kmindg 说的是对的,使用RCU的目的,是最大程度的减低读的操作开销,做到无锁操作。但有利就有弊,数据的替换很复杂,同时RCU并不能去掉写锁。
用引用计数的话,方案是简单,但引用计数需要锁来保护,那读者就简介的拿了锁了。
页:
[1]