03 | 并行设计(下):如何高效解决同步互斥问题?
尉刚强
你好,我是尉刚强。
我曾经主导过一个性能优化的项目,该项目的主要业务逻辑是在线抢货并购买。在原来的设计方案中,我们为了保证库存数据的一致性,后端服务在请求处理中使用了 Redis 互斥锁,而这就导致系统的吞吐量受限于 30TPS,不能通过弹性扩展来提高性能。
那我们是怎么解决这个问题的呢?后来我们使用无锁化来实现性能的拓展,系统吞吐量一下就提升至 1000TPS,相比原来提升了 30 倍之多。
所以你看,同步互斥是影响并发系统性能的关键因素之一,一旦处理不当,甚至可能会引起死锁或者系统崩溃的危险。
这节课,我就会带你去发现并发系统中存在的同步互斥问题,一起思考、分析引起这些问题的根源是什么,然后我 会介绍各种同步互斥手段的内部实现细节,帮助你理解利用同步互斥的具体原理及解决思路。这样,你在深入理解同步互斥问题的本质模型后,就能够更加精准地设计并发系统中的同步互斥策略,从而帮助提升系统的关键性能。
好,接下来,我们就从并发系统中存在的同步互斥问题开始,一起来看看引起同步互斥问题的内在根源是什么吧。
并行执行的核心问题
从计算机早期的图灵机模型,到面向过程、面向对象的软件编程模型,软件工程师其实早已习惯于运用串行思维去思考和解决问题。而随着多核时代的来临,受制于硬件层面的并发技术的发展,为了更大地发挥 CPU 价值,就需要通过软件层的并行设计来进一步提升系统性能。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了并行设计中的同步互斥问题及解决方法。首先指出了同步互斥对并发系统性能的影响,以及可能引发的死锁和系统崩溃风险。通过示例展示了程序运行结果的不确定性,并分析了原子性破坏、缓存一致性和顺序一致性等三个根源问题。随后介绍了互斥锁的原理与性能,包括内存屏障指令的作用和互斥锁可能导致的线程休眠带来的性能影响。最后,提出了通过减少临界区的大小来优化性能,并引出了自旋锁的基本原理与性能表现。文章还介绍了volatile类型变量和CAS指令在解决并发系统中的缓存一致性和原子性问题上的作用。总体而言,本文对并行设计中同步互斥问题的根源及解决方法进行了深入浅出的介绍,对于想要深入了解并发系统性能优化的读者具有一定的参考价值。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《性能优化高手课》,新⼈⾸单¥59
《性能优化高手课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(5)
- 最新
- 精选
- 青山应该不行, 因为Redis的setnx是实现分布式锁的一种方案, 如果Redis本身支持 就不用再调用setnx来加锁了
作者回复: Redis的很多接口是原子性的,只是接口操作原子性。但是锁解决问更大粒度一致性的问题,两个层级不一样
2021-06-07 - 落叶之葉学习学习
作者回复: 希望对你有收获
2021-05-26 - Joe Black这个和编译优化也有关系吧?是不是得禁止编译器把对xy的设置乱序执行?2022-09-10归属地:北京
- 有猴儿自远方来无锁编程我认为就是保证指令操作的有序、不被打断。Redis是单线程,就指令来说都是串行执行的,我认为可以2021-10-13
- 云彩&草原我认为不行,会有ABA问题。2021-09-10
收起评论