一 进程逻辑空间 物理空间

如上图所示,每个进程都有自己的逻辑空间,这些逻辑空间,会被映射到具体的物理空间中。

每个进程的逻辑空间都是彼此隔离,相互独立不受干扰的。

但是他们都会被映射到同一个物理空间去,当其所映射的物理空间有重叠的时,这重叠的部分就共享了物理内存

二 共享内存关键问题

创建物理内存

将物理内存映射到进程空间

读写互斥控制

1)创建物理内存,获得物理内存资源句柄

比如 由A进程 负责创建共享内存

A: 进程创建完物理内存后,直接返回物理内存句柄

 // 创建共享文件句柄  HANDLE hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, // 物理文件句柄 NULL, // 默认安全级别 PAGE_READWRITE, // 可读可写 0, // 高位文件大小 BUF_SIZE, // 地位文件大小 L"ShareMemory" // 共享内存名称 );

B:B进程通过共享内存的全局名字,来获得共享物理内存句柄

 // 打开共享的文件对象 HANDLE hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,NULL,L"ShareMemory");

2) 物理内存映射进程空间

各个进程都是通过这种方式, 将物理空间共享内存,映射到进程逻辑空间

 // 映射缓存区视图 , 得到指向共享内存的指针 LPVOID lpBase = MapViewOfFile( hMapFile, // 共享内存的句柄 FILE_MAP_ALL_ACCESS, // 可读写许可 0, 0, BUF_SIZE );

3) 释放

进程退出时,要解除映射

// 解除文件映射

UnmapViewOfFile(lpBase);

// 关闭内存映射文件对象句柄

CloseHandle(hMapFile);

4)互斥控制

采用互斥量或信号的机制

互斥量机制

进程A: 创建互斥量mutex while(1) { 申请mutex; 处理C; 释放mutex; 其他操作; }
进程B: while(1) { 申请mutex; 处理C; 释放mutex; 其他操作; }

示例:

进程A

#include #include using namespace std;  int main(){// 若不存在名为"pmutex"的互斥量则创建它;否则获取其句柄 HANDLE hMutex = CreateMutex(NULL, false, "pmutex"); if(NULL == hMutex) { cout<

进程B

#include #include using namespace std;  int main(){// 若不存在名为"pmutex"的互斥量则创建它;否则获取其句柄 HANDLE hMutex = CreateMutex(NULL, false, "pmutex"); if(NULL == hMutex) { cout<

信号量机制:

进程A : 执行 写操作

进程A 执行写操作//等待其他进程读操作完毕WaitForSingleObject(m_memMng.m_hReadEvent, INFINITE); //重置写操作信号量ResetEvent(m_memMng.m_hWriteEvent);//执行写操作memcpy//写操作完毕,恢复信号量,使得其它进程可读SetEvent(m_memMng.m_hWriteEvent);

进程B: 执行读操作

//进程B执行读操作//等待主进程写完毕WaitForSingleObject(m_memMng.m_hWriteEvent, INFINITE);//重置读信号量ResetEvent(m_memMng.m_hReadEvent);//读操作,将共享内存数据拷贝本地变量memcpy//读操作完毕,设置信号量信号SetEvent(m_memMng.m_hReadEvent);

三 封装

应该有的成员变量:

1)创建物理内存、映射进程空间 管理

HANDLE hMapping_; 物理空间资源句柄

MappedView View_; 物理映射成进程空间的操作

int size_; 物理空间大小

std::wstring name_; 共享内存名字

2) 信号量控制管理

HANDLE m_hReadEvent;

HANDLE m_hWriteEvent;

操作方法:

1)创建

bool CreateFileMap(); //创建

bool OpenFileMap(); //已存在,则打开

bool MapView(bool bCanWrite = true); //映射进程空间

2)映射管理类

class MappedView{public:MappedView() : view_(NULL) {}~MappedView() { CloseView(); }bool MapView(SharedMemory *shared_memory, bool can_write);//MapViewOfFilevoid CloseView();char *view() { return view_; }private: char *view_=nullptr;};

共享内存管理类

class SharedMemory{public:SharedMemory() : hMapping_(NULL) {size_ = 0;m_hReadEvent = NULL;m_hWriteEvent = NULL;}~SharedMemory() { Close();  if (m_hReadEvent) {CloseHandle(m_hReadEvent); }if (m_hWriteEvent)CloseHandle(m_hWriteEvent);};public://初始化bool InitReceiver(std::wstring name, std::wstring readName = L"ShareMemoryReadEvent

windows 映射文件会释放内存吗_Windows系统共享内存管理相关推荐

  1. Windows电脑清理Windows.edb文件,释放C盘空间

