C指针原理(83)-内存管理与控制

来源:互联网 发布:帝国cms 整站 编辑:程序博客网 时间:2024/05/17 23:01

在多处理器中,内存分配如何减少程序的多个线程的锁竞争?可采用在每个分配器中放置一个锁,为分配器准备多个领域,通过对线程标识的HASH计算将各个线程分配到这些领域中,如下图所示:

麦好的AI乐园博客所有内容是原创,如果转载请注明来源

http://blog.csdn.net/myhaspl/


 

jemalloc使用的是比HASH更具弹性的算法将线程分派到领域中,在FREEBSD中,默认情况下,单处理器使用一个领域,而多处理器中使用相当于处理器4倍数量的领域。

当线程分配器第一次分配或释放内存时,被分派一个领域,但不是通过线程标识的HASH,而是循环的方式,每个区域尽量保证被分派的线程数相等,没用的HASH的原因在于,做到线程标识符(就是线程指针)的可靠的伪随机HASH非常困难。线程本地存储(TLS)对高效实现循环领域非常重要,每个线程的领域需要一个存储位置,在一些不支持TLS的架构上,仍需要使用线程标识HASH,因此使用pthreads库的TSD替代TLS解决这一问题。

mmap函数和sbrk函数担负malloc等分配内存的函数向内核申请内存的任务,mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零,而sbrk增加程序可用数据段空间。

内存块(chunk)的尺寸默认为2M,分配内存块时,基址是尺寸的常数倍,这就是边界对齐,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。各个硬件平台对存储空间的处理上有很大的不同,一些平台对某些特定类型的数据只能从某些特定地址开始存取,边界不对齐将导致读取效率下降很多。

1 0
原创粉丝点击