高性能无锁(Lock-free) 内存池
来源:互联网 发布:线切割编程例子 编辑:程序博客网 时间:2024/06/05 03:09
http://blog.csdn.net/jadedrip/article/details/5787388
由于懒惰,一直脱到现在才完成,实在是罪过啊!很快会用它来改写我的无锁容器,嗯,如果我不懒惰的话。
稍微解释一下关键问题:
先分配一块内存,然后将内存划分为等大的内存格。每次调用 alloc 就分配一块内存格出去。
可分配内存是个链表,这个链表被直接贮存在未分配的内存里。换句话说,未被分配的内存格里存放了一个指针,这个指针指向下一个未被分配的空闲内存格。
另外,为了我们分配的内存可以被正确释放,还需要一个链表来贮存我们分配的内存列表,这里我把这个链表贮存在我们分配的内存首部。也就是每块分配的内存,前几个字节保存了下一块内存的指针。
我们通过 cas 争用的一个指针指向了链表头,分配内存的过程就是从链表头摘取一个内存格,而释放的过程就是在链表头挂上内存格(注意,都是链表头,因此只需要争用一个指针)。
设计上希望代码支持 64 位,考虑到64位指针本身就是64位,但是当前系统最高应该只使用了 48位,因此使用剩下的部分来作为 ABA 计数。如果你的程序没有使用 256T 以上就应该没有问题吧,嗯——大概。
内存池的初始大小最好是够大,如果在中途分配,可能由于几个线程同时进程分配内存而一下子分配好几块,由于串联可分配内存的操作是比较费时的,为了节约,我把他们全挂上了,如果你希望节约内存的分配量,可以牺牲 cpu时间,放弃多分配的内存。
这个很快会作为一个库的一个组件发布,这个库暂时被命名为 lugce, 谁有更好的名字可以推荐不?呵呵
照例发表源码:
- 顶
- 0
- 踩
1 0
- 高性能无锁(Lock-free) 内存池
- 再谈 高性能无锁(Lock-free) 内存池
- 高性能无锁(Lock-free) 内存池
- DIOCP开源项目-Delphi高性能无锁队列(lock-free)
- 无锁(lock-free)数据结构
- 无锁(lock-free)数据结构
- 无锁(lock-free) 数据结构
- 并发基础 -- 无锁(lock-free)数据结构
- 无锁数据结构lock-free 的 本质
- 无锁编程:lock-free原理
- 无锁编程:lock-free原理
- 无锁队列 lock free queue
- 无锁的 ( lock-free ) 线程安全算法
- 无锁(lock-free)队列的一个简单实现
- 多线程无锁(lock-free) 堆的实现
- 多线程无锁(lock-free)队列(queue)的实现探讨
- (转)无锁编程:Lock-Free Data Structures
- 无锁的 ( lock-free ) 线程安全算法
- error: 'vector' does not name a type
- 非常详细GC学习笔记
- 读书笔记《你不知道的JavaScript上卷》1.2词法作用域
- photoshop第七章:图片的效果制作2
- LeetCode-27. Remove Element
- 高性能无锁(Lock-free) 内存池
- Vuex原来可以这样上手
- codeforces 149D Coloring Brackets 区间DP
- Avoiding getting banned(Scrapy)
- 如何理解<base href="<%=basePath%>"
- 对给定的字符串(只包含'z','o','j'三种字符),判断他是否能AC。 是否AC的规则如下: 1. zoj能AC; 2. 若字符串形式为xzojx,则也能AC,其中x可以是N个'o' 或者为空;
- <hadoop> mapreduce程序分块
- 【spoj】Another Longest Increasing Subsequence Problem cdq分治
- Larave5.*框架 数据库的CURD增删改查操作教程