欢迎来到天天文库
浏览记录
ID:33482273
大小:123.50 KB
页数:12页
时间:2019-02-26
《对内存空间地址各层理解》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、内存分配的原理__Linux虚拟内存管理(glibc)_Linux的虚拟内存管理有几个关键概念_Linux虚拟地址空间如何分布_malloc和free是如何分配和释放内存_如何查看堆内内存的碎片情况_既然堆内内存brk和sbrk不能直接释放,为什么不全部使用mmap来分配,munmap直接释放呢 2013-02-1821:03:06
2、 分类: Linux系统编程
3、举报
4、字号 订阅Linux虚拟内存管理(glibc) 在使用mysql作为DB开发的兑换券系统中,随着分区表的不断创建,发现mysqld出
5、现了疑似“内存泄露”现象,但通过valgrind等工具检测后,并没发现类似的问题(最终原因是由于glibc的内存碎片造成)。 因此,需要深入学习Linux的虚拟内存管理方面的内容来解释这个现象;Linux的虚拟内存管理有几个关键概念: 1、每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址; 2、虚拟地址可通过每个进程上的页表(在每个进程的内核虚拟地址空间)与物理地址进行映射,获得真正物理地址; 3、如果虚拟地址对应物理地址不在物理内存中,则产生缺页中断,真正分配物理地址,同时更新进程的页表;如
6、果此时物理内存已耗尽,则根据内存替换算法淘汰部分页面至物理磁盘中。 基于以上认识,进行了如下分析:一、Linux虚拟地址空间如何分布?Linux使用虚拟地址空间,大大增加了进程的寻址空间,由低地址到高地址分别为: 1、只读段:该部分空间只能读,不可写;(包括:代码段、rodata段(C常量字符串和#define定义的常量) )2、数据段:保存全局变量、静态变量的空间; 3、堆:就是平时所说的动态内存,malloc/new大部分都来源于此。其中堆顶的位置可通过函数brk和sbrk进行动态调整。 4、文件映射区域
7、:如动态库、共享内存等映射物理空间的内存,一般是 mmap函数所分配的虚拟地址空间。 5、栈:用于维护函数调用的上下文空间,一般为8M,可通过ulimit–s查看。 6、内核虚拟空间:用户代码不可见的内存区域,由内核管理(页表就存放在内核虚拟空间)。下图是32位系统典型的虚拟地址空间分布(来自《深入理解计算机系统》)。 32位系统有4G的地址空间:: 其中0x08048000~0xbfffffff是用户空间,0xc0000000~0xffffffff是内核空间,包括内核代码和数据、与进程相关的数据结构(如
8、页表、内核栈)等。另外,%esp执行栈顶,往低地址方向变化;brk/sbrk函数控制堆顶_edata往高地址方向变化。64位系统结果怎样呢?64位系统是否拥有2^64的地址空间吗? 事实上,64位系统的虚拟地址空间划分发生了改变: 1、地址空间大小不是2^32,也不是2^64,而一般是2^48。因为并不需要2^64这么大的寻址空间,过大空间只会导致资源的浪费。64位Linux一般使用48位来表示虚拟地址空间,40位表示物理地址,这可通过/proc/cpuinfo来查看 addresssizes :40bitsph
9、ysical,48bitsvirtual 2、其中,0x0000000000000000~0x00007fffffffffff表示用户空间,0xFFFF800000000000~0xFFFFFFFFFFFFFFFF表示内核空间,共提供256TB(2^48)的寻址空间。这两个区间的特点是,第47位与48~63位相同,若这些位为0表示用户空间,否则表示内核空间。 3、用户空间由低地址到高地址仍然是只读段、数据段、堆、文件映射区域和栈; 二、malloc和free是如何分配和释放内存?参看博客:http://blog.1
10、63.com/xychenbaihu@yeah/blog/static/132229655201210975312473/ 三、如何查看堆内内存的碎片情况 ?glibc提供了以下结构和接口来查看堆内内存和mmap的使用情况。 structmallinfo{ intarena; /*non-mmappedspaceallocatedfromsystem*/ intordblks; /*numberoffreechunks*/ intsmblks; /*number
11、offastbinblocks*/ inthblks; /*numberofmmappedregions*/ inthblkhd; /*spaceinmmappedregions*/ intusmblks; /*maximumtotalallocatedspace*/ intfsmblks;
此文档下载收益归作者所有