Windows内存之虚拟内存

在早期的计算机中,程序都是直接运行在物理内存上的,运行时访问的地址都是物理地址,而这要求程序使用的内存空间不超过物理内存的大小。在现代计算机操作系统中,计算机同时运行多个程序,为了提高CPU的利用率和物理内存的利用率,操作系统应用虚拟内存机制来管理内存。

本文介绍一些与虚拟内存相关的概念。

目录

1.物理内存 vs 虚拟内存

2.物理内存空间 和 虚拟内存空间

3.4GB虚拟内存

cpu位宽 vs cpu的地址总线位宽

4.虚拟地址空间的划分

5.虚拟地址和物理地址的映射

6.物理内存和硬盘之间的置换

7.虚拟内存的重要性


1.物理内存 vs 虚拟内存

物理内存就是内存条,实实在在的内存,即RAM。

虚拟内存是内存管理中的一个概念。

对于一个进程来说,虚拟内存是进程运行时所有内存空间的总和。但这所有内存空间可能有一部分不在物理内存中,另外一部分在其他介质中,比如硬盘。举个例子,当你的程序需要创建一个1G的数据区,但是此时剩余500M的可用物理内存了,那么此时势必不是所有数据都能一起加载到内存(物理内存)中,势必有一部分数据要放到其他介质中(比如硬盘),待进程需要访问那部分在其他介质中的数据时,再通过调度进入物理内存。


2.物理内存空间 和 虚拟内存空间

物理内存大小组成的地址空间就叫物理内存空间。物理内存空间表示的是实实在在的RAM物理内存,其地址空间可以看成一个由 M 个连续的字节大小的单元组成的数组,每个字节都有一个唯一的物理地址。

虚拟内存大小组成的地址空间就叫虚拟内存空间。虚拟内存空间实际上并不存在的,需要的只是虚拟内存空间到物理内存空间的映射关系的一种数据结构。

所谓的地址空间是一个抽象的概念,可以想象成一个很大的数组,每个数组的元素是一个字节,而这个数组的大小就是由地址空间的地址长度决定。比如16G的内存条,具有0~0x3FFFFFFFF(16G)的地址长度的寻址能力。4G虚拟内存,具有0~0xFFFFFFFF的地址长度的寻址能力。

在一个系统中,物理内存空间只有一个,但是虚拟内存空间有很多个。每个虚拟内存空间都有必须有一个映射关系。对于一般程序而言,虚拟内存空间中的很大部分的都是未使用的。

每个虚拟内存空间往往只能映射到很少一部分物理空间上。每个物理页面(将整个物理空间页面划分成多个大小相等的页)通常也只会被映射到一个虚拟地址空间中。如果有一个物理页面被映射到多个虚拟地址空间中,那么这些地址空间将共享此页面,如果在一个虚拟地址空间改写了此页面的数据,这在其他的虚拟地址空间也可以看到变化。


3.4GB虚拟内存

