• 文件映射


    1. 文件映射

    内存映射文件,是由一个文件到一块内存的映射。Win32提供了允许应用程序把文件映射到一个进程的函数 (CreateFileMapping)。内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而且在对该文件进行操作之前必须首先对文件进行映射。使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行频繁读写操作,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。

    将文件映射到进程指定内存,对内存的操作,就是对文件的操作,

    从而避免频繁的进行读写的操作.

     使用:

       1. 打开文件 CreateFile

       2. 创建文件映射对象 CreateFileMapping

    HANDLE WINAPI CreateFileMapping(

    _In_HANDLE hFile, //Long,指定欲在其中创建映射的一个文件句柄

    _In_opt_LPSECURITY_ATTRIBUTES lpAttributes,

    它指明返回的句柄是否可以被子进程所继承 .NULL表示使用默认安全对象。

    _In_DWORD flProtect,      //打开方式  即权限

    _In_DWORD dwMaximumSizeHigh,   //文件映射的最大长度的高32位。

    _In_DWORD dwMaximumSizeLow, //文件映射的最大长度的低32位。

    如果高位和低位全为0就将整个文件大小映射进内存

    _In_opt_LPCTSTR lpName); //指定文件映射对象的名字。如存在这个名字的一个映射,函数就会打开它。用vbNullString可以创建一个无名的文件映射。

    返回值 Long,新建文件映射对象的句柄

    如果CreateFileMapping 最后一个参数写了可以通过

    OpenFileMapping打开一个现成的文件映射对象。

    HANDLE OpenFileMapping(

    DWORD dwDesiredAccess, // access mode 访问权限,可读可写

    BOOL bInheritHandle, // inherit flag 创建出来的子进程是否可以继承对象句柄

    LPCTSTR lpName // object name);   指定要打开的文件映射对象名称。

    2. 创建映射视图,把文件映射到内存  MapViewOfFile   

    MapViewOfFile是计算机函数,功能是将一个文件映射对象映射到当前应用程序的地址空间MapViewOfFileEx允许我们指定一个基本地址来进行映射

    相当于看报纸的放大镜  用来物理内存和内存的交互

    LPVOID WINAPI MapViewOfFile(
      __in HANDLE hFileMappingObject, //CreateFileMapping()返回的文件映像对象句柄。
      __in DWORD dwDesiredAccess映射对象的文件数据的访问方式
      __in DWORD dwFileOffsetHigh, 表示文件映射起始偏移的高32位.
      __in DWORD dwFileOffsetLow, 表示文件映射起始偏移的低32位.
      __in SIZE_T dwNumberOfBytesToMap 指定映射文件的字节数.
      );

    如果成功,则返回映射视图文件的开始地址值。

     系统内存分配粒度 -- 系统分配内存的最小单位

      粒度  == 最小单位

      //系统内存分配粒度

      SYSTEM_INFO si;

      GetSystemInfo(&si);

       

     清理:

       //1. 取消映射视图

      UnmapViewOfFile(pView);

      //2. 关闭映射对象

      CloseHandle(hFileMap);

      //3. 关闭文件

      CloseHandle(hFile);

    学如逆水行舟,不进则退。 博客园技术交流群 群 号:1073255314 (本群没人,刚刚建立 -_-!!! )
  • 相关阅读:
    用asp.net还原与恢复sqlserver数据库(转)
    子窗口和父窗口交互
    Oracle 数据库导入导出和windows环境下的oracle服务
    从...中检测到有潜在危险的 Request.Form 值的解决办法 和嵌入页面代码
    ccat – 使用语法突出显示输出内容
    如何在Linux中使用Shell脚本终止用户会话?
    如何在Rescue模式下配置网络和SSH登录
    Linux 是洗衣粉!关于Linux 的10个趣事
    讲述:一个月薪12000的北京程序员的真实生活
    Linux文件的颜色代码
  • 原文地址:https://www.cnblogs.com/Mj-NaijAm/p/13613519.html
Copyright © 2020-2023  润新知