《程序员的自我修养》第一章14页对这部分讲的就很清楚,建议有需要的去看一下,我这里简单做下总结和笔记:
引用一句大佬的话:
“计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决”
那么直接用物理地址出现了什么问题?而怎加了虚拟地址这个中间件为什么可以解决它们?
问题引出:
没有有效的内存管理机制时,直接使用物理地址有以下三个问题:
1. 地址空间不隔离:
物理地址是连续的,直接使用物理地址,所有程序使用的内存在一个空间内,当一个程序内存溢出,很容易影响其他程序的正常运行,导致其他程序崩溃。
2.内存使用效率低:
假设计算机有129M内存,已经有两个程序A、B在运行,程序A需要10M,程序B需要100M,当程序C需要20M,执行时,调入内存,由于程序需要的空间是连续的,所以直接换出A可能释放空间不够,只能换出B,过程中有大量数据在内存和磁盘间交互,效率并不高。
3.程序运行地址不确定:
程序编写时,很多时候访问数据和指令跳转的目标地址是固定的,而直接使用物理地址,不能保证每次装入都放在同一块区域,就给程序编写带来了一定的麻烦。
问题解决:
针对问题1:
虚拟地址保证每个进程都有自己独立的虚拟空间,而且进程空间只能访问自己的地址空间,这样就做到了进程隔离。
针对问题3:
以程序A为例,虚拟空间总是0到100M的连续空间,可以以分段的形式一对一的映射到物理空间上一段100M的空间内,这样即使每次分配的物理空间不固定,但程序看到的虚拟空间地址是固定的,大大方便了编程。
针对问题2:
解决效率的方法,是分页,我们把进程的虚拟空间按页分割,叫虚拟页,常用的装载到内存中,不常用的代码和数据保存到磁盘里,需要的时候再读入,相应的物理内存分页叫物理页,两者映射,可以大大增加内存的使用效率。
ps:CPU发出的和,程序看到的都是虚拟地址,需要一个叫MMU(在cpu内部)的部件做映射,转化成物理地址。