zoukankan      html  css  js  c++  java
  • 读书笔记——Windows核心编程(15)在应用程序中使用虚拟内存

    微软的Windows提供了三种机制对内存进行操控

    1 虚拟内存(最适合管理大型对象数组大型结构数组

    2 内存映射文件大型数据流/文件共享数据

    大量的小型对象


    预订地址空间区域VirtualAlloc

    PVOID VirtualAlloc(PVOID pvAddress,//内存地址,传NULL则由系统指定位置,必须始终位于进程的用户分区中,如果不是分配粒度的整数倍,则下去整到64K的整数倍。

                                      SIZE_T dwSize,//区域大小,系统始终分配页面大小的整数倍

                                      DWORD fdwAllocationType,//预订操作MEM_RESERVE,以及一些其他的标志。

                                      DWORD fdwProtect);//保护属性,当预订和调拨时的保护属性一致时,效率会更高。

    只预订区域是根本不会消耗物理存储器的。

    给区域调拨物理存储器VirtualAlloc

    PVOID VirtualAlloc(PVOID pvAddress,//内存地址。

                                      SIZE_T dwSize,//调拨的大小。无需一下子给整个区域都调拨物理存储器。

                                      DWORD fdwAllocationType,//调拨操作MEM_COMMIT,以及一些其他的标志。

                                      DWORD fdwProtect);

    同时预订和调拨物理存储器VirtualAlloc

    同时使用MEM_RESERVE|MEM_COMMIT

    撤销调拨物理存储器及释放区域VirtualFree

    BOOL VirtualFree(LPVOID pvAddress,

                                     SIZE_T dwSize,//释放时必须为0,系统可以知道大小的。撤销时为0,则全部撤销,系统会释放整个区域。

                                     DWORD fdwFreeType);//释放必须为MEM_RELEASE,撤销而不释放必须为MEM_DECOMMIT,撤销调拨也是基于页面粒度的

    改变保护属性VirtualProtect

    BOOL VirtualProtect(PVOID pvAddress,//必须位于进程的用户分区

                                         SIZE_T dwSize,

                                         DWORD flNewProtect,

                                         PDWORD pflOldProtect);//返回原来的保护属性,必须传有效地址给该参数。

    保护属性是与整个物理存储器页相关联的,我们不能给一个字节指定保护属性。

    如果有相邻的区域,又想改变跨区域连续页面的保护属性,那么必须调用VirtualProtect多次。

    重置物理存储器的内容VirtualAlloc

    使用MEM_RESET

    当调用VirtualAlloc时,基地址通常会被向下去整到页面大小的整数倍,而大小则会被向上取整到页面大小的整数倍。

    因此,如果传入的是MEM_RESET,则Virtualalloc会向相反的方向进行取整操作。

    要注意的是MEM_RESET只能单独使用,不能与其他标志位或操作。

  • 相关阅读:
    linux Linux下USB无线网卡WL167G、TLWN321G驱动安装过程详解
    linux CW_EPPC_8.8在linux下的安装和卸载
    linux Linux diff与patch的深入分析
    linux 嵌入式2.6.37wifivnt6656移植驱动
    linux 华为ET128 &中兴ZTE MU351移动TDSCDMA G3上网卡 .
    linux CW8.8 编译 提示缺少libstdc++.so.5的error
    linux codewarrior 8.8 for powerpc 在win7经常崩溃的解决方法
    linux ubuntu 安装smb共享文件夹
    [zt]c++builder调用VC的dll以及VC调用c++builder的dll
    电子认证服务管理办法
  • 原文地址:https://www.cnblogs.com/pangblog/p/3253754.html
Copyright © 2011-2022 走看看