Linux虚拟内存与物理内存
概念 在linux中,内存分为物理内存和虚拟内存,即ps命令中的RSS和VSZ。虚拟内存存在的原因是为了解决在物理内存上直接划分内存存在的一些问题,比如: 频繁申请和回收内存导致的空间碎片化 可以随意访问用于其他用途的内存区域,不安全 难以执行多任务 进程能看见的是虚拟地址空间,且地址段时连续的,而系统上搭载的内存的实际的地址是物理地址。通过命令 readelf和cat /proc/<pid>/maps输出的就是进程的虚拟地址。 虚拟内存以页为单位进行划分的,在x86_64的架构中页大小默认是4KB,getconf PAGESIZE可以查看页大小。通过内核管理的页表可以完成从虚拟地址到物理地址的转换,每个进程拥有独立的虚拟地址空间,进程的虚拟内存是连续的,但是在物理内存中不一定是连续,且进程只能访问自己的虚拟内存段,没法访问到其他进程的虚拟内存空间和物理内存。 利用虚拟内存机制的重要功能: 文件映射 请求分页 写时复制 swap 多级页表 标准大页 请求分页 如果内核直接从物理内存中获取需要的区域,然后设置页表并关联虚拟地址空间与物理地址空间,这样会导致内存的浪费,有一部分内存获取后可能进程到运行结束都不会使用,如: 用于大规模程序中的、程序运行时未使用的功能代码段和数据段 由glibc保留的内存池中未被用户利用的部分 所以利用请求分页来解决这个问题。对于虚拟地址空间内的各个页面,只有在进程初次访问页面时才会为这个页面分配物理内存。 过程: ① 进程访问入口点 ② CPU 参照页表,筛选出入口点所属的页面中哪些虚拟地址未关联物理地址 ③ 在CPU中引发缺页中断 ④ 内核中的缺页中断机构为页面分配物理内存并更新页表 ⑤ 回到用户模式继续运行进程 测试 现用以下测试代码观察虚拟内存和物理内存的分配关系 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 #include <unistd....