小区外的蒸米粉和Linux RCU锁

一直希望能用一种及其通俗的方式把Linux RCU锁(所谓两阶段可抢占RCU锁)描述出来。之前写过一篇:
《Linux内核RCU(Read Copy Update)锁简析》:https://blog.csdn.net/dog250/article/details/46848649
虽然把代码逻辑简化了,但是写得并不好,这个太针对于实现了…而如果真正理解了这个并且希望表达,那RCU的精髓应该是路边卖烤地瓜的都应该明白的。最近正好聊到了RCU,就又想起了这个话题。

  这里烤地瓜的不多,但有很多卖蒸米粉的,小区外面就有好几家,今早刚刚还吃了一份。我是最不爱玩手机的,等待出炉的间隙,我仔细观察了做蒸米粉的这个抽屉式炉子
小区外的蒸米粉和Linux RCU锁_第1张图片
本应该拍个照的,然而可能是骨子里抵触手机吧,全程没有把手机从裤兜里拿出来…

  师傅不停地拉开各个抽屉,看细节,然后就知道是不是该打进去一个鸡蛋,浇点汤汁…总之,每一层的抽屉容器里包含两部分内容:

  • 原材料
  • 加工工序

原材料是放进去的物品,比如粉条,蔬菜,鸡蛋等,而加工工序则是原材料到达什么程度要做什么事的一些列步骤,同时还有原材料没有达到什么程度不能做什么的规定,这一点更加重要!也许你会觉得我说的都是废话,家里做饭不都是这样吗?然而有个不同。

  家里做饭包括饭店后厨做饭是可以试错的,不同的人做饭是否好吃取决于该人在厨艺上的造诣,而这个蒸米粉却和KFC差不多,全部都是流程化操作,所以说,这简直是一个Howto!


嗯,Linux在RCU处理上的机制和蒸米粉非常类似!

  Linux RCU(以后简称RCU)将所谓的宽限期静默期等各种抽象成了容器,每一个调用rcu lock/unlock的task均在这些容器里进行,每一个容器携带一个callback list,只有当容器内的lock全部被unlock之后,才能被调用。这个理解起来非常简单。

  好了,现在被RCU容器分为了三类,这也是典型的分类,几乎存在于任何领域:

  • 空闲容器
  • 已经满载打好包的容器
  • 正在填充的容器

随着时间的流逝,这三类容器的角色在不断转变,这是一个在时间,空间两个维度不断延展的。在RCU容器中,如果该容器内所有的lock区域全部unlock了,那么该容器就算打好包了,这个时候就可以执行其callback list了,其实就是一个TODO list…

  现在,我把RCU的这三类容器按照时间和空间两个维度展开:
小区外的蒸米粉和Linux RCU锁_第2张图片

其中实线圆圈表示lock,虚线圆圈表示已经unlock。

  空闲的容器是可以被重用的,所以说根本就没有必然保留它们,即刻重用就好了。所以说,RCU容器只有两类即可:
小区外的蒸米粉和Linux RCU锁_第3张图片


其实,区块链的区块也是一种满足某种特定条件的容器,只是区块是永久容器,而RCU则是瞬时容器之间的区别。


本文并没有说透RCU的全部,比如强序型内存屏障的发布-订阅模式。也没有说Tree RCU的思想,更是没有提RCU最近的进化,所以本文依然只是一篇技术随笔,而不是工作文档。

你可能感兴趣的:(小区外的蒸米粉和Linux RCU锁)