1. VPP源码分析(内存管理之mheap)

简介: 1.1. mheap 1.1.1. mheap_t first_free_elt_uoffset_by_bin: User offsets for head of doubly-linked list of free objects of this size.

1.1. mheap

1.1.1. mheap_t

1

  • first_free_elt_uoffset_by_bin: User offsets for head of doubly-linked list of free objects of this size.
  • non_empty_free_elt_heads: Bitmap of non-empty free list bins.
  • n_elts: Number of allocated objects.
  • max_size: Maximum size (in bytes) this heap is allowed to grow to.
    2

1.1.2. mheap_elt_t

3

  • prev_n_user_data: Number of mheap_size_t words of user data in previous object. Used to find mheap_elt_t for previous object.
  • prev_is_free: Set if previous object is free.
  • n_user_data: Number of mheap_size_t words of user data that follow this object.
  • is_free: Set if this object is on free list (and therefore following free_elt is valid).
  • user_data: For allocated objects: user data follows.
    User data is allocated in units of typeof (user_data[0]).
  • free_elt: For free objects, offsets of next and previous free objects of this size;
    ~0 means end of doubly-linked list.

This is stored in user data (guaranteed to be at least 8 bytes) but only for free objects.
4

1.1.3. mheap_alloc函数过程

5
从虚拟内存空间映射一块size大的内存(am = 0x7ffff3a0ff54)

mmap_addr = mmap(0, size, PROT_READ | PROT_WRITE, flags, -1, 0);
  1. 将mmap_addr指针和页大小对其(av = 0x7ffff3a10000)
    return (addr + mheap_page_size - 1) & ~(mheap_page_size - 1);
  2. 从对齐页的位置往前减去mheap_t的空间(ah = 0x7ffff3a0f860)
    ah = vec_aligned_header(v, sizeof (mheap_t), 16);
  3. 再往后n个page,(ah + page = 0x7ffff3a10860)得到真正的mheap开始的位置【这边类似于补运算,在申请的空间内跳过page_size - mheap_size 的空间】
  4. (ah < am)
    ah += mheap_page_size; // 这样可以保证mheap的其实位置在申请的空间内,且一定对其与page
  5. 最后计算出vector的偏移
    v = mheap_vector (h); // h + sizeof(mheap_t + vec_header_t)
  6. vector区域可以存放的数据大小为
    size = am + memory_size - v;

1.1.4. 从mheap中申请内存

void *
mheap_get_aligned(void *v, uword n_user_data_bytes, uword align, uword align_offset, uword * offset_return)
/* Search free lists for object with given size and alignment. */
static uword
mheap_get_search_free_list(void *v, uword *n_user_bytes_arg, uword align, uword align_offset)
/* Find bin for objects with size at least n_user_data_bytes. */
always_inline uword
user_data_size_to_bin_index(uword n_user_data_bytes)

6

根据用户请求object的size and alignment找到合适的bin(small_bin or large_bin),再从bin中找到合适的free elt
这里所有的操作都是基于数组的形式,elt间的双向链表也是以数组的形式实现的

目录
相关文章
|
关系型数据库 数据库 PostgreSQL
PG源码分析系列:内存上下文
title: Pgsql源码分析——内存上下文 date: 2018-05-01 22:00:00 categories: - Postgresql - PgSource Postgresql内存上下文源码分析 1 数据库内存上下文   postgresql在7.1版本引入了内存上下文机制来解决日益严重的内存泄漏的问题,在引入了这种“
1616 0
|
11月前
|
Java C++
Java Review - 线程池中使用ThreadLocal不当导致的内存泄漏案例&源码分析
Java Review - 线程池中使用ThreadLocal不当导致的内存泄漏案例&源码分析
89 0
|
缓存 算法 Java
全网最硬核 Java 新内存模型解析与实验 - 5. JVM 底层内存屏障源码分析
全网最硬核 Java 新内存模型解析与实验 - 5. JVM 底层内存屏障源码分析
全网最硬核 Java 新内存模型解析与实验 - 5. JVM 底层内存屏障源码分析
JVM源码分析之不可控的堆外内存
JVM源码分析之不可控的堆外内存
|
存储 缓存 移动开发
Memcached源码分析 - 内存存储机制Slabs(5)
Memcached源码分析 - 网络模型(1)Memcached源码分析 - 命令解析(2)Memcached源码分析 - 数据存储(3)Memcached源码分析 - 增删改查操作(4)Memcached源码分析 - 内存存储机制Slabs(5)Memcached源码分析 - LRU淘汰算法(6)Memcached源码分析 - 消息回应(7) 开篇  这篇文章的目的是想把Memcached的内存管理机制讲解清楚,在前面的文章中我们已经提交到Item是Memcached中存储的数据单元,而Item的内存分配策略就是本章的重点了。
1510 0
|
存储 算法 安全
ThreadLocal全攻略:使用实战,源码分析,内存泄露分析
ThreadLocal全攻略:使用实战,源码分析,内存泄露分析
247 0
ThreadLocal全攻略:使用实战,源码分析,内存泄露分析
|
存储 算法 JavaScript
从V8源码分析一个JS 数组的内存占用问题
前段时间,在排查一个问题的时候,遇到了一个有点令人困惑的情况,有下面这两段代码:
从V8源码分析一个JS 数组的内存占用问题
|
算法 Java 开发者
JVM源码分析之堆外内存完全解读
本文作者来源李嘉鹏。 堆外内存有广义的堆外内存和狭义的堆外内存之分。
1197 0
JVM源码分析之堆外内存完全解读
|
分布式计算 搜索推荐 Spark
Spark 源码分析之ShuffleMapTask内存数据Spill和合并
- Spark ShuffleMapTask 内存中的数据Spill到临时文件 - 临时文件中的数据是如何定入的,如何按partition升序排序,再按Key升序排序写入(key,value)数据 - 每个临时文件,都存入对应的每个分区有多少个(key,value)对,有多少次流提交数组,数组中...
1778 0
|
数据采集 移动开发
Memcached内存管理源码分析
版本 1.4.20 1 模型分析 memcached内存管理的模型与作业本“画格子给我们往格子里面写字”的逻辑很像,一个个作业本就是我们的内存空间,而我们往里写的字就是我们要存下来的数据,所以分析的时候可以想像一下用方格作业本写字的情景 1.1 重要的概念 1.1.1 slab、chunk slab是一块内存空间,默认大小为1M,而memcached会把一个slab分割成一个个chunk 比如说1M的slab分成两个0.5M的chunk,所以说slab和chunk其实都是代表实质的内存空间,chunk只是把slab分割后的更小的单元而已。
889 0

热门文章

最新文章