目录

  • 缘起
  • 什么是Epoch Based Reclamation
  • 为什么要Epoch Based Reclamation
  • Epoch Based Reclamation的原理概述
  • 来个小例子
  • 结语

缘起

最近在看大佬视频,在用rust实现一个concurrenthashmap的时候,用到了crossbeam中epoch,顿时一阵懵逼,囊碟括咧(这啥玩意啊)?于是便开始启动搜索引擎大发,再整合诸多信息后,有了此偏小记。

什么是Epoch Based Reclamation

大概意思上来说,这是无锁编程模式下的一种内存管理回收方案,官方定义可参考论文。而crossbeam-epoch是其rust下的一种实现。

为什么要Epoch Based Reclamation

设想我们要在无gc的语言中实现一种无锁但支持并发的数据结构。线程A想替换该数据结构中的某个数据节点,线程A使用newNode原子替换了oldNode,本着负责到底的态度,线程A释放了oldNode,防止了内存泄露,这一切看起来没什么问题。
恰好此时,线程B读取了该node,而且要命的是,线程B在线程A替换前便进行了读取,因此线程B中拥有访问oldNode的指针,于是,bang!由于oldNode已被线程A释放,那么线程B此时持有的便是一个悬空指针。
在拥有gc的语言中,如java, golang,不会出现这种问题。但是对于rust,c,c++,则没有一种很好的方法应对这问题,除非非gc语言也有一种延迟回收内存的机制,于是Epoch Based Reclamation作为其中一种方法应运而生。

Epoch Based Reclamation的原理概述

学习最好的方式还是拜读大佬的文章。
其中,有对此的讲解,建议反复阅读:

The epoch scheme works by having:

A global epoch counter (taking on values 0, 1, and 2); A global list
of garbage for each epoch; An “active” flag for each thread; An epoch
counter for each thread. The epochs are used to discover when garbage
can safely be freed, because no thread can reach it. Unlike
traditional GC, this does not require walking through live data; it’s
purely a matter of checking epoch counts.

When a thread wants to perform an operation on the data structure, it
first sets its “active” flag, and then updates its local epoch to
match the global one. If the thread removes a node from the data
structure, it adds that node to the garbage list for the current
global epoch. (Note: it’s very important that the garbage go into the
current global epoch, not the previous local snapshot.) When it
completes its operation, it clears the “active” flag.

To try to collect the garbage (which can be done at any point), a
thread walks over the flags for all participating threads, and checks
whether all active threads are in the current epoch. If so, it can
attempt to increment the global epoch (modulo 3). If the increment
succeeds, the garbage from two epochs ago can be freed.

也就是说,总共有3种epoch计数,0, 1, 2。epoch计数循环增长,如0120120120…。
对于每个epoch计数012,都有一个对应的回收队列retireList。
有一个全局epoch计数,记为E

另外,每个线程有个局部计数,记为e,另外有一个bool变量active表示该线程是否处于临界区,即是否正在访问共享数据。任一线程在进入临界区时,先置active=true, e = E,退出临界区时,置active=false

任一线程,如果其对共享数据做出了更改,则需要删除的数据(如上例种的oldNode),不会直接删除,而是将其放入对应e的回收队列中。e.g. 线程A当前e=0,则oldNode放入retireList[0]中。

在此,首先需要关注的是,每个活跃线程(active = true)的局部计数e,只可能为E,或者(E - 1) % 3。(后续将省略模3的写法)。这是因为E的增长规则: 只有当所有活跃线程(active = true)中的e都等于E的情况下,才置E = E + 1。换言之,若有某一个活跃线程中的局部e为E-1的时候,E不会增长,故而不会存在有e=E-2的线程。

对于读取线程(epoch计数为e),如果e=E,因目前所有活跃线程只可能为E或者E-1,故其可能引用到retireList[E]或者retireList[E-1]中的数据。如果e=E-1,则其可能引用到retireList[E]或者retireList[E-1]或者retireList[E-2]中的数据。因此retireList[E-2]无法释放。

当最后一个e=E-1的线程完成了临界区操作,也即所有活跃线程中epoch计数都等于E的时候,也就是说E - 2(也即E + 1)对应的回收队列retireList中的节点再也没有任何一个线程访问了,故而retireList[E - 2]中的数据可以真正的释放了。如此做后,全局计数E = E + 1

来个小例子

假设就两个线程A,B,一个共享数据N,初始数据为N0。A不断更改N,B则不断读取N。
E = 0
A: e = 0 用N1替代N0,N0放入retireList[0]
B: e = 0 读N,得到N0的引用
retireList[0] = [N0] retireList[1]=[] retireList[2]=[]
触发gc, E = 1, 释放retireList[1] =>
retireList[0] = [N0] retireList[1]=[] retireList[2]=[]

A: e = 1 用N2替代N1,N1放入retireList[1]
B: e = 1 读N,得到N1的引用
retireList[0] = [N0] retireList[1] = [N1] retireList[2]=[]
触发gc, E = 2, 释放retireList[2] =>
retireList[0] = [N0] retireList[1] = [N1] retireList[2]=[]

A: e = 2 用N3替代N2, N2放入retireList[2]
B: e = 2 读N,得到N2的引用
retireList[0] = [N0] retireList[1] = [N1] retireList[2]=[N2]
触发gc, E = 0, 释放retireList[0] =>
retireList[0] =[] retireList[1] = [N1] retireList[2]=[N2]

