试试渲染,最合适自己的讲解方式:流程中穿插概念。
程序运行需经由内存执行。所以讲讲windows内存体系结构。
windows内存体系结构由虚拟地址空间和内存两部分组成。
内存:
如果每个程序运行都直接占用内存,那你开一个冰封王座岂不是要占1G的内存?还能不能干别的了。虚拟地址空间的设计简直是神来之笔。
给每个进程分配一个4G(对32位系统来说)的虚拟地址空间。进程直接操作虚拟地址空间,读写数据时,才给它调拨物理存储器。
物理内存和虚拟内存关系:物理内存和虚拟内存对应。除OS外任何程序都不会直接访问物理内存而是访问虚拟内存。可把虚拟内存等同于物理内存。以后就只说内存,不再区分物理内存和虚拟内存。
页面文件和虚拟内存关系:可把虚拟内存等同于物理内存。改变页面文件大小可改变虚拟内存大小。详细来说:页面文件只是改变了物理内存的大小,当然也改变了虚拟内存的大小。(猜测:物理内存和虚拟内存的映射在大小上是1:1的。)可禁用页面文件但不能禁用虚拟内存。
虚拟地址空间和物理地址空间对应:虚拟地址空间指的是进程的可用地址空间范围。而物理地址空间指的是实际可用的内存空间范围。
虚拟地址空间:
虚拟地址空间也是分区的,并不是所有都可供用户使用。
系统创建进程并赋予它地址空间时,可用空间中的大部分都是闲置的或未分配的。要使用这部分地址空间,必须调用VirtualAlloc来分配其中的区域。分配区域的操作成为预订。预订地址空间时,系统会确保区域的起始地址正好是分配粒度的整数倍,区域大小正好是系统页面大小的整数倍。(分配粒度和系统页面大小据CPU不同而不同。)VirtualFree来释放分配的区域。
要使用所预定的地址空间,必须分配物理存储器,并将存储器映射到所预订的区域。此过程称为调拨物理存储器。物理存储器的调拨同预定区域一样,也是以页面为单位来进行。通过VirtualAlloc来调拨物理存储器,VirtualFree来释放物理存储器
页交换文件:
如今OS能把磁盘空间当内存使用,就是读写速度比较慢。磁盘上的文件一般称为页交换文件。把内存上的一部分保存到页交换文件中,并在应用程序需要时再将页交换文件中的对应部分载入内存。VirtualAlloc把物理存储器调拨给地址空间区域时,该空间实际上是从硬盘上的页交换文件分配的。
不在页交换文件中维护的物理存储器:
当执行一个程序时,系统会打开该程序对应的.exe文件并计算出应用程序的代码和数据的大小。然后系统会预订一块地址空间,并注明与该区域相关联的物理存储器就是.exe文件本身。系统并没有从页交换文件中分配空间,而是将.exe文件的实际内容(或叫文件映像)用作程序预订的地址空间区域。这样,不但载入程序快,而且页交换文件大小也合适。
当把一个程序位于硬盘上的文件映像(即一个.exe或DLL文件)用作地址空间区域对应的物理存储器时,称这个文件映像为内存映射文件。当载入一个.exe或DLL时,系统会自动预订地址空间区域并把文件映像映射到该区域,但系统也提供了一组函数,可让开发人员把数据文件映射到地址空间。
虚拟内存就是程序代码因不能直接访问物理内存而间接访问物理内存的机制。或者更具体点的这么说:虚拟内存技术说白了就是先给程序预订虚拟地址空间,再在需要时给虚拟地址空间调拨物理存储器,这样节省内存。
总汇:
参考文献:点击打开链接和点击打开链接