以文件为后背存储区的内存交换文件

Asura 2018年05月04日 97次浏览

以文件为后背存储区的内存交换文件

各种后备存储器的内存映射文件

  • 磁盘中文件系统的具体文件为后备存储的页交换文件(文件映射)
  • 页交换文件("虚拟内存")为后备存储器的页交换文件(共享内存)

页交换文件(虚拟内存)

通过CreateFileMapping api 创建文件映射内核对象,在内存中申请空间(物理内存和虚拟内存)
通过MapViewOfFile 在响应的进程虚拟内存空间中预定对应空间,并且把上一步的内存映射到进程虚拟空间中。
这样就实现了共享内存

具体磁盘文件

CreateFileMapping 直接映射文件到进程虚拟空间中

映象类型的内存块和映射类型的内存块

映象类型的文件类型需要exe dll等文件
而映射类型则只要是打开的文件都可以。

操作文件需要用到的api

//创建或打开指定文件的文件映射对象
HANDLE CreateFile
(
  LPCTSTR lpFileName,        // 文件路径
  DWORD dwDesiredAccess,  // 访问权限
  DWORD dwShareMode,        // 共享模式
  LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD
  DWORD dwCreationDisposition,     // 创建/打开方式
  DWORD dwFlagsAndAttributes,      // 文件属性
  HANDLE hTemplateFile            // 模板相关
);
//创建或打开指定文件的文件映射对象
HANDLE CreateFileMapping
(
    HANDLE hFile,                           // 要映射的文件句柄    LPSECURITY_ATTRIBUTES lpAttributes, // 安全属性
    DWORD flProtect,                      // 保护属性
    DWORD dwMaximumSizeHigh, // 映射区域最大大小高32位
    DWORD dwMaximumSizeLow,  // 映射区域最大大小低32位     LPCTSTR lpName                      // 映射对象的名字
);
//创建映射
LPVOID MapViewOfFile
(
  HANDLE hFileMappingObject,// 文件映射对象句柄
  DWORD dwDesiredAccess,    // 访问的保护属性  DWORD dwFileOffsetHigh,      // 映射的内容在文件中的偏移
  DWORD dwFileOffsetLow,      // 映射的内容在文件中的偏移  类似于 offset
  SIZE_T dwNumberOfBytesToMap  // 映射的文件内容大小  类似于 limit
);