windows内存相关知识点

一.Windows内存地址空间

程序中可以寻址的最大范围。对于程序的运行效率就更高。对于32位操作系统,地址空间范围为0-4G(2^32)

二 地址空间的划分

   2.1 用户地址空间

       0 - 2G(7FFFFFFF )存放用户的程序和数据。用户空间不能访问内核空间

                2.1.1 空指针区(NULL区,0-64K)系统将地址小于64K指针,都是空指针。为了帮助程序员掌握NULL指针的分配情况

                2.1.2 用户区

            2.1.3  64K禁入区(0x7FFEFFFF - 0x7F FFFFFF )隔离了用户和内核空间;防止用户程序跨越到内核空间中

            2.2 内核地址空间

        2G - 4G 存放内核的代码和数据,例如系统驱动。

        内核空间代码是可以访问用户空间。

         

三. Windows 内存

 

 3.1 区域

            区域就是连续的一块内存。区域的大小一般为64K或者64K倍数。每个区域都有自己的状态:

            1)空闲:没有被使用

            2)私有:被预定的区域

            3)映像:存放代码

            4)映射:存放数据

  3.2内存

       物理内存:系统可以使用的实际内存。CPU可以直接访问的内存。

   3.2.1虚拟内存

            将硬盘文件虚拟成内存使用。(pagefile.sys 文件)

            CPU如果要访问虚拟内存数据,必须将虚拟内存数据  放到物理内存内存页

            系统管理内存的最小单位。内存页大小为4K,每个内存页有自己的权限。

   3.2.2内存获取数据过程

    1.根据地址在物理内存中查找相应的位置。如果找到物理内存,取回数据。如果未找到,执行下一步

    2.根据地址去虚拟内存中查找相应的位置。如果未找到,那么该地址没有内存空间,返回错误。如果找到,执行下一步

    3 将该地址所在内存页,置换到物理内存中,同时将原物理内存数据,存入到虚拟内存中。然后将物理内存中的数据返回给使用者。           

四.内存信息结构体

  MEMORYSTATUS结构体用来存储虚拟内存的详细信息

  dwLength

  MEMORYSTATUS结构的大小,sizeof()函数求得,用来供函数检测结构的版本。

  dwMemoryLoad

  返回一个介于0~100之间的值,用来指示当前系统内存的使用率。

  dwTotalPhys

  返回总的物理内存大小,以字节(byte)为单位。

  dwAvailPhys

  返回可用的物理内存大小,以字节(byte)为单位。

  dwTotalPageFile

  显示可以存在页面文件中的字节数。

  注意这个数值并不表示在页面文件在磁盘上的真实物理大小。

  dwAvailPageFile

  返回可用的页面文件大小,以字节(byte)为单位。

  dwTotalVirtual

  返回调用进程的用户模式部分的全部可用虚拟地址空间,以字节(byte)为单位。

  dwAvailVirtual

  调用进程的用户模式部分的实际自由可用的虚拟地址空间,字节(byte)为单位。

  函数使用-----GlobalMemoryStatus(),用来获取内存信息

五.虚拟内存分配

  5.1虚拟内存分配

速度快,大内存效率高。将内存和地址分配分别执行

可以在需要的时候再提交内存。常用字大型电子表格等处理。

  5.2虚拟内存使用

            5.2.1 内存分配(申请地址/提交内存)

              LPVOID VirtualAlloc(

                        LPVOID lpAddress,// NULL或提交地址

                        SIZE_T dwSize, //分配的大小

                        DWORD flAllocationType, //分配方式

                        DWORD flProtect //内存访问方式 PAGE_READWRITE        );  分配成功返回地址

    5.2.2分配方式:

            MEM_COMMIT - 提交内存,分配之后返回地址和内存空间连

            MEM_RESERVE- (预约)保留地址,分配之后只返回地址,内存空间不生成。

                 要使用内存必须再次提交。只要 地址 不要 内存

   使用:直接按照内存处理方式。

   5.2.3 虚拟内存释放

     VirtualFree(

       LPVOID lpAddress,//释放地址

       SIZE_T dwSize,//释放大小

      DWORD dwFreeType//释放方式);

   5.2.4释放方式

   MEM_DECOMMIT - 只释放内存,不释放地址

            MEM_RELEASE - 连 地址 带 内存 都释放

六.堆内存

   程序会有默认堆内存,我们可以在内存地址空间创建额外的堆

   创建堆内存目的:默认堆堆数据进行混合存储,效率低下。

   申请可以更有效的使用内存,避免现充同步开销。快速释放

 6.1获取堆数据

   DWORD GetProcessHeaps(

     NumberOfHeaps, //堆数组大小

     PHANDLE ProcessHeaps //堆句柄

    );//返回堆个数

   GetProcessHeap()----获取程序所有的堆

 6.2创建堆

    HeapCreate(

      DWORD flOptions,//创建选项 0

      SIZE_T dwInitialSize,//初始化大小

      SIZE_T dwMaximumSize//最大值);成功返回堆句柄

    最大值:如果最大值是0.则堆是可以增长的,没有指定的上限.

 6.3堆内存分配

    LPVOID HeapAlloc(

       HANDLE hHeap,//堆句柄

       DWORD dwFlags,//分配方式

       SIZE_T dwBytes//分配大小);//返回申请的内存首地址

 6.4释放堆内存

    BOOL  HeapFree(

      HANDLE hHeap,//堆句柄

      DWORD dwFlags,//释放标志

      LPVOID lpMem//释放地址);

 6.5销毁堆

   BOOL HeapDestroy( HANDLE hHeap);

你可能感兴趣的:(win32)