目录
一、图形简介
二、详解
1、物理内存
硬件上,就是内存条。我们知道一个程序运行,必要开一片内存来存储其相关指令和需要用到的堆栈段空间等。
2、虚拟内存
物理内存总共4G或16G的大小,若每个进程都开4G物理内存,那物理内存就会被很快用完,系统多进程运行也必将受限。
为了节省物理内存,从逻辑的角度上,我们为每个进程虚拟出4G虚拟内存,每个进程都以为自己拿到了4G内存。
好处是不再为每个进程分配4G物理内存,而是实际用了多少,物理内存就给分配多少
3、磁盘swap分区
对物理内存扩展,若4G物理内存分配完了,那程序的数据就会存到磁盘swap分区上。
4、为了节省内存
4.1、实际用了多少,物理内存就给分配多少
如:一个进程实际用了400M内存,那4G虚拟内存理论上就对应400M的物理内存。因不是一下就分配的(因虚拟内存和swap分区存在,允许程序什么时候用就什么时候分配物理内存),所以某个时间点上,对应的物理内存<400M
4.2、物理内存什么时候用什么时候分配
- 因cpu只与物理内存交互,所以什么时候用到了swap分区上的数据,什么时候就把数据拷贝或做页面置换到物理内存。
- 实际上一开始虚拟空间都被映射到了磁盘空间当中(像代码段,常量数据等),只有当访问到此地址时,也就是真正用到的时候,才会将磁盘上的数据拷贝到物理内存中。
- 像malloc动态分配内存时也只是分配了虚拟内存,即为这块虚拟内存对应的页表项做相应的设置,当进程真正访问到此数据时,才引发页面异常。
- 先建立好虚拟内存和磁盘swap分区、虚拟内存和物理内存的映射关系;进程创建时,程序的代码段和数据其实还在磁盘上,并未放到物理内存上
- 运行到对应的程序时,进程查找页表,根据映射关系,发现其真正的地址(存储的真正位置)并不在物理内存上而是在磁盘上。
- 此时发生缺页异常 -> 进程阻塞 -> 页面置换或拷贝,将磁盘数据放到物理内存中 -> 进程就绪
- 进程运行 -> 访问其对应的物理内存