物理内存、虚拟内存与交换空间
物理内存是内存条上的空间。
虚拟内存不同于物理内存,虚拟内存是操作系统对进程地址空间管理(process address space management)而设计的一个逻辑内存空间。虚拟内存通过页映射表(page table)映射到物理内存空间。我们程序中的指针其实就是虚拟内存空间中的地址。
交换空间物理内存被占满,此时就需要移出物理内存,放进该存储空间,参考该链接[1]
虚拟内存 Memory Types
参考该链接[2]。
并不是所有虚拟内存都是相同的,大致可以分为以下四类:
PRIVATE | SHARED | |
---|---|---|
ANONYMOUS | 1stack malloc() mmap(ANON, PRIVATE) brk()/sbrk() | 2POSIX shm* mmap(ANON, SHARED) |
FILE-BACKED | 3mmap(fd, PRIVATE) pgms/shared libraries | 4mmap(fd, SHARED) |
Private Memory进程私有的内存
Shared Memory共享内存,映射相同内存的所有进程都会看到修改
Anonymous Memory没有文件背景的页面,不是以文件形式存在,如堆,栈,数据段等。
File-backed有文件背景的页面
NOTE:匿名页面可能会占用交换区域,而文件支持的页面则不会占用交换区域。
ps.表格中3部分链接[2]和链接[3]有点差别,binary和pgms暂未求证是否是相同的。
另一个概念,SWAP
当系统没有物理内存时,内核会尝试将一些数据从RAM移动到磁盘。如果内存是文件支持和共享的,这很容易。由于文件是数据的来源,它只是从RAM中删除,然后在下次读取时,它将从文件中加载。
内核还可以选择从RAM中删除匿名/私有内存。在这种情况下,数据写在磁盘上的特定位置。在Linux中,swap通常存储在特定分区中,在其他系统上,这可以是特定文件。然后,它的工作方式与文件支持的内存相同:当它被访问时,它从磁盘读取并重新加载到RAM中。
top命令
可以参考该链接[3]
%MEM - 简单的RES除以总物理内存
VIRT - 表格中所有的象限、上图 virtual addresses space 所有的
RES - 任何占用物理内存的东西,上图 virtual addresses space 中已经映射到 physical address space 的地址,就是左边有颜色的那部分(text、data、stack)。从Linux-4.5开始,是以下三个字段的总和:
- RSan - 表格中象限1未被swap, which include any former quadrant 3 pages if modified(这句看不懂,哭哭)
- RSfd - 表格中象限3和象限4未被swap
- RSsh - 表格中象限2未被swap
CODE - 表格中象限3的’pgms’部分,可执行代码的物理内存量
SHR - RES的子集(不包括1,包括所有2和4,一些3)
DATA - VIRT的整个象限1部分加上象限3的所有未被swap显式mmap文件支持
SWAP - 除了象限4被swap的虚拟内存空间大小。
NOTE:即使程序映像和共享库被认为是进程私有,它们也会被内核考虑为共享(SHR)。
源码分析可以参考链接[4]
其他,查看内存工具,如进程的smaps文件,命令:cat /proc/进程的pid/smaps
参考链接
[1] https://blog.youkuaiyun.com/u014753393/article/details/50196825
[2] https://techtalk.intersec.com/2013/07/memory-part-1-memory-types/
[3] http://man7.org/linux/man-pages/man1/top.1.html
[4] https://www.cnblogs.com/xuxm2007/archive/2012/06/05/2536294.html
[5] https://blog.youkuaiyun.com/jasonchen_gbd/article/details/79462014