介绍
比较windows和linux的内存管理的区别
介绍应用程序对内存的一些知识
概念
地址空间
每一个32位进程都有4G的地址,其中2G内核空间,2G用户空间(linux 是1G内核,3G用户)。
这个地址空间实际是虚拟地址空间,需要通过内存映射到实际的物理内存地址
缺页异常
当进程访问的虚拟空间在页表中查询不到时,会触发缺页异常,然后进入内核空间进行分配物理空间、更新进程页表,返回用户空间,恢复进程运行。
交换分区(swap)
Swap其实就是把一块磁盘空间当作内存使用,windows xp/7 下也有专门的设置“虚拟内存”的功能。
只在物理内存不足时才需要使用磁盘作为交互区,但性能更加慢。
free 命令中buffer和cache的意义
[root@VM101124 ~]# free
total used free shared buff/cache available
Mem: 3880484 140028 3164964 17172 575492 3452908
Swap: 2097148 0 2097148
- buffer:从磁盘读取数据的缓存
- cache:从文件读取数据的页缓存
结论
从整体设计上,两者并没有明显的区别,该有的概念都有,虚拟内存、换页,该有的缓存也都有,内存管理器的设计方式也很相近,只是叫法上有所不同。
windows有保留空间、提交空间的概念,linux 虽然没这个概念,但是在内存malloc<128K时使用brk()申请空间时其实已经预留了所谓的保留空间。在重复调用malloc(n)字节时,除了第一次(或预留空间不足时)会调用brk申请空间,剩下的情况则不调用brk接口的。
同样的,在调用大内存时都采用了直接内存申请的方式:windows 在内存大于508K时,会调用virtualalloc直接申请大内存,而linux在大于128K时,直接调用mmap()直接使用内存映射来分配。
遇到的问题也是一样的:
- 碎片
- 泄漏
- 默认内存分配器性能问题
- 踩内存
解决方法
内存池
使用tcmalloc/jemalloc替换glibc默认的ptmalloc2.
ptmalloc2
- 每次申请内存需要加锁
- 通用性更好,对于任意内存大小申请,性能一致
tcmalloc
小内存:1~256K中等内存:256K~1M大内存:>1M
- 无锁
- 对于小内存(<256K)性能优异
工具
windows
- processxp
- windbg
- umdh
- application verifier(越界访问)
linux
- free
- gdb
- vmstat
- valgrind(越界访问)
- memleak
案例分析
如何通过dump分析内存 - 待发布
如何分析踩内存 - 待发布
参考文章
Hack the Virtual Memory