12 虚拟内存

程序大到无法一次性装入内存,或内存中运行的程序过多无法容纳下时就需要用到虚拟内存技术。
在程序运行的过程中,由CPU产生虚拟地址,该虚拟地址经过MMU(内存管理单元)转换成物理地址,然后使用物理地址去访问内存。那么虚拟地址存在的原因是什么?为何不能由CPU直接产生物理地址呢?原因有三

  1. 使用虚拟地址可以更加高效的使用物理内存。在计算机中物理内存是有限的,像笔记本一般为4G或者8G,对于现代多任务系统来说这显然是不够的。比如我们需要看一个4G以上大小的视频或者开了多个应用程序需要占用的空间大于4G,这个时候物理内存就不够了。存在虚拟内存的情况下,可以为每个程序分配足够大小的虚拟地址空间,但不必一次性全部载入内存,这些地址空间在一开始并没有真正的对应的物理地址,而是在真正使用时才去对应(重定位)。这样在访问后面的地址空间时就可以将前面在当前没有访问的物理页释放掉或者交换到硬盘中。这样这个物理页又可以对应新的虚拟地址,从而使物理内存可以充分的利用。
  2. 使用虚拟地址可以使内存的管理更加便捷(动态)。在程序编译的时候就会生成虚拟地址,对于不同的机器或者对于同一台机器的不同时间,该虚拟地址可以对应不同的物理页。试想如果没有虚拟地址,那么编译时产生的物理地址在某些机器上可能已经被占用而不能访问,从而导致程序需要重新编译
  3. 为了安全性考虑,在使用虚拟地址的时候,暴露给程序员的永远都是虚拟地址,而具体的物理地址在哪里只有系统才了解,这样就提高了系统的封装性。

下面来看看虚拟内存具体的工作过程。

虚拟内存是将逻辑地址映射到物理地址的桥梁。逻辑地址是分段的(代码段、数据段等),暴露给程序员的是分段,而为了提高物理内存的而使用率和运行效率,实际的物理内存是分页。所以需要借助虚拟内存:首先为程序分配虚拟内存,将程序中的各段分配到虚拟内存的闲置空间中;然后再将虚拟内存中的各段再分成若干页,映射到物理内存的页框中。如下图所示

那么地址翻译(重定位)的过程就是:由CS:ip通过查段表计算虚拟地址,然后由虚拟地址通过查页表计算物理地址。从用户的角度来看就是段的访问,从物理内存的角度就是分成一页一页。如下图所示

段页结合的实际内存管理的步骤为:为进程分配虚拟内存——>建段表——分配物理内存——>建页表——>内存动态管理
段页结合式内存下程序如何载入内存:即上面的分配虚拟内存和物理内存
1.虚拟内存割出一段区域给用户,存放数据段、代码段等
2.把用户的数据段分割成页,再映射到物理内存上。
程序、虚拟内存+物理内存的样子如下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章