一、内存体系结构
windows 内存体系结构分为两部分:虚拟地址空间和物理存储器
虚拟地址空间:面向用户的指向某存储器的地址(X32 是4GB,X64是16EB);分为空指针区域(64KB)、用户指针区域(X32:2G;X64:8192G)、内核区域(操作系统代码驻留地,为所有进程共有)。
物理存储器:内存、页交换文件(使用起来像内存)、内存文件映射(将文件当做存储器)
二、预定地址空间
有两条规则:
1、起始地址需要是分配粒度(可能是64KB)的整数倍;
2、大小是系统页面的整数倍(X32 可能是4KB,X64可能是8KB);
注:都和CPU有关。
因此 数据要对齐,如果数据不对齐,要么CPU抛异常,要么CPU要访问错位内存。(CPU在访问内存时,内存被分为很多节点).
三、分配物理存储器
地址空间有四种状态:闲置(没有分配物理存储器)、私有(内存)、映像(文件)、已映射(或者是内存,或者是文件)
四、地址空间扩展
使用AWE调拨物理存储器,将多块内存映射到同一个地址空间中,不允许一块内存映射多个地址空间;特性如下:
1、操作系统保证不会将这种内存换出到磁盘。(减少页交换)
2、应用程序能访问比地址空间大得多的内存。(操控大块内存)
五、windows 内存结构应用
1、线程栈:当系统创建线程时,系统会在用户区域预定地址空间给线程。在debug中有/RTC编译器开关,对函数插入一些检查代码来检查栈溢出。release中有/GS开关来检查栈溢出。
2、内存映射文件:用于系统运行好载入.exe文件和动态链接库(DLL)文件,减少大量页交换及程序启动时间,或者用于读写文件来避免对文件进行缓存,或者不同进程共享数据。
3、堆:是系统预定的一块地址空间,始终以内存当做物理存储器的;分为进程默认堆和创建的额外的堆。