物理存储器 + 页交换文件 => 虚拟地址空间
映射
虚拟地址空间
n 定义:程序的内存地址空间。
n 大小:在x86中,大小为4GB;在x64中,大小为16EB。
n 使用原则:
1. 使用VirtualAlloc预定内存地址空间,使用VirtualFree释放地址空间区域。
2. 当应用程序预定地址空间时,系统会确保区域的起始地址正好的是分配粒度的整数倍。分配粒度因CPU平台不同而不同,一般大小为64KB。
3. 当应用程序预定地址空间的一块区域时,系统会确保区域大小正好是系统页面大小的整数倍。页面大小会因CPU平台不同而不同,x86和x64的页面大小为4KB,IA-64页面大小为8KB。
表格 1 进程地址空间划分
地址空间分区 | 作用 |
空指针赋值分区 | 帮助程序员捕获对空指针的赋值。没有任何办法使我们分配到这一区域的虚拟内存。每个进程有属于自己的专有的地址空间,当进程中的线程运行时,他们只能访问属于该进程的内存。 |
用户模式分区 | 进程地址空间的驻地。通常小于2GB在x86的机子上,可以通过/LARGEADDRESSAWARE的方式使用大于2GB的内存地址空间。 |
内核模式分区 | 操作系统代码的驻地。该分区的代码和数据都被完全保护起来。 |
64KB禁入分区 |
|
物理存储器
n 定义:物理内存。
n 使用规则:以页面为单位来预定。
页交换文件
n 定义:发挥内存作用的磁盘文件。其中包含虚拟内存,可供进程使用。
n 使用规则:
1. 页交换文件的使用不是必须的。
2. 系统中页交换文件的大小是决定应用程序可用内存总量的最重要因素,机器实际装备的内存总量对他的影响相对较小。
3. 系统需要在内存和页交换文件之间复制页面的频率越高,硬盘颠簸的越厉害,系统运行也越慢。
4. Windows可以使用多个页交换文件。如果多个页交换文件位于不同的物理硬盘上,那么系统可以运行得更快。
n 内存映射文件
1. 定义:
把一个程序位于硬盘上的文件映射用作地址空间区域对应的物理存储器时,我们称这个文件映射为内存映射文件。
2. 操作过程:
当用户要求执行一个应用程序时,系统会打开该应用程序对应的exe文件并计算出应用程序的代码和数据的大小。然后系统预定一块地址空间,并注明与该区域相关联的物理存储器就是exe或dll文件本身。
当载入一个exe或是dll时,系统会自动预定地址空间并把文件映像映射到该区域。数据文件也可以被映射到地址空间。
题外话:
CPU体系结构中的问题:数据对齐
n 定义:把数据的地址模除数据大小,如果结果为0,那么数据就是对齐的。
n 原因:
1. CPU发生异常。
2. CPU会通过多次访问已对齐的内存,来取得整个错位数据。
n 使用规则:
1. X86CPU会默认处理数据错位问题。
2. IA-64不能自动处理数据错位的问题。可以是使用SetErrorMode(…)函数来设置AC标志位而进一步使CPU处理数据错位。或使用_unaligned关键字来通知编译器数据未经对齐,编译器生成额外CPU指令已访问数据。
参考文档
《Windows核心编程(第5版)》 Jeffrey Richer