hazard pointer

转载自: http://hi.baidu.com/rodimus/item/f6539cc179894f2f47d5c0ef

这是用于解决多线程并发下内存的回收,一块内存被释放之后,并不能直接交回给操作系统,因为可能有别的线程正在读这个数据。那什么时候交还给操作系统呢?不 同的应用不一样。等的时间太短,可能会读到已经释放的内存,会CORE; 时间太长,内存的利用率会下降。以前做检索系统的时候,有些很山寨的方法解决这些问题。

通用的解决方案有:

(1)加读写锁,应用的时候要注意锁的粒度,锁的粒度太大,并发度低,锁粒太细,需要很多锁,锁本身的资源开销很大。这种情况下一般假设读写是均匀分布在各个内存单元的,但是很多应用里读写是比较集中的。
(2)引用计数,给每个内存节点加一个计数,要用的时候加1,用完减1,减到0就表示不用了,这个的内存开销会比较大。
(3)就是要介绍的hazard pointer:

  观察到,读线程虽然需要读很多数据,但是在特定时刻,它需要读的内存单元是很少的,比如检索系统读倒排,其实它就只需要读链表上某个节点,不需要读整个链表,有点飞矢不动的感觉。所以别的线程删除数据的时候,只需要看一下所有线程正在读的内存,如果该内存没线程在读,就可以删除了。具体实现的时候,每个线程开一个大小为K的数组,用于存储它正在读的内存地址,每个线程也有一个链表记录它需要删除的内容。简单来说是这样,但是要解决的问题还是很多的:

 (a)扩展性,线程数N可能很大,线程在某一瞬间需要同时读的内存K可能很多,这样N*K的话,数量会很大,会使得遍历的性能很差。所以可以考虑用一个拉链把所有线程的hazard pointer串起来
 (b)性能,删除的时候需要遍历所有的hazard pointer,确认没有线程正在读这块内存,反复遍历会很耗时间。所以把需要删除的内存先缓存起来,再一次遍历hazard pointer,批量回收内存
 (c)多写,这个需要上层自己解决,利用CAS之类的原语重复检验,如果在获得原始数据,修改数据之间,有别的线程已经完成操作,则需要把工作重复做一遍
 (d)读写并发,考虑两种情况,一是读线程已经读完了,但是写线程还认为它在读,这种情况是没有问题的,只是降低了回收的速度:

  一是写线程认为没有线程在读,准备回收的时候,有线程在读。这需要上层自己解决,读线程,如果在获得数据、把数据加为hazard pointer之间,有删除操作发生,则需要重新读取。写线程,在把内存放进待删除拉链之前,修改相应指针,让后来的读线程读不到数据,让已经读到但是没加进hazard pointer的线程能获得通知。

从论文上看到的实测数据,这一方案比读方法(1)(2)都要优,但是论文的数据里并没有讨论hazard pointer的数量,应该是默认一个线程一个hazard pointer测的。

[转载]hazard pointer的更多相关文章

  1. 实现无锁的栈与队列(5):Hazard Pointer

    两年多以前随手写了点与 lock free 相关的笔记:1,2,3,4,质量都不是很高其实(读者见谅),但两年来陆陆续续竟也有些阅读量了(可见剑走偏锋的技巧是多容易吸引眼球).笔记当中在解决内存释放和 ...

  2. 风险指针(Hazard Pointer) 内存空间共享模型

    WiredTiger是一种高性能的开源存储引擎,现已在MongoDB中作为内模式应用.WiredTiger支持行存储.列存储两种存储模式,采用LSM Tree方式进行索引记录 WiredTiger支持 ...

  3. lock free数据结构内存回收技术-hazard pointer

    lock free数据结构一般来说拥有比基于lock实现的数据结构更高的性能,但是其实现比基于lock的实现更为复杂,需要处理的难题包括预防ABA问题,内存如何重用和回收等.通常,最简单最有效的处理A ...

  4. [转载]锁无关的数据结构与Hazard指针——操纵有限的资源

    Lock-Free Data Structures with Hazard Pointers 锁无关的数据结构与Hazard指针----操纵有限的资源 By Andrei Alexandrescu a ...

  5. wiredtiger - hazard pointers

    http://www.drdobbs.com/lock-free-data-structures-with-hazard-po/184401890 memory deallocation  lock- ...

  6. 【转载】MySQL · 性能优化· InnoDB buffer pool flush策略漫谈

    背景 我们知道InnoDB使用buffer pool来缓存从磁盘读取到内存的数据页.buffer pool通常由数个内存块加上一组控制结构体对象组成.内存块的个数取决于buffer pool inst ...

  7. C++11原子操作与无锁编程(转)

    不讲语言特性,只从工程角度出发,个人觉得C++标准委员会在C++11中对多线程库的引入是有史以来做得最人道的一件事:今天我将就C++11多线程中的atomic原子操作展开讨论:比较互斥锁,自旋锁(sp ...

  8. MongoDB新存储引擎WiredTiger实现(事务篇)

    导语:计算机硬件在飞速发展,数据规模在急速膨胀,但是数据库仍然使用是十年以前的架构体系,WiredTiger 尝试打破这一切,充分利用多核与大内存时代,开发一种真正满足未来大数据管理所需的数据库.本文 ...

  9. MySQL · 性能优化· InnoDB buffer pool flush策略漫谈

    MySQL · 性能优化· InnoDB buffer pool flush策略漫谈 背景 我们知道InnoDB使用buffer pool来缓存从磁盘读取到内存的数据页.buffer pool通常由数 ...

随机推荐

  1. 【JavaScript&jQuery】5秒跳转

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" ...

  2. Qin Shi Huang's National Road System UVA - 1494(次小生成树)

    秦始皇统一中国之后要在全国修公路连接各个城市,皇帝只想修成最小生成树(距离最小,不考虑人力),一个道士说自己可以不花人力物力修一条路,经过两方妥协,选择max(两个城市人口/(生成树长度-这条路的长度 ...

  3. A2W W2A等所需要的文件

    1.包含头文件 #include <atlbase.h> #include <atlconv.h> 2.在使用前加上,注意,不是在文件都定义. USES_CONVERSION;

  4. 【ZJOI2005】沼泽鳄鱼 题解报告

    题目描述 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客. 为了让游玩更有情趣,人们在池塘的中央建设了几座石墩和石桥 ...

  5. 洛谷 P3768 简单的数学题 解题报告

    P3768 简单的数学题 题目描述 由于出题人懒得写背景了,题目还是简单一点好. 输入一个整数\(n\)和一个整数\(p,\)你需要求出\((\sum_{i=1}^n\sum_{j=1}^n ijgc ...

  6. Zabbix Agent for Linux部署(四)

    一.环境介绍 二.代理安装 1.将代理程序拷贝至Node1服务器的/usr/src/zabbix3.4.5/目录下 [root@Node3 zabbix3.-.el7.x86_64.rpm zabbi ...

  7. java发送邮件功能[转]

    原文链接:https://blog.csdn.net/jjkang_/article/details/56521959 Javamail遵循两个协议,一个是smtp协议,另一个是pop3协议.一般情况 ...

  8. 洛谷P1029 最大公约数和最小公倍数问题

    题目描述 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数 条件: 1.P,Q是正整数 2.要求P,Q以x0为 ...

  9. 题解 P2472 【[SCOI2007]蜥蜴】

    P2472 [SCOI2007]蜥蜴 题目背景 07四川省选 题目描述 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱 ...

  10. [LeetCode] 24. Swap Nodes in Pairs ☆

    Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2-& ...