    Windows电脑清理Windows.edb文件,释放C盘空间 C:\ProgramData\Microsoft\Search\Data\Applications\Windows\Windows.ed ...

  2. 共享内存(一)—— 共享内存的创建与释放

    匿名管道和命名管道都是基于文件的进程间通信,SystemV方案是在OS层面专门为进程间通信设计的一个方案,然后通过系统调用(system call)给用户提供通信接口 SystemV方案包含三种:共享 ...

  3. SystemV 共享内存(一)—— 共享内存的创建与释放(shmget / shmctl)

    匿名管道和命名管道都是基于文件的进程间通信,SystemV方案是在OS内核层面专门为进程间通信设计的一个方案,然后通过系统调用(system call)给用户提供通信接口 SystemV方案包含三种: ...

  4. linux共享内存 dest,关于linux 共享内存查看已经完整释放

    完整删除共享内存脚本 #!/bin/sh function rmshm() { zero_status=`ipcs -m|awk '{print $6}'|grep -w 0|wc -l` if [ ...

  5. Linux无锁共享内存,优秀数据结构学习 - 共享内存无锁队列的实现(二)

    优秀数据结构学习 - 共享内存无锁队列的实现(二) 优秀数据结构学习 - 共享内存无锁队列的实现(二) 1 关键技术 操作系统提供的进程间通信机制有文件.socket.消息队列.管道.共享内存等.其中 ...

  6. 共享内存之——system V共享内存

    System V 的IPC对象有共享内存.消息队列.信号灯(量). 注意:在IPC的通信模式下,不管是共享内存.消息队列还是信号灯,每个IPC的对象都有唯一的名字,称为"键(key)&quo ...

  7. Linux c 基于内存的进程通信—共享内存、共享队列(消息队列)

    基于内存的进程通信: 1.      内核共享内存 编程模型:     1.1.创建共享内存,得到一个ID  shmget 1.2.把ID影射成虚拟地址(挂载)  shmat 1.3.使用虚拟地址访问 ...

  8. linux java 共享内存_Linux进程间通信之共享内存

    一,共享内存 内核管理一片物理内存,允许不同的进程同时映射,多个进程可以映射同一块内存,被多个进程同时映射的物理内存,即共享内存. 映射物理内存叫挂接,用完以后解除映射叫脱接. 1,共享内存的特点: ...

  9. Android6.0以上应用在长时间在后台,因为内存不足导致系统回收内存,当再次启动应用出现Fragment重叠或者空白、异常解决方案(提供模拟内存不足导致系统回收内存的方案)。

    Android6.0以上应用在长时间在后台,因为内存不足导致系统回收内存,当再次启动应用出现Fragment重叠或者空白解决方案. 首先提供一个方法模拟内存不足导致系统回收内存的方案: 打开Andro ...

最新文章

  1. 在IIS中使用Gzip压缩后传送数据
  2. 初探Spring MVC 请求处理流程
  3. ubuntu linux下面运行《暗黑破坏神2》和英雄无敌3-死亡阴影
  4. 前端学习(3299):自定义hook
  5. CentOS7安装MySQL,全网最快安装教程
  6. VMware 修复 Fusion 和 Horizon 中的两个提权漏洞
  7. jQuery ajax设置全局配置
  8. WAIT numslaves timeout
  9. iOS 10.1发现新漏洞:可绕过“激活锁”强行进入主屏
  10. 公式、图片、表格等转latex
  11. iCloud照片无法上传或同步怎么办?
  12. 三星ml1660拆机图解_三星s6拆机图解介绍
  13. 纯前端实现人体抠图背景融合-调用Face++抠像接口API实现人像抠图
  14. NOVA温控器参数笔记(十)(故障代码)
  15. 如何在供应链金融中防范风险?
  16. 红米5双清_小米红米5 plus(安卓8.0)刷官方中文Recovery教程,recovery工具分享,recovery下载...
  17. 怎么预防过敏性鼻炎呢?
  18. 【LeetCode系列】1185. 一周中的第几天
  19. 人工智能数学课高等数学线性微积分数学教程笔记(7. 最优化)
  20. VisionPro联合C#编程,康耐视cognex

热门文章

  1. Linux学习之如何在物理机上安装Linux发行版
  2. 位姿估计的来龙去脉——内外参,三维重建,Pnp问题
  3. XGBoost的安装与介绍
  4. Java加密与解密的艺术~数字签名~DSA实现
  5. Java并发编程实战~ThreadLocal
  6. MySQL中information_schema
  7. web.config 指定的默认页失效
  8. Object的方法equals,hashCode,toString,clone。另外Comparable接口的方法
  9. oracle 等待原因查找,oracle等待事件相关查询
  10. 上古卷轴5json文件修改_【白夜谈】我做了一款失败的《社长卷轴》Mod