手机网站做指向,如何做网页推广,软文广告经典案例300,我需要做网站目录背景解决方法共享内存无锁操作新/老共享数据结构rte_ringrefcnt延迟释放方法1#xff1a;读的线程来释放方法2#xff1a;释放线程等到读线程轮询一轮参考背景
dpvs多线程#xff0c;如何做到节约内存、高性能之间的均衡。
解决方法
共享内存
多线程共享内存#x…
目录背景解决方法共享内存无锁操作新/老共享数据结构rte_ringrefcnt延迟释放方法1读的线程来释放方法2释放线程等到读线程轮询一轮参考背景
dpvs多线程如何做到节约内存、高性能之间的均衡。
解决方法
共享内存
多线程共享内存意味着节约内存。
无锁操作
无锁操作意味着高性能。 如果是配置 per-core也可以做到高性能不需要加锁但是会浪费内存。 多线程共享内存如何做到无锁呢
新/老共享数据结构
从来都不是对原有共享数据结构进行更新 每次更新都是控制线程新建立一个共享数据结构在转发线程引用新的数据结构之前转发线程中继续使用原有老的共享数据结构。
rte_ring
通过 rte_ring 的方式将控制线程中创建的数据结构的指针传递给转发线程。
refcnt
原子变量的refcnt。 每次被转发线程引用数据结构则refcnt; 每次被转发线程解除引用老的数据结构时先引用新的结构然后解除对老的结构的引用【refcnt–】 refcnt为0时考虑将共享数据结构释放 【此时应该可以立刻释放也可以延迟释放】
延迟释放
如果是延迟释放主要是考虑的释放的时候是否有其他线程在读取。
方法1读的线程来释放
思想 释放旧数据的时候可能有线程在读某线程读完了旧数据之后再在这个线程中释放旧的数据做到了读和释放都是一个线程。【该线程读完旧的数据之后往后的轮询获取的都是新的数据不会再读取就的数据了然后就可以释放旧的数据了】
具体 可以在每个转发线程中构建一个释放节点的链表链表中每个节点包含要释放的数据释放函数等转发线程CAS的方式更新链表。 在控制线程中CAS的方式摘取每个转发线程的释放链表统一进行释放。
方法2释放线程等到读线程轮询一轮
释放旧的数据的线程在释放旧的数据的时候不确定是否有其他的线程正在读取这个数据。可以在释放之前等待其他线程轮询一轮之后后续其他线程再次读取的就是新的数据释放线程就可以释放旧的数据了。
参考
rust中的 无锁数据结构内存管理
https://rustmagazine.github.io/rust_magazine_2021/chapter_6/rust-lockfree.html#%E6%97%A0%E9%94%81%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86