Linux 内存
一、虚拟内存
这个虚拟内存指的是“进程的虚拟内存”,或者说是虚拟地址空间,注意与” Linux 系统的虚拟
内存“区分,”Linux 系统的虚拟内存“指的是常说的 Swap 空间,在第四点会说。
虚拟内存不同于物理内存,进程占用虚拟内存空间大并非意味着程序的物理内存也一定占用很
大。虚拟内存是操作系统内核为了对进程地址空间进行管理设计的一个逻辑意义上的内存空间
概念。我们程序中的指针其实都是这个虚拟内存空间中的地址。既然说虚拟内存是一个逻辑意
义上的内存空间,为了能够让程序在物理机器上运行,操作系统使用了页映射表(page table)
来实现逻辑上的虚拟内存空间到物理内存空间(实际存在的 RAM 内存条上的空间)的映射。内
核会为系统中每一个进程维护一份独立的页映射表。页映射表的基本原理是将程序运行过程中
需要访问的一段虚拟内存空间通过页映射表映射到一段物理内存空间上,这样 CPU 访问对应
虚拟内存地址的时候就可以通过查找页映射表来访问物理内存上的某个对应的地址。页是虚拟
内存空间向物理内存空间映射的基本单元。

可以参考该页表映射图。其中虚拟内存空间中着色的部分分别被映射到物理内存空间对应相同
着色的部分,而灰色的部分没有被映射到物理内存空间中。这也是按需映射,因为虚拟内存空
间很大,可能其中很多部分在一次程序运行过程中根本不需要访问,所以也就没有必要将虚拟
内存空间中的这些部分映射到物理内存空间上。
总结一下就是,虚拟内存是一个逻辑内存空间,在程序运行过程中虚拟内存空间中需要被访问的
部分会被映射到物理内存空间中。虚拟内存空间大只能表示程序运行过程中可访问的空间比较大,不代表物理内存空间占用也大。
二、驻留内存
驻留内存是指那些被映射到进程虚拟内存空间的物理内存。在上图中,物理内存空间中被着色
的部分都是驻留内存。比如,A1、A2、A3 和 A4 是进程 A 的驻留内存;B1、B2 和 B3 是进程
B 的驻留内存。进程的驻留内存就是进程执行时实际占用的物理内存。一般我们所讲的进程占用
了多少内存,其实就是说的占用了多少驻留内存而不是多少虚拟内存。因为虚拟内存大并不意味
着占用的物理内存大。
三、共享内存
共享内存是指进程共享的物理内存。在上图中进程 A 虚拟内存空间中的 A4 和进程 B 虚拟内
存空间中的 B3 都映射到了物理内存空间的 A4/B3 部分。因为我们的多个进程在执行时很可能
会依赖一些实现基础功能的库,而这些库加载到物理内存后只会存在一份,如果某个进程运行
时需要某个库,那么就会将这个库加载到的物理内存映射到当前进程的虚拟内存空间中。多个
进程之间通过共享内存的方式相互通信也是这样实现的。这么一来,就会出现不同进程的虚拟
内存空间会映射到相同的物理内存空间。这部分物理内存空间其实是被多个进程所共享的,所
以称为共享内存。某个进程占用的内存除了和别的进程共享的内存之外就是自己的独占内存了。
所以要计算进程独占内存的大小时就用它所占的物理内存大小减去它和其它进程共享的内存大
小即可。
四、Swap 内存
Swap 内存是指“Linux 系统的虚拟内存”,Swap 空间实际上就是硬盘上的一块空间,可以是一
个分区,也可以是一个文件,或者是它们的组合。当进程执行需要载入数据到内存时,如果物
理内存仍然足够,通常是不会用到 Swap 空间的,如果物理内存吃紧不够用了,就会把当前内
存中暂时不用的数据换出保存到 Swap 空间,之后进程执行又需要 Swap 空间中的数据时,就
会再次换入到内存中。由于 Swap 空间实际上就是磁盘上的空间,所以频繁的换入换出会出现
大量的磁盘 IO,会导致严重的性能问题。
网友评论