dpdk无锁队列 无锁的线程池,和内存池,还有无锁的队列的设计思路是什么呢?
无锁的线程池,和内存池,还有无锁的队列的设计思路是什么呢?
今天的无锁设计得益于CPU对CAS操作的支持。因此,如果您想了解无锁设计,您应该首先了解什么是CAS。
CAS是compare and swap的缩写,中文翻译为“compare and exchange”。它的实现如下:有三个操作数,内存值V、旧的期望值a和要修改的新值B。当且仅当期望值与内存值相同时,将内存值V更改为B,否则将不执行任何操作。
下面是一个解释CAS算法的示例。假设有两个线程T1和T2同时访问同一变量10。因此,他们会将主内存的值复制到自己的工作内存空间中,因此T1和T2线程的预期值是10。
假设T1和T2竞争时,T1成功地将变量值更改为11,然后将其写入内存。当T2执行更新时,发现内存值已更改为11,这与预期值10不一致。也就是说,更新失败,然后重新执行前面的操作。
CAS操作类似于提交重试模式。当同步冲突发生的几率较小时,系统的性能会有很大的提高。
虽然CAS有效地解决了原子操作问题,但仍然存在三个问题:ABA问题、spin-CAS循环时间长、开销大、一个CAS只能保证一个变量的原子操作。针对这三个问题,不同的语言给出了解决方案。如果您想了解更多,可以查询您关注的解决方案。
由于缺乏硬件知识,如果您想知道CPU是如何实现的,可以查看CPU的相关信息。
多线程编程的时候,使用无锁结构会不会比有锁结构更加快?
这是毫无疑问的,因为线程锁定是资源密集型的
!那么,如何避免锁的性能下降呢?
1、从业务上避免大量锁结构
!2. 使用ThreadLocal,可以保证每个线程中的数据不会互相污染
!3. 如果读多写少,请使用读写锁
!4. 自旋锁将挑战CPU,尽管它是一个线程时间很少的锁
!5. 锁的粒度应该尽可能小:可以在方法中的锁不应该占用整个方法
dpdk无锁队列 无锁队列实现原理 ringbuffer 无锁队列
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。