阅读WebKit最近搞的一个存储开销小的、快速自适应的Locking机制

https://webkit.org/blog/6161/locking-in-webkit/


主要受Linux内核futex设计的启发:

https://www.kernel.org/doc/ols/2002/ols2002-pages-479-495.pdf Fuss, Futexes and Furwocks: Fast Userlevel Locking in Linux

这个作者里面的Rusty Russell就是Netfilter和KVM的作者。他2002年就提出了futex?


有了细粒度的自适应锁,JS就可以实现高性能的并行计算了!

WTF::Lock和WTF::Condition依赖于ParkingLot(这里API用汽车的入库出库做比喻,汽车就是Thread。)每个Lock需要1个byte的存储,实际用到2个bit的状态信息。此byte的内存地址进一步作为Hash Key索引到全局ParkingLot的队列。而队列里面的等待个数最大为全部Thread的数目(不是很多)


注意这里有个关键特性:一般atomics操作(CAS)只会设置一个比特位,而ParkingLot的Barging Lock需要用CAS来维护2个比特位(!),这相当于4个状态的状态机,而这4个状态之间的状态迁移是原子式更新的。——其实这样就好理解了,一般操作系统里面的同步原语一般只用2个状态(相当于1个比特位),多个状态下的状态机如何设计实际上属于工程内容,关键是 用CAS来维护多个状态的原子更新

其他的都是trival细节,并不重要。。。

你可能感兴趣的:(linux,kernel,Lock,webkit,futex,同步原语)