RCU适用的场景很多,其可以替代:读写锁、引用计数、垃圾回收器、等待事物结束等,而且有更好的并行扩展性。但RCU也有一些不适用的场景,如写侧重;临界区长;临界区内休眠等场景。
不过,所有的无锁原语也只能解决读端的并行可扩展性问题,写端的并行可扩展性只能通过数据分割技术来解决。
数据分割技术分割数据结构,减少共享数据,是解决并行可扩展性的根本办法。对分割友好(即并行友好)的数据结构有:
数组
哈希表
基树(Radix Tree)/稀疏数组
跳跃列表(skip list)
使用这些便于分割的数据结构,有利于我们通过数据分割来改善并行可扩展性。
除了使用合适的数据结构外,合理的分割指导规则也很重要:
读写分割:以读为主的数据与以写为主的数据分开;
路径分割:按独立的代码执行路径来分割数据;
专项分割:把经常更新的数据绑定到指定的CPU/线程中;
所有权分割:按CPU/线程个数对数据结构进行分割,把数据分割到per-cpu/per-thread中;
4种分割规则中,所有权分割是分割最彻底的。
以上这些多核并行编程内容基本上涵盖了Linux kernel中所有的并发编程关键技术。当然并行编程还有很多其他技术没有应用到Linux kernel中的,如无副作用的并行函数式编程技术(Erlang/Go等)、消息传递、MapReduce等等。