E-COM-NET
首页
在线工具
Layui镜像站
SUI文档
联系我们
推荐频道
Java
PHP
C++
C
C#
Python
Ruby
go语言
Scala
Servlet
Vue
MySQL
NoSQL
Redis
CSS
Oracle
SQL Server
DB2
HBase
Http
HTML5
Spring
Ajax
Jquery
JavaScript
Json
XML
NodeJs
mybatis
Hibernate
算法
设计模式
shell
数据结构
大数据
JS
消息中间件
正则表达式
Tomcat
SQL
Nginx
Shiro
Maven
Linux
ptmalloc2
Glibc内存管理--
ptmalloc2
源代码分析(二十七)
5.7.2.3 分配large bin chunk(一) 如果所需的 chunk 不属于 small bins ,首先会执行如下的代码段: /* If this is a large request, consolidate fastbins before continuing. While it might look excessive to kill all
mqzhuang
·
2011-05-30 19:00
malloc
Glibc内存管理--
ptmalloc2
源代码分析(二十六)
5.7.2.2 分配small bin chunk 如果所需的 chunk 大小属于 small bin ,则会执行如下的代码: /* If a small request, check regular bin. Since these "smallbins" hold one size each, no searching wi
mqzhuang
·
2011-05-30 18:00
工作
Glibc内存管理--
ptmalloc2
源代码分析(二十五)
5.7内存分配malloc()
Ptmalloc2
主要的内存分配函数为malloc(),但源代码中并不能找到该函数,该函数是用宏定义为public_mALLOc(),因为该函数在不同的编译条件下,具有不同的名称
iteye_7858
·
2011-05-30 18:34
Glibc内存管理--
ptmalloc2
源代码分析(二十五)
5.7 内存分配malloc()
Ptmalloc2
主要的内存分配函数为 malloc() ,但源代码中并不能找到该函数,该函数是用宏定义为 public_mALLOc() ,因为该函数在不同的编译条件下
mqzhuang
·
2011-05-30 18:00
多线程
C++
c
C#
Exchange
Glibc内存管理--
ptmalloc2
源代码分析(二十四)
5.6.7 grow_heap,shrink_heap,delete_heap,heap_trim 这几个函数实现 sub_heap 和增长和收缩, grow_heap() 函数主要将 sub_heap 中可读可写区域扩大; shrink_heap() 函数缩小 sub_heap 的虚拟内存区域,减小该 sub_heap 的虚拟内存占用量; delete_heap() 为一个
mqzhuang
·
2011-05-30 18:00
Go
Glibc内存管理--
ptmalloc2
源代码分析(二十三)
5.6.5 new_heap() New_heap() 函数负责从 mmap 区域映射一块内存来作为 sub_heap ,在 32 位系统上,该函数每次映射 1M 内存,映射的内存块地址按 1M 对齐;在 64 为系统上,该函数映射 64M 内存,映射的内存块地址按 64M 对齐。 New_heap() 函数只是映射一块虚拟地址空间,该空间不可读写,不会被 swap 。 New_heap()
mqzhuang
·
2011-05-30 18:00
thread
linux
UP
Glibc内存管理--
ptmalloc2
源代码分析(二十二)
5.6.3 Arena_get2() 在5.6.2 节中提到, arena_get 宏尝试查看线程的私用实例中是否包含一个分配区,如果不存在分配区或是存在分配区,但对该分配区加锁失败,就会调用 arena_get2() 函数获得一个分配区,下面将分析 arena_get2() 函数的实现。 static mstate internal_function #if __STD_C ar
mqzhuang
·
2011-05-30 18:00
thread
数据结构
UP
Glibc内存管理--
ptmalloc2
源代码分析(二十一)
5.6 多分配区支持 由于只有一个主分配区从堆中分配小内存块,而稍大的内存块都必须从 mmap 映射区域分配,如果有多个线程都要分配小内存块,但多个线程是不能同时调用 sbrk() 函数的,因为只有一个函数调用 sbrk() 时才能保证分配的虚拟地址空间是连续的。如果多个线程都从主分配区中分配小内存块,效率很低效。为了解决这个问题, ptmalloc 使用非主分配区来模
mqzhuang
·
2011-05-30 18:00
多线程
thread
配置管理
Glibc内存管理--
ptmalloc2
源代码分析(二十)
5.5.3 ptmalloc_lock_all(),ptmalloc_unlock_all(),ptmalloc_unlock_all2() /* Magic value for the thread-specific arena pointer when malloc_atfork() is in use. */ #define ATFORK_ARENA_
mqzhuang
·
2011-05-30 17:00
多线程
thread
linux
Glibc内存管理--
ptmalloc2
源代码分析(十九)
5.5.2ptmalloc_init()函数ptmalloc_init()函数比较长,将分段对这个函数做介绍。staticvoidptmalloc_init(void){#if__STD_Cconstchar*s;#elsechar*s;#endifintsecure=0;if(__malloc_initialized>=0)return;__malloc_initialized=0;首先检查全局
iteye_7858
·
2011-05-30 17:24
Glibc内存管理--
ptmalloc2
源代码分析(十九)
5.5.2 ptmalloc_init()函数 ptmalloc_init() 函数比较长,将分段对这个函数做介绍。 static void ptmalloc_init (void) { #if __STD_C const char* s; #else char* s; #endif int secure = 0;
mqzhuang
·
2011-05-30 17:00
thread
多线程
linux
配置管理
Access
Glibc内存管理--
ptmalloc2
源代码分析(十八)
5.5 Ptmalloc初始化 Ptmalloc的初始化发生在进程的第一个内存分配请求,当 ptmalloc 的初始化一般都在用户的第一次调用 malloc() 或 remalloc() 之前,因为操作系统和 Glibc 库为进程的初始化做了不少工作,在用户分配内存以前, Glibc 已经分配了多次内存。 在 ptmalloc 中 malloc() 函数的实际接口函数为
mqzhuang
·
2011-05-30 17:00
C++
c
工作
C#
Glibc内存管理--
ptmalloc2
源代码分析(十七)
5.4配置选项Ptmalloc的配置选项不多,在3.2.6节已经做过概要描述,这里给出mallopt()函数的实现:#if__STD_CintmALLOPt(intparam_number,intvalue)#elseintmALLOPt(param_number,value)intparam_number;intvalue;#endif{mstateav=&main_arena;intres=1
iteye_7858
·
2011-05-30 17:29
Glibc内存管理--
ptmalloc2
源代码分析(十七)
5.4 配置选项 Ptmalloc的配置选项不多,在 3.2.6 节已经做过概要描述,这里给出 mallopt() 函数的实现: #if __STD_C int mALLOPt(int param_number, int value) #else int mALLOPt(param_number, value) int param_number; int value
mqzhuang
·
2011-05-30 17:00
thread
配置管理
Glibc内存管理--
ptmalloc2
源代码分析(十六)
5.3核心结构体分析每个分配区是structmalloc_state的一个实例,ptmalloc使用malloc_state来管理分配区,而参数管理使用structmalloc_par,全局拥有一个唯一的malloc_par实例。5.3.1malloc_statestuctmalloc_state的定义如下:structmalloc_state{/*Serializeaccess.*/mutex_
iteye_7858
·
2011-05-30 17:21
Glibc内存管理--
ptmalloc2
源代码分析(十六)
5.3 核心结构体分析 每个分配区是 struct malloc_state 的一个实例, ptmalloc 使用 malloc_state 来管理分配区,而参数管理使用 struct malloc_par ,全局拥有一个唯一的 malloc_par 实例。 5.3.1 malloc_state
mqzhuang
·
2011-05-30 17:00
thread
cache
Access
UP
Glibc内存管理--
ptmalloc2
源代码分析(十五)
5.2.3Unsortedbin Unsortedbin可以看作是smallbins和largebins的cache,只有一个unsortedbin,以双向链表管理空闲chunk,空闲chunk不排序,所有的chunk在回收时都要先放到unsortedbin中,分配时,如果在unsortedbin中没有合适的chunk,就会把unsortedbin中的所有chunk分别加入到所属的bi
mqzhuang
·
2011-05-30 16:00
cache
Glibc内存管理--
ptmalloc2
源代码分析(十四)
.2.2 Large bins 在 SIZE_SZ 为 4B 的平台上,大于等于 512B 的空闲 chunk ,或者,在 SIZE_SZ 为 8B 的平台上,大小大于等于 1024B 的空闲 chunk ,由 sorted bins 管理。 Large bins 一共包括 63 个 bin ,每个 bin 中的 chunk 大小不是一个固定公差的等差数列,而是分成 6
mqzhuang
·
2011-05-30 16:00
malloc
Glibc内存管理--
ptmalloc2
源代码分析(十三)
5.2分箱式内存管理对于空闲的chunk,ptmalloc采用分箱式内存管理方式,根据空闲chunk的大小和处于的状态将其放在四个不同的bin中,这四个空闲chunk的容器包括fastbins,unsortedbin,smallbins和largebins。Fastbins是小内存块的高速缓存,当一些大小小于64字节的chunk被回收时,首先会放入fastbins中,在分配小内存时,首先会查看f
mqzhuang
·
2011-05-30 15:00
编程
Glibc内存管理--
ptmalloc2
源代码分析(十二)
5. 源代码分析 分主要对源代码实现技巧的细节做分析,希望能进一步理解 ptmalloc 的实现,做到终极无惑。主要分析的文件包括 arena.c 和 malloc.c ,这两个文件包括了 ptmalloc 的核心实现,其中 arena.c 主要是对多线程支持的实现, malloc.c 定义了公用的 malloc() , free() 等函数,实现了基于分配区的内存管理算法。本部分不会
mqzhuang
·
2011-05-30 15:00
多线程
linux
算法
Access
Glibc内存管理--
ptmalloc2
源代码分析(十一)
4.问题分析及解决通过前面几节对ptmalloc实现的粗略分析,尝试去分析和解决我们遇到的问题,我们系统遇到的问题是glibc内存暴增,现象是程序已经把内存返回给了Glibc库,但Glibc库却没有把内存归还给操作系统,最终导致系统内存耗尽,程序因为OOM被系统杀掉。请参考3.2.2节对ptmalloc的设计假设与3.2.7节对ptmalloc的使用注意事项,原因有如下几点:在64位系统上使用默认
iteye_7858
·
2011-04-24 16:16
Glibc内存管理--
ptmalloc2
源代码分析(十一)
4. 问题分析及解决 通过前面几节对ptmalloc实现的粗略分析,尝试去分析和解决我们遇到的问题,我们系统遇到的问题是glibc内存暴增,现象是程序已经把内存返回给了Glibc库,但Glibc库却没有把内存归还给操作系统,最终导致系统内存耗尽,程序因为OOM被系统杀掉。 请参考3.2.2节对ptmalloc的设计假设与3.2.7节对ptmalloc的使用注意事项,原因有如下几点:
mqzhuang
·
2011-04-24 16:00
cache
配置管理
网络应用
NoSQL
Glibc内存管理--
ptmalloc2
源代码分析(十)
3.2.7使用注意事项为了避免Glibc内存暴增,使用时需要注意以下几点:后分配的内存先释放,因为ptmalloc收缩内存是从topchunk开始,如果与topchunk相邻的chunk不能释放,topchunk以下的chunk都无法释放。Ptmalloc不适合用于管理长生命周期的内存,特别是持续不定期分配和释放长生命周期的内存,这将导致ptmalloc内存暴增。如果要用ptmalloc分配长周期
iteye_7858
·
2011-04-24 16:36
Glibc内存管理--
ptmalloc2
源代码分析(十)
3.2.7 使用注意事项 为了避免Glibc内存暴增,使用时需要注意以下几点: 后分配的内存先释放,因为ptmalloc收缩内存是从top chunk开始,如果与top chunk相邻的chunk不能释放,top chunk以下的chunk都无法释放。 Ptmalloc不适合用于管理长生命周期的内存,特别是持续不定期分配和释放长生命周期的内存,这将导致ptmallo
mqzhuang
·
2011-04-24 16:00
多线程
Google
配置管理
Glibc内存管理--
ptmalloc2
源代码分析(九)
3.2.6 配置选项概述 Ptmalloc主要提供以下几个配置选项用于调优,这些选项可以通过mallopt()进行设置: 1. M_MXFAST M_MXFAST用于设置fast bins中保存的chunk的最大大小,默认值为64B,fast bins中保存的chunk在一段时间内不会被合并,分配小对象时可以首先查找fast bins,如果fast b
mqzhuang
·
2011-04-24 16:00
thread
linux
配置管理
Glibc内存管理--
ptmalloc2
源代码分析(八)
3.2.5 内存回收概述 free() 函数接受一个指向分配区域的指针作为参数,释放该指针所指向的chunk。而具体的释放方法则看该chunk所处的位置和该chunk的大小。free()函数的工作步骤如下: free()函数同样首先需要获取分配区的锁,来保证线程安全。 判断传入的指针是否为0,如果为0,则什么都不做,直接return。否则转下一步。 判断
mqzhuang
·
2011-04-24 16:00
工作
Glibc内存管理--
ptmalloc2
源代码分析(七)
3.2.4 内存分配概述 分配算法概述,以32系统为例,64位系统类似。 小于等于64字节:用pool算法分配。 64到512字节之间:在最佳匹配算法分配和pool算法分配中取一种合适的。 大于等于512字节:用最佳匹配算法分配。 大于等于mmap分配阈值(默认值128KB):根据设置的mmap的分配策略进行分配,如果没有开启m
mqzhuang
·
2011-04-24 16:00
算法
Glibc内存管理--
ptmalloc2
源代码分析(六)
3.2.3.4 sbrk与mmap 从进程的内存布局可知,.bss 段之上的这块分配给用户程序的空间被称为heap (堆)。start_brk指向heap的开始,而brk指向heap的顶部。可以使用系统调用brk()和sbrk()来增加标识heap顶部的brk值,从而线性的增加分配给用户的heap空间。在使malloc之前,brk的值等于start_brk,也就是说heap大小为0
mqzhuang
·
2011-04-24 16:00
malloc
Glibc内存管理--
ptmalloc2
源代码分析(五)
3.2.3内存管理数据结构概述3.2.3.1 Main_arena与non_main_arena在DougLea实现的内存分配器中只有一个主分配区(mainarena),每次分配内存都必须对主分配区加锁,分配完成后释放锁,在SMP多线程环境下,对主分配区的锁的争用很激烈,严重影响了malloc的分配效率。于是WolframGloger在DougLea的基础上改进使得Glibc的malloc可以支持
mqzhuang
·
2011-04-24 15:00
thread
多线程
数据结构
Glibc内存管理--
ptmalloc2
源代码分析(四)
3.2Ptmalloc内存管理概述3.2.1简介Linux中malloc的早期版本是由DougLea实现的,它有一个重要问题就是在并行处理时多个线程共享进程的内存空间,各线程可能并发请求内存,在这种情况下应该如何保证分配和回收的正确和高效。WolframGloger在DougLea的基础上改进使得Glibc的malloc可以支持多线程——ptmalloc,在glibc-2.3.x.中已经集成了pt
iteye_7858
·
2011-04-18 00:13
Glibc内存管理--
ptmalloc2
源代码分析(四)
3.2 Ptmalloc内存管理概述 3.2.1简介 Linux中malloc的早期版本是由Doug Lea实现的,它有一个重要问题就是在并行处理时多个线程共享进程的内存空间,各线程可能并发请求内存,在这种情况下应该如何保证分配和回收的正确和高效。Wolfram Gloger在Doug Lea的基础上改进使得Glibc的malloc可以支持多线程——ptmalloc,在glibc-2.3
mqzhuang
·
2011-04-18 00:00
多线程
linux
算法
项目管理
Glibc内存管理--
ptmalloc2
源代码分析(三)
3. 概述 3.1 内存管理一般性描述 当不知道程序的每个部分将需要多少内存时,系统内存空间有限,而内存需求又是变化的,这时就需要内存管理程序来负责分配和回收内存。程序的动态性越强,内存管理就越重要,内存分配程序的选择也就更重要。 3.1.1内存管理的方法 可用于内存管理的方法有许多种,它们各有好处与不足,不同的内存管理方法有最适用的情形。 1. C风格的内存管理程序 C
mqzhuang
·
2011-04-18 00:00
多线程
数据结构
算法
项目管理
配置管理
Glibc内存管理--
ptmalloc2
源代码分析(二)
2.2 操作系统内存分配的相关函数 上节提到heap和mmap映射区域是可以提供给用户程序使用的虚拟内存空间,如何获得该区域的内存呢?操作系统提供了相关的系统调用来完成相关工作。对heap的操作,操作系统提供了brk()函数,C运行时库提供了sbrk()函数;对mmap映射区域的操作,操作系统提供了mmap()和munmap()函数。sbrk(),brk() 或者 mmap() 都可以用
mqzhuang
·
2011-04-18 00:00
数据结构
C++
c
linux
C#
Glibc内存管理--
ptmalloc2
源代码分析(一)
1. 问题 项目组正在研发的一个类似数据库的NoSql系统,遇到了Glibc的内存暴增问题。现象如下:在我们的NoSql系统中实现了一个简单的内存管理模块,在高压力高并发环境下长时间运行,当内存管理模块的内存释放给C运行时库以后,C运行时库并没有立即把内存归还给操作系统,比如内存管理模块占用的内存为10GB,释放内存以后,通过TOP命令或者/proc/pid/status查看进程占用的内存有时
mqzhuang
·
2011-04-18 00:00
C++
c
项目管理
NoSQL
C#
深入Linux的内存管理,关于PTMalloc3、Hoard和TCMalloc
WolframGloger在DougLea的基础上改进使得glibc的malloc可以支持多线程——ptmalloc,在glibc-2.3.x.中已经集成了
ptmalloc2
,这就是我们平时使用的malloc
littlefang
·
2010-12-03 10:00
多线程
优化
linux
Google
工具
tcmalloc介绍
http://goog-perftools.sourceforge.net/doc/tcmalloc.html googleperftools中的一员 比glic的实现
ptmalloc2
快6倍,
ptmalloc2
dux003
·
2010-11-06 01:00
TCMalloc:线程缓存的Malloc
tcmalloc-thread-caching-malloc.html作者:SanjayGhemawat,PaulMenage原文翻译:ShiningRay动机TCMalloc要比glibc2.3的malloc(可以从一个叫作
ptmalloc2
牵着老婆满街逛
·
2010-08-20 00:00
【分析】
ptmalloc2
的堆溢出利用初探
ptmalloc2
的堆溢出利用初探创建时间:2003-09-18文章属性:转载文章来源:backend[at]nsfocus.com文章提交:watercloud(watercloud_at_xfocus.org
freexploit
·
2005-03-30 08:00
溢出研究
上一页
1
2
下一页
按字母分类:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
其他