美文网首页
jemalloc 之 线程局部存储

jemalloc 之 线程局部存储

作者: 酒桶九筒 | 来源:发表于2017-11-01 18:35 被阅读0次

引用:

  1. http://blog.csdn.net/jasonchen_gbd/article/details/51367650
  2. https://en.wikipedia.org/wiki/Thread-local_storage
  3. http://brionas.github.io/2015/01/31/jemalloc%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/

缩写:

  1. tsd == thread specific data
  2. tls == thread local storage

jemalloc 使用:tsd.h 文件。
先介绍下 jemalloc 的内存分配机制, Je对内存划分按照如下由高到低的顺序:

  1. 内存是由一定数量的 arenas 进行管理.
  2. 一个 arena 被分割成若干 chunks, 后者主要负责记录 bookkeeping.
  3. chunk 内部又包含着若干 runs, 作为分配小块内存的基本单元.
  4. run 由 pages 组成, 最终被划分成一定数量的regions.
  5. 对于 small size 的分配请求来说, 这些 region 就相当于user memory.
jemalloc 内存分配机制

说明:

  1. arena 的个数在某些情况下不只一个
  2. 每个线程持有各自的 tcache 副本,tcache 每次从 arena 批发一批内存,malloc 在向 tcache 申请内存时不需要加锁。
  3. arena 向系统一次性申请一大块内存,按照不同大小切割成块 run,run 再将这些块切成更小的块 regions,region 是一定大小(如 16B, 32B等)的分配给用户的内存, regions 可供 tcache 批发,这些内存的分配是由 chunk 这个数据结构管理,chunk 会记录一些簿记信息。

chunk 内存结构


chunk 内存结构

chunk 是按照一定大小(比如 2M)向系统申请的,所以直接根据地址本身就可以找到 chunk 头数据结构,通过 ptr 找到所属 chunk 方法:

#define CHUNK_ADDR2BASE(a) ((void *)((uintptr_t)(a) & ~chunksize_mask))
chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(ptr);

实现线程局部存储方法:

  1. 通过 __thread 修饰符修饰。
  2. 使用 pthread 库机制。

要点:

  1. 要定义一个线程局部变量很简单,只需简单的在全局或静态变量的声明中包含__thread说明符即可。
  2. __thread变量并不是在线程之间完全隐藏的,每个线程保存自己的一份拷贝,因此每个线程的这个变量的地址不同。但这个地址是整个进程可见的,因此一个线程获得另外一个线程的局部变量的地址,就可以修改另一个线程的这个局部变量。
  3. POSIX thread使用getthreadspecific和setthreadspecific 组件来实现这一特性,因此编译要加-pthread,但是使用这种方式使用起来很繁琐,并且效率很低。例子参照引用1。

相关文章

  • jemalloc 之 线程局部存储

    引用: http://blog.csdn.net/jasonchen_gbd/article/details/51...

  • 线程局部存储

    线程局部存储 线程局部存储(TLS,thread local storage) 就是拥有线程生命周期及线程可见性的...

  • 深入多线程4

    线程局部变量线程局部变量也叫线程局部存储,ThreadLocal类给每个线程都添加了一个变量,专门来存储每一个线程...

  • Java ThreadLocal 的用法

    前言 ThreadLocal提供了线程局部变量,当前线程全局共享,线程隔离。 源码实现 线程局部变量是存储在Thr...

  • 一文详解Java中的ThreadLocal

    ThreadLocal用于多线程环境下每个线程存储和获取线程的局部变量,这些局部变量与线程绑定,线程之间互不影响。...

  • 线程局部存储tls的使用

    线程局部存储(Thread Local Storage,TLS)主要用于在多线程中,存储和维护一些线程相关的数据,...

  • Linux 中的线程局部存储(2)

    《Linux 中的线程局部存储(1)》提到了一种,其实在Linux中还有一种更为高效的线程局部存储方法,就是使用关...

  • JVM篇

    一、java内存区域的组成 程序计数器,线程私有,用来存储线程执行到哪条字节码指令; 栈,线程私有,存储局部变量,...

  • AutoreleasePool解析

    关键点 双向链表 AutoreleasePoolPageData TLS 线程局部存储? HotPage和Cold...

  • 线程局部存储空间 pthread_key_t、__thread

    线程局部存储空间 pthread_key_t、__thread 即 ThreadLocal__threadpthr...

网友评论

      本文标题:jemalloc 之 线程局部存储

      本文链接:https://www.haomeiwen.com/subject/oligpxtx.html