A: e = 0 用N4替代N3,N3放入retireList[0]
B: e = 0 读N,得到N3的引用
retireList[0] = [N3] retireList[1]=[N1] retireList[2]=[N2]
触发gc, E = 1, 释放retireList[1] =>
retireList[0] = [N3] retireList[1]=[] retireList[2]=[N2]

当然,这仅仅是一种可能的执行情况,可以列举其他情况,加深感性认识。

结语

个人理解,仅供参考

Epoch Based Reclamation 的个人理解相关推荐

  1. 【目标检测】epoch、batch、batch_size理解

    1 epoch 当一个完整的数据集通过神经网络一次并且返回一次的过程称为一个epoch. 然而,当一个epoch对于计算机太过庞大时,就需要把它分成多个小块. 2 batch 在不能将数据一次性通过神 ...

  2. 神经网络epoch和batch的粗浅理解

    关于神经网络epoch和batch的理解 理解粗浅,仅为个人想法,提前感谢指正. epoch 一个epoch代表全部数据进入网络一次,这个时候,整个网络结构只对这批数据全部走完一次,损失函数的下降还不 ...

  3. 上篇 | 说说无锁(Lock-Free)编程那些事

    1. 引言 现代计算机,即使很小的智能机亦或者平板电脑,都是一个多核(多CPU)处理设备,如何充分利用多核CPU资源,以达到单机性能的极大化成为我们码农进行软件开发的痛点和难点.在多核服务器中,采用多 ...

  4. 脑电分析系列[MNE-Python-2]| MNE中数据结构Epoch及其创建方法

    Epoch概念简介 相信很多人第一次接触epoch时,都会有疑惑,这个词在EEG中到底指的是什么. 下面将详细说明一下. 从连续的脑电图信号中提取一些特定时间窗口的信号,这些时间窗口可以称作为epoc ...

  5. 深度学习中batch_size、epoch和iteration的含义

    iteration:1个iteration等于使用batchsize个样本训练一次: epoch:1个epoch等于使用训练集中的全部样本训练一次,通俗的讲epoch的值就是整个数据集被轮几次. 比如 ...

  6. 三维目标检测论文阅读:VoxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection

    VoxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection 理解了PointPillars这篇文章后,看这篇文章就清 ...

  7. Python-EEG处理和事件相关电位(ERP)

    点击上面"脑机接口社区"关注我们 更多技术干货第一时间送达 有后台留言问,代码是在哪里运行的.这里说明一下,案例介绍的代码均在jupyter notebook中运行的,当然这些代码 ...

  8. 脑电分析系列[MNE-Python-20]| 脑电图处理和事件相关电位(ERP)

    今天主要介绍一下MNE-Python中进行脑电图处理和事件相关电位(ERP). 有后台留言问,代码是在哪里运行的.这里说明一下,案例介绍的代码均在jupyter notebook中运行的,当然这些代码 ...

  9. 大牛deep learning集合

    作者1:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 作者1:denghp83 出处:http://blog.csdn.net/denghp83/ ...

  10. python与erp_Python-EEG处理和事件相关电位(ERP)

    更多技术干货第一时间送达 脑机接口社区推荐搜索 脑机接口 MNE EEGLAB 算法 汇总 数据 有后台留言问,代码是在哪里运行的.这里说明一下,案例介绍的代码均在jupyter notebook中运 ...

最新文章

  1. 北师大计算机网络原理和应用作业,北师大网络作业计算机组成原理 作业一(可编辑)...
  2. three.js写的游戏
  3. JQUERY GET
  4. jqueryeasyui datebox 设置默认值
  5. 《命犯桃花》离斯蒂芬·金还很遥远
  6. Linux文件(目录)命名规则
  7. 斯坦福机器学习教程学习笔记之1
  8. gift to me by myself on 2012's new year
  9. hen Content must be served over https解决方案
  10. html背景图透明文字正常,背景图片 透明 文字不透明
  11. 关于云桌面的几个常见问题
  12. linux的webui服务,Aria2控制前端WebUI客户端安装教程
  13. linux 内功修炼之一 cpu
  14. nuxt启动报错: Error: getaddrinfo ENOTFOUND 0
  15. java中mysql分组查询_ES对应mysql的group by分组查询javaApi,多对多关系的分组查询...
  16. 合肥工业大学(宣城校区)2019年EDA课设原理图、PCB板与仿真图像
  17. linux 查明文密码,登录页面密码支持明文查看
  18. 阿里云混合云精彩亮相中国信通院2021混合云大会
  19. Jetpack新成员,Paging3从吐槽到真香
  20. sas3ircu工具信息收集及磁盘定位

热门文章

  1. wps里ppt怎么换另一个的模板_现学现用极简技术|智能PPT,一个按键轻松搞定专业的制作!...
  2. PGM-Explainer
  3. 微信小程序中的wx.navigateTo跳转路径写法
  4. 图标在XMind中应用
  5. More Effective C++之 Item M26:限制某个类所能产生的对象数量
  6. case when 多条件查询
  7. 服务器两块硬盘怎么合并,电脑高手进(怎么把俩块硬盘合并在一同)
  8. OpenXML指定位置插入图片
  9. JWT © pepsi-wyl
  10. Riverbed大咖纵论2018科技领域九大变化