操作系统(32位)会为每一个新创建的进程分配一个 4GB 大小的虚拟内存,从0到2^32-1。(这里说的分配4GB的虚拟内存并不是分配4GB的空间,而是创建一个映射表。以后会介绍到一级页表和二级页表结构

为什么是分配一个4GB的虚拟地址空间,因为在32位操作系统,一个指针长度是 4 字节(指针即为地址,指针里面存储的数值被解释成为内存里的一个地址), 4 字节指针(地址)的寻址能力是从 0x00000000~0xFFFFFFFF ,最大值 0xFFFFFFFF 表示的即为 4GB 大小的容量。这个虚拟空间地址大小和 实际物理内存RAM大小没有关系。

补充:虚拟内存的大小是由操作系统的位宽决定的,即操作系统是32位还是64位。下面解释一下cpu位宽和cpu地址总线位宽的概以及他们的位宽大小会影响什么。

cpu位宽 vs cpu的地址总线位宽

1.我们说的16位cpu,32位cpu,64位cpu,指的都是cpu的位宽,表示的是一次能够处理的数据宽度,即一个时钟周期内cpu能处理的2进制位数,即分别是16bit,32bit和64bit,不是地址总线的数目。

2.cpu的地址总线位宽决定了可以直接进行寻址物理内存空间。所以如果cpu的地址总线是32位的,也就是它可以寻址0~0xFFFFFFFF(4G)的物理内存空间。但是如果你的计算机上只装了512M的内存条,那么物理地址的有效部分只有0x00000000~0x1FFFFFFF,其他部分都是无效的物理地址。(这里无视一些外部的I/O设备映射到物理空间。)

3.cpu位宽不等于cpu的地址总线位宽,16位cpu的地址总线位宽可以是20位,32位cpu的地址总线可以是36位,64位cpu的地址总线位宽可以是36位或者40位(cpu能够寻址的物理地址空间为64GB或者1T)。

4.在cpu访问任何存储单元必须知道其物理地址,所以在一定程度上,cpu的地址总线宽度影响了最大支持的物理内存RAM大小(操作系统的位数也会影响,32位系统,最大就是支持4GB物理内存RAM)

https://www.cnblogs.com/dolphin0520/archive/2013/05/31/3110555.html


4.虚拟地址空间的划分

在 Windows 系统下,虚拟地址空间被分成了 4 部分: NULL 指针区、用户区、 64KB 禁入区、内核区。

用户区每个进程私有使用的,大约 2GB 左右 ( 最大可以调整到 3GB,3GB模式) ,称为用户地址空间。用户区存放的是程序代码和数据, 堆, 共享库, 栈

内核区是所有进程共享的为 2GB ,称为系统地址空间。内核区保存的是系统线程调度、内存管理、设备驱动等数据,这部分数据供所有的进程共享以及操作系统的使用——程序在运行的时候处于操作系统的监管下,监管进程的虚拟空间,当进程进行非法访问时强制结束程序。(2GB的内核区是所有的进程都是同一个2GB吗)

上述的2GB+2GB称为2GB模式,是在默认的windows配置下。可以修改windows配置,可以设置3GB用户地址空间+1GB的系统地址空间,称为3GB模式。


5.虚拟地址和物理地址的映射

一个程序要想执行,必须运行在真实的内存上,所以必须在虚拟地址与物理地址间建立一种映射关系。映射关系由操作系统建立,当程序访问虚拟地址空间上的某个地址值时,就相当于访问了物理地址空间中的另一个值。

这种映射机制需要硬件的支持——cpu中的内存管理单元。cpu拿到一个需要虚拟地址(virtual address,VA),经过内存管理单元(Menory Management Unit, MMU)结合利用存放在物理内存中的映射表(页表,由操作系统管理该表的内容)动态翻译,转换成物理内存地址,进而访问物理内存。这也叫做cpu的虚拟寻址方式。应用程序和许多系统进程都是使用虚拟寻址。只有操作系统内核的核心部分会使用cpu物理寻址,即地址翻译,直接使用实际的物理内存地址。

具体的映射方案后面介绍。


6.物理内存和硬盘之间的置换

当物理内存RAM不够使用的时候,操作系统会根据一些置换算法将内存中的数据置换到磁盘上的交换空间(swap),腾出空闲的物理内存页来存储需要在内存中运行的程序和相关数据。

前面文章说到任务管理器中的提交大小包含两部分,一部分是独占的理内存(即专用工作集内存),另一部分是分页文件中的独占内存映射。后者分页文件即是这里说的交换空间。

windows下分页文件叫,pagefile.sys,一般在硬盘的操作系统所在的分区中。

那么如何设置可以写入硬盘的内存大小呢——我的电脑 右键 选择【属性】,左侧栏里选择【高级系统设置】,然后点击如下图所示:正如解释的是,操作系统把这个分页文件当作RAM使用,即硬盘中的虚拟内存的概念


7.虚拟内存的重要性

1.每个进程使用的是一个一致的地址空间(从0到2^32-1),降低了程序员对内存管理的复杂性。让操作系统来完成虚拟地址空间到物理地址空间的转换。

2.每个进程有自己独立的虚拟地址空间,只能访问自己的地址空间,有效地做到进程之间的隔离,保证进程的地址空间不会被其他进程破坏。

3.提高物理内存的利用率。

发布了104 篇原创文章 · 获赞 44 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/u012138730/article/details/90273751
今日推荐