对内存空间地址各层理解

上传人:mg****85 文档编号:34307871 上传时间:2018-02-23 格式:DOC 页数:11 大小:123.50KB
返回 下载 相关 举报
对内存空间地址各层理解_第1页
第1页 / 共11页
对内存空间地址各层理解_第2页
第2页 / 共11页
对内存空间地址各层理解_第3页
第3页 / 共11页
对内存空间地址各层理解_第4页
第4页 / 共11页
对内存空间地址各层理解_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《对内存空间地址各层理解》由会员分享,可在线阅读,更多相关《对内存空间地址各层理解(11页珍藏版)》请在金锄头文库上搜索。

1、内存分配的原理_Linux 虚拟内存管理(glibc)_Linux 的虚 拟内存管理有几个关键概念_Linux 虚拟地址空间如何分布_malloc 和 free 是如何分配和释放内存_如何查看堆内内存的碎片情况_既然堆内内存 brk 和 sbrk 不能直接释放,为什么不全部使用 mmap 来分配, munmap 直接释放呢 2013-02-18 21:03:06| 分类: Linux 系统编程|举报| 字号 订阅Linux 虚拟内存管理(glibc)在使用 mysql 作为 DB 开发的兑换券系统中,随着分区表的不断创建,发现 mysqld 出现了疑似“内存泄露” 现象,但通过 valgrin

2、d 等工具检测后,并没发现类似的问题(最终原因是由于 glibc 的内存碎片造成)。因此,需要深入学习 Linux 的虚拟内存管理方面的内容来解 释这个现象;Linux 的虚拟内存管理有几个关键概念: 1、每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址; 2、虚拟地址可通 过每个进 程上的页表( 在每个进程的内核虚 拟地址空间)与物理地址进行映射,获得真正物理地址; 3、如果虚拟 地址对应物理地址不在物理内存中,则产生缺页中断,真正分配物理地址,同时更新进程的页表;如果此时物理内存已耗尽,则根据内存替换算法淘汰部分页面至物理磁盘中。 基于以上认识,进行了如下分析:一、L

3、inux 虚拟地址空间如何分布?Linux 使用虚拟地址空间,大大增加了进程的寻 址空间,由低地址到高地址分别为: 1、只读段: 该部分空间只能 读,不可写;( 包括: 代码段、rodata 段(C 常量字符串和#define 定义 的常量) )2、数据段: 保存全局变量、静 态变量的空间; 3、堆 :就是平 时所说的 动态内存, malloc/new 大部分都来源于此。其中堆顶的位置可通过函数 brk 和 sbrk 进行动态调整。 4、文件映射区域 :如动态库 、共享内存等映射物理空间的内存,一般是mmap 函数所分配的虚拟地址空间。 5、栈:用于 维护函数调用的上下文空 间,一般为 8M

4、,可通过 ulimit s 查看。 6、内核虚拟 空间:用户代 码不可见的内存区域,由内核管理( 页表就存放在内核虚拟空间) 。下图是 32 位系统典型的虚 拟地址空间分布(来自深入理解计算机系统)。 32 位系统有 4G 的地址空间:其中 0x080480000xbfffffff 是用户空间,0xc00000000xffffffff 是内核空间,包括内核代码和数据、与进程相关的数据结构(如页表、内核栈)等。另外,%esp 执行栈顶,往低地址方向变化;brk/sbrk 函数控制堆 顶_edata 往高地址方向 变化。64 位系统结果怎样呢? 64 位系统是否拥有 264 的地址空间吗? 事实上

5、, 64 位系统的虚 拟地址空间划分发生了改 变: 1、地址空间 大小不是 232,也不是 264,而一般是 248。因为并不需要 264 这么大的寻址空间,过大空间只会导致资源的浪费。64 位 Linux 一般使用 48 位来表示虚拟地址空 间,40 位表示物理地址,这可通过 /proc/cpuinfo 来查看 address sizes : 40 bits physical, 48 bits virtual 2、其中,0x00000000000000000x00007fffffffffff 表示用户空间, 0xFFFF800000000000 0xFFFFFFFFFFFFFFFF 表示内核

6、空间,共提供 256TB(248) 的寻址空间。这两个区间的特点是,第 47 位与 4863 位相同,若 这些位为 0 表示用户空间,否则表示内核空间。 3、用户空间 由低地址到高地址仍然是 只读段、数据段、堆、文件映射区域和栈;二、malloc 和 free 是如何分配和释放内存?参看博客:http:/ ?glibc 提供了以下结构和接口来查看堆内内存和 mmap 的使用情况。 struct mallinfo int arena; /* non-mmapped space allocated from system */ int ordblks; /* number of free chun

7、ks */ int smblks; /* number of fastbin blocks */ int hblks; /* number of mmapped regions */ int hblkhd; /* space in mmapped regions */ int usmblks; /* maximum total allocated space */ int fsmblks; /* space available in freed fastbin blocks */ int uordblks; /* total allocated space */ int fordblks; /

8、* total free space */ int keepcost; /* top-most, releasable (via malloc_trim) space */ ;/*返回 heap(main_arena)的内存使用情况,以 mallinfo 结构返回 */ struct mallinfo mallinfo();/* 将 heap 和 mmap 的使用情况输出到 stderr*/ void malloc_stats();可通过以下例子来验证 mallinfo 和 malloc_stats输出结果。 #include #include #include #include #inclu

9、de #include size_t heap_malloc_total, heap_free_total,mmap_total, mmap_count;void print_info() struct mallinfo mi = mallinfo(); printf(count by itself:n); printf(theap_malloc_total=%lu heap_free_total=%lu heap_in_use=%luntmmap_total=%lu mmap_count=%lun, heap_malloc_total*1024, heap_free_total*1024,

10、heap_malloc_total*1024-heap_free_total*1024,mmap_total*1024, mmap_count); printf(count by mallinfo:n); printf(theap_malloc_total=%lu heap_free_total=%lu heap_in_use=%luntmmap_total=%lu mmap_count=%lun, mi.arena, mi.fordblks, mi.uordblks, mi.hblkhd, mi.hblks); printf(from malloc_stats:n); malloc_stat

11、s(); #define ARRAY_SIZE 200 int main(int argc, char* argv) char* ptr_arrARRAY_SIZE; int i; for( i = 0; i ) 来修改这个临界值。五、如何查看进程的缺页中断信息? 可通过以下命令查看缺页中断信息 ps -o majflt,minflt -C ps -o majflt,minflt -p 其中: majflt 代表 major fault ,指大错误;minflt 代表 minor fault ,指小 错误。这两个数值表示一个进程自启动以来所发生的缺页中断的次数。其中 majflt 与 minf

12、lt 的不同是:majflt 表示需要读写磁盘,可能是内存对应页面在磁盘中需要load 到物理内存中,也可能是此时物理内存不足,需要淘汰部分物理页面至磁盘中。参看: http:/ 六、除了 glibc 的 malloc/free ,还有其他第三方实现吗?其实,很多人开始诟病 glibc 内存管理的实现,特别是高并发性能低下和内存碎片化问题都比较严重,因此,陆续出现一些第三方工具来替换 glibc 的实现,最著名的当属 google 的 tcmalloc 和 facebook 的jemalloc 。 网上有很多资源,可以自己查(只用使用第三方库,代码不用修改,就可以使用第三方库中的 malloc)。参考资料: 深入理解计算机系统第 10 章 http:/www.kernel.org/doc/Documentation/x86/x86_64/mm.txthttps:/

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号