进程的虚拟内存、物理内存、共享内存

github 进程的虚拟内存、物理内存、共享内存

最近在数据库上执行SQL时,发现该SQL卡住了,于是top看了下该进程cpu、内存的使用情况,然后发现top列出的3个指标VIRT、RES、SHR,我对这三者不太了解,于是就查了下,发现这篇文章讲的不错,从中提取了一部分内容,作为笔记。

首先,需要了解两个重要的概念,虚拟内存(Virtual Memory)和驻留内存(Resident Memory)

虚拟内存

需要强调的是虚拟内存不同于物理内存,虽然两者都包含内存字眼但是他们属于两个不同层面的概念。进程占用虚拟内存空间大并非意味着程序的物理内存也一定占用很大。虚拟内存是操作系统内核为了对进程地址空间进行管理啊(process address space management)而精心设计的一个逻辑意义上的内存空间概念。我们程序中的指针其实都是这个虚拟内存空间的地址。我们程序中的指针其实都是这个虚拟内存空间中的地址。比如我们在写完一段C++程序之后都需要采用g++进行编译,这时候编译器采用的地址其实就是虚拟内存空间的地址。因为这时候程序还没有运行,所以就没有所谓的物理内存空间地址。凡是程序运行过程中可能需要用到的指令或者数据都必须在虚拟内存空间中。既然说虚拟内存是一个逻辑意义上(假象的)内存空间,为了能够让程序在物理机器上运行,那么必须统一有一套机制可以让这些假象的虚拟呢村空间映射到屋里内存空间(即RAM内存条上的空间)。这其实就是操作系统中也映射表(page table)所做的事情了。内核会为系统中每一个进程维护一份相互独立的页映射表,页映射表的基本原理是将程序运行过程中所需要访问的一段虚拟内存空间通过页映射表映射到一段屋里内存空间上,这样cpu访问虚拟内存地址的时候就可以通过这种查找页映射表的机制访问屋里内存上的某个对应的地址。“页”是虚拟内存空间向物理内存空间映射的基本单元。

下图1演示了虚拟空间和物理内存空间的相互关系,它们通过Page Table关联起来。其中虚拟内存空间中着色的部分分别被映射到物理内存空间对应相同着色的部分。而虚拟内存空间中灰色的部分表示物理内存空间中没有与之对应的部分,也就是说灰色部分没有别映射到物理内存空间中。这么做也是本着“按需映射”的指导思想,因为虚拟内存空间很大,可能其中很多部分再一次程序运行过程中根本不需要访问,所以也就没必要将虚拟内存空间中的这些部分映射到物理内存空间上。

图一:虚拟内存空间和物理内存空间的相互关系
图一:虚拟内存空间和物理内存空间的相互关系

到这里为止,已经基本阐述了什么事虚拟内存了。总结一下就是,虚拟内存是一个假象的内存空间,在程序运行过程中虚拟内存空间中需要被访问的部分会被映射到物理内存中。虚拟内存空间大只能表示程序运行过重中可访问的空间比较大,不能代表屋里内存空间占用也大。

驻留内存

驻留内存,顾名思义是指那些被映射到进程虚拟内存的物理内存。上图1中,在系统物理内存空间中被着色的部分是驻留内存。比如,A1、A2、A3和A4都是A的驻留内存;B1、B2和B3是进程B的驻留内存。进程的主流内存就是进程实际占用的物理内存。一般我们所讲的进程占用了多少内存,其实就是说的占用了多少驻留内存而不是多少虚拟内存。因此,虚拟内存大并不意味着占用的物理内存大。

top命令中VIRT、RES和SHR所别代表的含义

  • VIRT表示的是进程虚拟内存空间大小。对应到图一种的进程A来说就是A1、A2、A3、A4以及灰色部分所有空间的综合。也就是说VIRT包含了再已经映射到物理内存空间的部分和尚未映射到物理内存空间的部分的总和。

  • RES的含义是指进程虚拟内存空间中已经映射到屋里内存空间的那部分的饿大小。对应图1中的进程A来说就是A1、A2、A3、A4以几个部分空间的总和。所以说,看进程运行过程中占用了多少内存应该看RES的值而不是VIRT的值。

  • SHR是share的缩写,它表示的是进程占用的共享内存大小。在上图一种我们看到进程A虚拟内存空间中的A4和进程B虚拟内存空间中的B3都映射到物理内存空间的A4/B3部分。咋一看很奇怪,为什么会出现这样的情况呢?其实我们写的程序会依赖于很多外部的动态库(.so),比如libc.so、libld.so等等。这些动态库在内存中仅仅会保存/映射一份,如果某个进程运行时需要这个动态库,那么动态加载器会将这块内存映射到对应进程的虚拟内存空间中。多个进程之间通过共享内存的方式相互通信也会出现这样的情况。这么一来,就会出现不同进程的虚拟内存空间会映射到相同物理内存空间。这部分物理内存空间其实是被多个进程锁共享的,所以我们将他们成为共享内存,用SHR表示。某个进程占用的内存除了和别的进程共享的内存之外就是自己的独占内存了。所以要计算进程断站内存的逮虾只要用RES的值减去SHR值即可,即RES = VIRT - SHR,如下图二。

图二
图二

猜你喜欢

转载自www.cnblogs.com/liangping/p/12601281.html
今日推荐