From 4156de907c0e72cb897755281ede83136137feea Mon Sep 17 00:00:00 2001 From: ddwolf Date: Wed, 19 Jun 2024 01:42:18 +0800 Subject: [PATCH] add new post about tcmalloc --- _posts/2024-06-19-cpp-thunk-function.md | 6 ++++++ _posts/2024-06-19-glibc-tcmalloc-notes.md | 23 +++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 _posts/2024-06-19-glibc-tcmalloc-notes.md diff --git a/_posts/2024-06-19-cpp-thunk-function.md b/_posts/2024-06-19-cpp-thunk-function.md index 75b31c3..887063b 100644 --- a/_posts/2024-06-19-cpp-thunk-function.md +++ b/_posts/2024-06-19-cpp-thunk-function.md @@ -1,3 +1,9 @@ +--- +layout: post +title: "cpp-thunk-function" +date: 2024-06-19 +--- + #### Thunk函数生成 **类对象的布局** diff --git a/_posts/2024-06-19-glibc-tcmalloc-notes.md b/_posts/2024-06-19-glibc-tcmalloc-notes.md new file mode 100644 index 0000000..d50b1be --- /dev/null +++ b/_posts/2024-06-19-glibc-tcmalloc-notes.md @@ -0,0 +1,23 @@ +--- +layout: post +title: "glibc-tcmalloc-笔记" +date: 2024-06-19 +--- + +glibc tcmalloc 笔记 +max_bins 64 +max_fastbin 128 +max_fast_size 160, 80 * SIZE_SZ / 4 +unsorted_chunk bin_at(1) +global_max_fast 128 +min_large_size 1024 +chunk_size 即实际大小 +TCACHE_MAX_BINS 64 每个线程可以拥有多少个 thread local 的 chunk,is a arbitrary limit +checked_request2size == req + sizeof(mchunk_size) 并按 MALIGNMENT 做对齐。这里表示:申请 req 的空间,需要增加一个 sizeof(mchunk_size) 的位置保存 chunk size,chunk size 位置前一个位置实际还有一个字段 prev_size,但是chunk处于used 状态时,这个prev_size可以用于used data的。所以,这里,前面需要一个 sizeof(prev_size),但是这个chunk的后面是下一个chunk的prev_size,可以直接拿来当useddata用,所以两相抵销,只需要一个额外的sizeof(mchunk_size) 空间就可以了 + +CHUNK_HDR_SZ = 16 +#define mem2chunk(mem) ((mchunkptr)tag_at (((char*)(mem) - CHUNK_HDR_SZ))) 向后偏移 16 个字节 +#define chunk2mem(chk) 向前偏移 16 个字节 +arena_for_chunk 先检查 head 标记位(chunsize的第3位),如果是main_arena,直接返回;再通过 64M 取余,即可拿到 heap 的地址。通过 heap->ar_ptr 即可拿到相应的arena + +tcache->entries[x] 里面保存的是 chunk2mem 的结果。chunk2mem 的结果会被构造成一个tcache_entry 结构体。key可以用于double check 校验,next值是啥意思? \ No newline at end of file