Windows核心编程学习笔记--第13章
试试渲染,最合适自己的讲解方式:
程序运行需经由内存执行。所以讲讲windows内存体系结构。
第一层:windows内存体系结构由虚拟地址空间和内存两点部分组成。
第二层:由来。
虚拟地址空间的由来:
如果每个程序运行都直接占用内存,那你开一个冰封王座岂不是要占1G的内存?还能不能干别的了。虚拟地址空间的设计简直是神来之笔。

把内存的一小部分映射出来一个4G(对32位系统来说)的虚拟地址空间,每个进程都对应有一个虚拟地址空间。进程直接操作虚拟地址空间,虚拟地址空间与内存间如何映射由操作系统来管理,何时映射由程序控制。所以重点是如何操作虚拟地址空间及何时映射到内存。何时该映射呢,当然读写数据时候了。
虚拟地址空间也是分区的,并不是所有都可供用户使用。

第三层:具体分配
系统创建进程并赋予它地址空间时,可用空间中的大部分都是闲置的或未分配的。要使用这部分地址空间,必须调用VirtualAlloc来分配其中的区域。分配区域的操作成为预订。预订地址空间时,系统会确保区域的起始地址正好是分配粒度的整数倍,区域大小正好是系统页面大小的整数倍。(分配粒度和系统页面大小据CPU不同而不同。)VirtualFree来释放分配的区域。
要使用所预定的地址空间,必须分配物理存储器,并将存储器映射到所预订的区域。此过程称为调拨物理存储器。物理存储器的调拨同预定区域一样,也是以页面为单位来进行。通过VirtualAlloc来调拨物理存储器,VirtualFree来释放物理存储器
内存:
如今OS能把磁盘空间当内存使用,就是读写速度比较慢。磁盘上的文件一般称为页交换文件。VirtualAlloc把物理存储器调拨给地址空间区域时,该空间实际上是从硬盘上的页交换文件分配的。虚拟内存其实就是被用于内存的硬盘。
当执行一个程序时,系统会打开该程序对应的.exe文件并计算出应用程序的代码和数据的大小。然后系统会预订一块地址空间,并注明与该区域相关联的物理存储器就是.exe文件本身。系统并没有从页交换文件中分配空间,而是将.exe文件的实际内容(或叫文件映像)用作程序预订的地址空间区域。这样,不但载入程序快,而且页交换文件大小也合适。
由上可知,将页交换文件(默认仅C盘)置于不同硬盘上时,系统可运行的更快,因系统不用同时读写一个盘,而且若程序位于D盘,则可直接调拨物理存储器到D盘,不必调拨到C盘。
当把一个程序位于硬盘上的文件映像(即一个.exe或DLL文件)用作地址空间区域对应的物理存储器时,称这个文件映像为内存映射文件。
总汇:
