Windows 使用一种
分页请求虚拟内存系统,现在我们就来分析一下这种系统。
图 1. 进程地址空间中的虚拟页到物理页帧的映射
虚拟内存的概念在上个世纪五十年代就提出了,当时是作为解决不能一次装入实际内存的程序这一复杂问题的方案提出的。在虚拟内存系统中,程序可以访问超出可用物理内存的更大的地址集合,专用内存管理程序将这些逻辑地址映射到实际地址,使用磁盘上的临时存储保存超出的部分。
Windows 所使用的现代虚拟内存实现中,虚拟存储被组织成大小相同的单位,称为 页。每个操作系统进程占用自己的 虚拟地址空间,即一组可以读写的虚拟内存页。每个页可以有三种状态:
- 自由:还没有进程使用这部分地址空间。如果企图访问这部分空间,无论读写都会造成某种运行时失效。该操作将导致弹出一个 Windows 对话框,提示出现了访问冲突。(Java 程序不会造成这种错误,只有用支持指针的语言编写的程序才可能造成这种问题。)
- 保留:这部分地址空间保留给进程,以供将来使用,但是在交付之前,不能访问该地址空间。很多 Java 堆在一开始处于保留状态。
- 提交:程序可以访问的内存,得到了完全 支持,就是说已经在分页文件中分配了页帧。提交的页只有在第一次被引用时才装入主存,因此成为 请求式分页。
图 1 说明了进程地址空间中的虚拟页如何映射到内存中的物理页帧。
图 1. 进程地址空间中的虚拟页到物理页帧的映射
![内存组织](https://i-blog.csdnimg.cn/blog_migrate/521dd166ecc4cea23c60c2a844b04f30.png)
如果运行的是 32 位机器(如一般的 Intel 处理器),那么进程的整个虚拟地址空间就是 4GB,因为这是用 32 位所能寻址的最大地址空间。Windows 通常不会允许您访问地址空间中的所有这些内存,进程自己使用的只有不到一半,其他供 Windows 使用