区别

物理内存

物理内存是真实的内存空间,通过物理内存地址,标记存储的数据,物理内存的实际大小也与内存条有关,由内核直接调用使用

虚拟内存

虚拟内存是物理内存的映射关系,为了防止程序开辟不同的物理内存空间,或者多处占用,则由操作系统去调度,使得进程在调用使用内存时需要通过虚拟内存的映射找到对应的物理内存地址,最终才能使用存储数据

如下图所示

olRoWT.png
olRoWT.png

Swap内存空间

Swap内存空间,顾名思义就是交换内存的空间,它的空间是硬盘空间,他是一个很有意思的东西,我们真实的内存空间存储时也是分一段一段去存储的,由于无法连续,那么可能也就无法让性能最大化

例如下图

olWiOH.png
olWiOH.png

游戏,浏览器及音乐各占不同的内存空间,当浏览器进程退出时,操作系统会回收内存空间,但由于它是一段一段存储的,导致后来的程序想要占用200M的内存空间则无法实现,最多只能使用128M。

而交换空间则应运而生,程序在发生浏览器退出时,会将后面的音乐占用内存放到交换空间中,而后清空游戏后面的内存,再将音乐内存直接放到游戏内存后面,而后面的下一个程序则可以直接占用内存200m

所以交换空间配置适量的大小也很重要,太大没意义,太小则可能无法满足释放内存的需求,而由于交换空间是硬盘空间,速度显然不是很友好,因此相当大的程序释放(放入)时也许会造成程序卡顿。

而这种分段的片段,也可以称之为内存分段

由于内存分段的数量过于庞大,他需要每次程序释放时同时释放内存碎片,为了更好地释放内存,物理内存存储的也是映射关系,也称之为 内存分页,相当于一个索引,一个内存分页存储着不同内存分段的物理地址,而程序只需要通过内存分页即可找到真实的内存数据,由于现实场景中,进程数量的激增,一层分页也无法满足所有,需要每个进程都保存一份分页不太现实,就出现了多级分页,只存储顶级分页及常用的二级分页

olj5DI.png
olj5DI.png

总结来说 Swap是硬盘空间,速度较差,它存储的进程数据一般是交换空间数据或者不活跃的进程数据

总结

为了在多进程环境下,使得进程之间的内存地址不受影响,相互隔离,于是操作系统就为每个进程独立分 配一套虚拟地址空间,每个程序只关心自己的虚拟地址就可以,实际上大家的虚拟地址都是一样的,但分 布到物理地址内存是不一样的。作为程序,也不用关心物理地址的事情。

每个进程都有自己的虚拟(内存)空间,而物理内存只有一个,所以当启用了大量的进程,物理内存必然会很紧 张,于是操作系统会通过内存交换技术,把不常使用的内存暂时存放到硬盘(换出),在需要的时候再装 载回物理内存(换入)。

划分空间

C语言中的空间划分

C语言有着各式各样的内存清理问题,这也是各种C语言BUG的大头

o1pdmj.png
o1pdmj.png

C语言中,动态分配的内存(malloc,mmap)则是动态分配堆和文件的内存

参考

  • 小林Coding(图解系统)

近期写一写感谢大佬的电子图书笔记,小白受益良多