内存管理之虚拟内存

定义:

​ 虚拟内存是计算机系统内存管理的一种技术。

思想:

​ 假设有一个很大的程序的运行需要占用4GB内存,我的物理内存只有2GB,不足以支撑该程序的运行。根据计算机中的局部性原理,CPU在访问存储器的时候,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。所以,将程序常用的数据与指令放到物理内存中,另一部分就存放到硬盘中。在运行的时候,从内存中取,遇到内存中没有的,就从内存中踢一份子出去,再从硬盘中取出要用到的那一份子放到内存中来。这样,这个程序就可以跑起来了。

​ 虚拟内存的技术就是使得应用程序认为它拥有连续的可用的内存一个连续完整的地址空间,而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。就是上面的那个程序一样,它以为自己拥有4GB的内存,而实际上只有2GB。

大小:

首先清楚一点,虚拟内存的大小和物理内存大小无关,只和CPU寄存器的位数有关。

CPU寄存器是32位的话 --> 虚拟内存大小是2^32,即4GB内存

CPU寄存器是64位的话 --> 虚拟内存大小是2^64,这是一个很大的值,几乎是无限的,就目前的技术来讲,不但物理内存不可能达到这么大,CPU的寻址能力也没有这么大,实现64位长的虚拟地址只会增加系统的复杂度和地址转换的成本,带不来任何好处,所以 Windows 和 Linux 都对虚拟地址进行了限制,仅使用虚拟地址的低48位(6个字节),总的虚拟地址空间大小为 2^48 = 256TB。

实现:

内存映射(以页为单位的映射):

​ 我们知道,当一个程序运行时,在某个时间段内,它只是频繁地用到了一小部分数据,也就是说,程序的很多数据其实在一个时间段内都不会被用到。以整个程序为单位进行映射,不仅会将暂时用不到的数据从磁盘中读取到内存,也会将过多的数据一次性写入磁盘,这会严重降低程序的运行效率。所以现代计算机都使用分页(Paging)的方式对虚拟地址空间和物理地址空间进行分割和映射,以减小换入换出的粒度,提高程序运行效率。

内存分页机制:

​ 举个例子,如果把每一个地址当作一个字的话,内存分页就是规定将多少多少字作为一页。这个页有多少字一般是由操作系统来决定的,一般有4kb个字,一级页表就相当我给一本书按1,2,3…的顺序编了个标号(计算机中就不是1,2,3了,而是对应的虚拟地址的前20位对应的物理映射地址,为什么是前20位后面解释),然后我把这些标号都放到了一个数组里了,这个数组就是页表。如果我发现书中有一个字写错了,我可以通过描述这个字在哪一页,这一页的第几个字来让对方找到我所描述的字。这里的哪一页就相当于页表下标,这一页的第几个字就相当于页内偏移。在虚拟地址空间大小为 4GB,一页4KB大小的情况下,总共包含 2^32 / 2^12 = 2^20 页,需要20位来表示,而一页4KB=2^12需要12位来表示,虚拟地址32位(8字节)刚好够用,高20位用来表示哪一页(页表下标),低12位用来表示这一页的第几个字(页内偏移)。图解如下:

在这里插入图片描述

​ 二级页表就相当于我这一本书不按1,2,3挨个的编号了,而是,把书分成了几个章节,每个章节都从1,2,3开始编号,然后这个时候,我要找某个字,就要需要知道哪一章节,第几页,这页的第几个字才能找到这个字,这个时候虚拟地址的划分就变成了高10位表示哪一章节(页目录下标),中10位表示哪一页(页表下标),低12位表示这一页的第几个字(页内偏移)。图解如下:

在这里插入图片描述

​ 多级页表思路类似…

为什么要有二级页表和多级页表的存在呢?

​ 书是放在硬盘中的,但是书的目录是放在内存中的,是要占用内存空间的,所以目录所占的页数是不是越少越好呢?如果一本书有100页,7章,目录页一页10行,那按一级页表来,我要100除10也就10页才能够,而二级页表则只需要1页不到。

优点:

  1. 提高了内存的使用率

  2. 使不同程序的地址空间相互隔离

  3. 可以实现内存共享,方便进程通信

  4. 可以避免内存碎片,虽然物理内存可能不连续,但映射到虚拟内存上可以连续

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值