进程间通讯总结 (2)

Using a File Mapping for IPC

Windows 下有很多方法实现进程间通讯, 比如用 socket,管道(Pipe), 信箱(Mailslot),等等。 但最基本最直接的还是使用内存共享。 其他方法最终还是会绕道这里

可想而知,如果物理内存只有一份,让这份内存在不同的进程中,映射到各自的虚拟地址空间上,每个进程都可以读取同一份数据,是一种最高效的数据交换方法

File mapping enables a process to treat the contents of a file as if they were a block of memory in the process's address space. The process can use simple pointer operations to examine and modify the contents of the file. When two or more processes access the same file mapping, each process receives a pointer to memory in its own address space that it can use to read or modify the contents of the file. The processes must use a synchronization object, such as a semaphore, to prevent data corruption in a multitasking environment.

KeyPoint:  File mapping is an efficient way for two or more processes on the same computer to share data, but you must provide synchronization between the processes. For more information, see File Mapping and Synchronization.

共享内存在 Windows 中是用 FileMapping实现的。我们可以用 CreateFileMapping 创建一个内存文件映射对象, CreateFileMapping 这个 API 将创建一个内核对象,用于映射文件到内存。

HANDLE WINAPICreateFileMapping(

  _In_        HANDLE                                     hFile,

  _In_opt_ LPSECURITY_ATTRIBUTES    lpAttributes,

  _In_        DWORD                                     flProtect,

  _In_        DWORD                                     dwMaximumSizeHigh,

  _In_        DWORD                                     dwMaximumSizeLow,

  _In_opt_ LPCTSTR                                  lpName

);

(https://msdn.microsoft.com/en-us/library/windows/desktop/aa366537(v=vs.85).aspx)

If hFile isINVALID_HANDLE_VALUE, the calling process must also specify a size for the file mapping object in thedwMaximumSizeHigh anddwMaximumSizeLow parameters. In this scenario,CreateFileMapping creates a file mapping object of a specified size that is backed by the system paging file instead of by a file in the file system.

有时,单纯为了共享内存,我们并不需要一个实际的文件,所以,就不需要调用 CreateFile 创建一个文件, hFile这个参数可以填写 INVALID_HANDLE_VALUE 。

Multiple processes can share a view of the same file by either using a single shared file mapping object or creating separate file mapping objects backed by the same file. A single file mapping object can be shared by multiple processes through inheriting the handle at process creation, duplicating the handle, or opening the file mapping object by name.

Creating a file mapping object does not actually map the view into a process address space. TheMapViewOfFile and MapViewOfFileEx functions map a view of a file into a process address space.

Mapping a file makes the specified portion of a file visible in the address space of the calling process.

LPVOID WINAPI MapViewOfFile(

  _In_ HANDLE hFileMappingObject,

  _In_ DWORD  dwDesiredAccess,

  _In_ DWORD  dwFileOffsetHigh,

  _In_ DWORD  dwFileOffsetLow,

  _In_ SIZE_T   dwNumberOfBytesToMap

);

Mapped views ofa file mapping object maintain internal references to the object, and a file mapping object does not close until all references to it are released.

The following illustration shows the relationship between the file on disk, a file mapping object, and a file view.

 

The file on disk can be any file that you want to map into memory, or it can be the system page file. The file mapping object can consist of all or only part of the file. It is backed by the file on disk. This means that when the system swaps out pages of the file mapping object, any changes made to the file mapping object are written to the file. When the pages of the file mapping object are swapped back in, they are restored from the file.

A file view can consist of all or only part of the file mapping object. A process manipulates the file through the file views. A process can create multiple views for a file mapping object. The file views created by each process reside in the virtual address space of that process. When the process needs data from a portion of the file other than what is in the current file view, it can unmap the current file view, then create a new file view.

When multiple processes use the same file mapping object to create views for a local file, the data is coherent. That is, the views contain identical copies of the file on disk. The file cannot reside on a remote computer if you want to share memory between multiple processes.

Note

Although CreateFileMapping works with remote files, it does not keep them coherent. For example, if two computers both map a file as writable, and both change the same page, each computer only sees its own writes to the page. When the data gets updated on the disk, it is not merged.

 

Using File Mapping

Code Example: Creating Named Shared Memory

https://msdn.microsoft.com/en-us/library/windows/desktop/aa366551(v=vs.85).aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值